%	Generate machine code for an arithmetic expression

translate(X + Y, expr(add, X1, Y1)) :-
	!,
	translate(X, X1),
	translate(Y, Y1).
translate(X / Y, expr(div, X1, Y1)) :-
	!,
	translate(X, X1),
	translate(Y, Y1).
translate(X - Y, expr(sub, X1, Y1)) :-
	!,
	translate(X, X1),
	translate(Y, Y1).
translate(X * Y, expr(mul, X1, Y1)) :-
	!,
	translate(X, X1),
	translate(Y, Y1).
translate(X, const(X)).

encode(const(C), N) :-
	!,
	instr(ld, C).
encode(expr(Op, Expr1, const(C)), N) :-
	!,
	encode(Expr1, N),
	instr(Op, C).
encode(expr(Op, Expr1, Expr2), N) :-
	encode(Expr2, N),
	instr(store, sp(N)),
	N1 is N - 1,
	encode(Expr1, N1),
	instr(Op, sp(N)).

instr(Op, Arg) :- print(Op, "\t", Arg).

comp(X) :- 
	translate(X, Y),
	encode(Y, 0), !.

comp((4*(3-6))/(12-4)/(14+16))!
