39 lines
1 KiB
Text
39 lines
1 KiB
Text
estack = [];
|
|
|
|
epush(x) = {
|
|
estack = vector(#estack + 1, i, if(i <= #estack, estack[i], x));
|
|
return(#estack);
|
|
};
|
|
|
|
epop() = {
|
|
local(val = estack[#estack]);
|
|
estack = vector(#estack - 1, i, estack[i]);
|
|
return(val);
|
|
};
|
|
|
|
registerRPNToken(t) = {
|
|
local(o1, o2);
|
|
|
|
if(type(t) == "t_STR",
|
|
if(t == "+", o2 = epop(); o1 = epop(); epush(o1 + o2),
|
|
if(t == "-", o2 = epop(); o1 = epop(); epush(o1 - o2),
|
|
if(t == "*", o2 = epop(); o1 = epop(); epush(o1 * o2),
|
|
if(t == "/", o2 = epop(); o1 = epop(); epush(o1 / o2),
|
|
if(t == "%", o2 = epop(); o1 = epop(); epush(o1 % o2),
|
|
if(t == "^", o2 = epop(); o1 = epop(); epush(o1 ^ o2)
|
|
)))))),
|
|
if(type(t) == "t_INT" || type(t) == "t_REAL" || type(t) == "t_FRAC",
|
|
epush(t))
|
|
);
|
|
print(estack);
|
|
};
|
|
|
|
parseRPN(s) = {
|
|
estack = [];
|
|
for(i = 1, #s, registerRPNToken(s[i]));
|
|
|
|
if(#estack > 1, error("Malformed postfix expression."));
|
|
return(estack[1]);
|
|
};
|
|
|
|
parseRPN([3, 4, 2, "*", 1, 5, "-", 2, 3, "^", "^", "/", "+"]); \\ Our input expression
|