Немного грустно, что вы пока не показали свои попытки.
В любом случае. Обычно, имея дело с такими проблемами, вы мыслите с точки зрения рекурсии. И сопоставление с образцом - хороший способ проанализировать выражение.
Например, если вы способны оценить int(4)
, тогда совершенно очевидно, как вычислять add(int(4) int(4))
с помощью простой рекурсии:
declare
proc {Eval Exp Res}
case Exp
of int(N) then Res = N
[] add(X Y) then
local R1 R2 in
{Eval X R1}
{Eval Y R2}
Res = R1 + R2
end
end
end
Теперь вы можете расширить его с помощью mul
или любого другого выражения.