/* A converter which translates infix expressions into postfix.
    E -> T | E + T | E - T
    T -> F | T * F | T / F
    F -> number | ( E )
*/

:-table e/3, t/3.

e(V) --> t(V).
e(V) --> e(V1), ['+'], t(V2), {append(V1,V2,V12),append(V12,['+'],V)}.
e(V) --> e(V1), ['-'], t(V2),{append(V1,V2,V12),append(V12,['-'],V)}.

t(V) --> f(V).
t(V) --> t(V1), ['*'], f(V2), {append(V1,V2,V12),append(V12,['*'],V)}.
t(V) --> t(V1), ['/'], f(V2), {append(V1,V2,V12),append(V12,['/'],V)}.

f([X]) --> [X], {number(X)}.
f(V) --> ['('],  e(V), [')'].

