-module(prog).
-export([main/0, eval4th/2, tokenize/1]).
tokenize(S) ->
[(fun(T) ->
{error, _} ->
{error, _} -> T;
{Int, _} -> Int
end;
{Float, _} -> Float
end
end)(E) || E <- string:
tokens(S, " ")].
eval4th(Que, []) -> Que;
eval4th(Que, [H|T]) ->
Q = case H of
"+" -> ope2items(Que, fun(A, B) -> A + B end);
"-" -> ope2items(Que, fun(A, B) -> A - B end);
"*" -> ope2items(Que, fun(A, B) -> A * B end);
"/" -> ope2items(Que, fun(A, B) -> A / B end);
"." -> {A, Q0} = pop1item(Que), io:
format("~p~n", [A]), Q0; N when is_number(N) -> queue:
in_r(N, Que); _ -> io:
format("*** unexpected token [~p] ***~n", [H]), throw({exit, Que}) end,
eval4th(Q, T).
ope2items(Que, Ope) ->
{B, A, Q} = pop2items(Que),
queue:
in_r(Ope(A, B), Q).
pop2items(Que) ->
{{value, B}, Q1} ->
{{value, A}, Q2} -> {B, A, Q2};
{empty
, _Q2} -> io:
format("** empty second **~n", []), throw({exit, Que}) end;
{empty
, _Q1} -> io:
format("** empty first **~n", []), throw({exit, Que}) end.
pop1item(Que) ->
{{value, A}, Q} -> {A, Q};
{empty
, _Q} -> io:
format("** empty top **~n", []), throw({exit, Que}) end.
main() ->
eval4th(queue:
new(), tokenize("3 2 1 + * 1 - 4 / .")).
LW1vZHVsZShwcm9nKS4KLWV4cG9ydChbbWFpbi8wLCBldmFsNHRoLzIsIHRva2VuaXplLzFdKS4KCnRva2VuaXplKFMpIC0+CiAgWyhmdW4oVCkgLT4KICAgIGNhc2Ugc3RyaW5nOnRvX2Zsb2F0KFQpIG9mCiAgICB7ZXJyb3IsIF99IC0+CiAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoVCkgb2YKICAgICAge2Vycm9yLCBffSAtPiBUOwogICAgICB7SW50LCBffSAtPiBJbnQKICAgICAgZW5kOwogICAge0Zsb2F0LCBffSAtPiBGbG9hdAogICAgZW5kCiAgZW5kKShFKSB8fCBFIDwtIHN0cmluZzp0b2tlbnMoUywgIiAiKV0uCgpldmFsNHRoKFF1ZSwgW10pIC0+IFF1ZTsKZXZhbDR0aChRdWUsIFtIfFRdKSAtPgogIFEgPSBjYXNlIEggb2YKICAiKyIgLT4gb3BlMml0ZW1zKFF1ZSwgZnVuKEEsIEIpIC0+IEEgKyBCIGVuZCk7CiAgIi0iIC0+IG9wZTJpdGVtcyhRdWUsIGZ1bihBLCBCKSAtPiBBIC0gQiBlbmQpOwogICIqIiAtPiBvcGUyaXRlbXMoUXVlLCBmdW4oQSwgQikgLT4gQSAqIEIgZW5kKTsKICAiLyIgLT4gb3BlMml0ZW1zKFF1ZSwgZnVuKEEsIEIpIC0+IEEgLyBCIGVuZCk7CiAgIi4iIC0+IHtBLCBRMH0gPSBwb3AxaXRlbShRdWUpLCBpbzpmb3JtYXQoIn5wfm4iLCBbQV0pLCBRMDsKICBOIHdoZW4gaXNfbnVtYmVyKE4pIC0+IHF1ZXVlOmluX3IoTiwgUXVlKTsKICBfIC0+IGlvOmZvcm1hdCgiKioqIHVuZXhwZWN0ZWQgdG9rZW4gW35wXSAqKip+biIsIFtIXSksIHRocm93KHtleGl0LCBRdWV9KQogIGVuZCwKICBldmFsNHRoKFEsIFQpLgoKb3BlMml0ZW1zKFF1ZSwgT3BlKSAtPgogIHtCLCBBLCBRfSA9IHBvcDJpdGVtcyhRdWUpLAogIHF1ZXVlOmluX3IoT3BlKEEsIEIpLCBRKS4KCnBvcDJpdGVtcyhRdWUpIC0+CiAgY2FzZSBxdWV1ZTpvdXQoUXVlKSBvZgogIHt7dmFsdWUsIEJ9LCBRMX0gLT4KICAgIGNhc2UgcXVldWU6b3V0KFExKSBvZgogICAge3t2YWx1ZSwgQX0sIFEyfSAtPiB7QiwgQSwgUTJ9OwogICAge2VtcHR5LCBfUTJ9IC0+IGlvOmZvcm1hdCgiKiogZW1wdHkgc2Vjb25kICoqfm4iLCBbXSksIHRocm93KHtleGl0LCBRdWV9KQogICAgZW5kOwogIHtlbXB0eSwgX1ExfSAtPiBpbzpmb3JtYXQoIioqIGVtcHR5IGZpcnN0ICoqfm4iLCBbXSksIHRocm93KHtleGl0LCBRdWV9KQogIGVuZC4KCnBvcDFpdGVtKFF1ZSkgLT4KICBjYXNlIHF1ZXVlOm91dChRdWUpIG9mCiAge3t2YWx1ZSwgQX0sIFF9IC0+IHtBLCBRfTsKICB7ZW1wdHksIF9RfSAtPiBpbzpmb3JtYXQoIioqIGVtcHR5IHRvcCAqKn5uIiwgW10pLCB0aHJvdyh7ZXhpdCwgUXVlfSkKICBlbmQuCgptYWluKCkgLT4KICBldmFsNHRoKHF1ZXVlOm5ldygpLCB0b2tlbml6ZSgiMyAyIDEgKyAqIDEgLSA0IC8gLiIpKS4=