

plus(R) --> exp(A), plusc(A,R).

plusc(Acc,Res) --> "+",!, exp(B), plusc(plus(Acc,B),Res).
   /* left associative: B associates to + on left */
plusc(A,A) --> [].

exp(R) --> num(A), expc(A,R).

expc(Acc,exp(Acc,R2)) --> "**",!, exp(R2). /* right associative */
expc(A,A) --> [].

num(X) --> "(",!,plus(X), ")".
num(id(x)) --> "x".
num(id(y)) --> "y".
num(id(z)) --> "z".


parse(S,T) :- plus(T,S,[]).

test(T) :- parse("x+y**z**x+x**(z+x)",T).
test2(T) :- parse("x+y**z",T).

plotty_entry :- test2(T).
