home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
turbopas
/
spoc88.arc
/
DCG.ARC
/
PARSTREE.PRO
< prev
Wrap
Text File
|
1988-06-14
|
2KB
|
98 lines
/* Parse Tree example
Barbara Clinger, 1988
This program illustrates a parser for simple algebraic expressions,
(no exponentation, parentheses, or functions). It returns the parse
tree of the expression. The tree is built using the structure node,
which is essentially an operator or number with left and right
branches.
Sample input: 2 * 3 - 4 / 5 * 10 + 6
The output is a tree which represents the number (in functor form)
+( -( *(2,3), *( /(4,5), 10) ), 6 )
*/
domains
item = op(string) ; leaf(real)
node = branch(item,node,node) ; empty
toklist = string*
predicates
reader(string,toklist)
give_result(node,toklist,toklist)
append(toklist,toklist,toklist)
do
/* the grammar */
expr(node,toklist,toklist)
term(node,toklist,toklist)
number(node,toklist,toklist)
goal
do.
clauses
do :-
nl,write("Enter an expression --> "),
readln(String),nl,nl,
reader(String,List_in),
expr(Tree,List_in,Rest),
give_result(Tree,List_in,Rest).
give_result(N,_,T) :-
T = [],
write("The structure of the expression is:"),nl,nl,
write(N),nl.
give_result(_,_,_) :-
write("Cannot evaluate the expression."),nl.
reader("",[]) :- !.
reader(Str,[Tok|Rest]) :-
fronttoken(Str,Tok,Str1),
reader(Str1,Rest),!.
/* expansion of:
expr --> expr, [+], term
expr --> expr, [-], term
expr --> term
*/
expr(branch(op("+"),L_node,R_node),L1,L2) :-
append(Left,["+"|Right],L1),
expr(L_node,Left,L2),
term(R_node,Right,L2).
expr(branch(op("-"),L_node,R_node),L1,L2) :-
append(Left,["-"|Right],L1),
expr(L_node,Left,L2),
term(R_node,Right,L2).
expr(X,L1,L2) :- term(X,L1,L2).
/* expansion of:
term --> term, [*], number
term --> term, [/], number
term --> number
*/
term(branch(op("*"),L_node,R_node),L1,L2) :-
append(Left,["*"|Right],L1),
term(L_node,Left,L2),
number(R_node,Right,L2).
term(branch(op("/"),L_node,R_node),L1,L2) :-
append(Left,["/"|Right],L1),
term(L_node,Left,L2),
number(R_node,Right,L2).
term(X,L1,L2) :- number(X,L1,L2).
/* expansion of:
number --> [+], number
number --> [-], number
number --> [N]
*/
number(X,["+"|T],L2) :-
number(X,T,L2).
number(X,["-"|T],L2) :-
number(branch(leaf(W),empty,empty),T,L2),
Z = -W,
X = branch(leaf(Z),empty,empty).
number(branch(leaf(X),empty,empty),[H|T],T) :-
str_real(H,X).
append([],List,List).
append([H|T],L,[H|T2]) :-
append(T,L,T2).