See here another diagram using DCG and a (kind of) lazy rating:
/* File: dcg_calculator.pl Author: Carlo,,, Created: Aug 16 2011 Purpose: associativity and precedences in calculator */ :- module(dcg_calculator, [dcg_calculator/2, expr//1]). %- [library(http/dcg_basics)]. obsolete :- [library(dcg/basics)]. /* usage ?- dcg_calculator("1+(-2-2)",S),V is S. S = 1+ (-2-2), V = -3 ; false. */ dcg_calculator(Formula, IsEvaluable) :- phrase(expr(IsEvaluable), Formula, []). expr(Evaluable) --> sum(Evaluable). sum(S) --> product(P), sum_1(P, S). sum_1(L, S) --> "+", product(P), sum_1(L + P, S); "-", product(P), sum_1(L - P, S); {L = S}. product(P) --> value(V), product_1(V, P). product_1(V, P) --> "*", value(U), product_1(V * U, P); "/", value(U), product_1(V / U, P); {V = P}. % value(V) --> % {var(V)} -> {V=0 /* between(0, 9, V)*/ }, "0". value(V) --> "(", expr(V), ")" ; number(V).
Using grammars to model data structures is a very useful method in Prolog. The grammar used the implementation of PEG . Dependence on SWI-Prolog is very limited, just the number // 1.
Capellic
source share