RosettaCodeData/Task/Parsing-RPN-calculator-algorithm/PARI-GP/parsing-rpn-calculator-algorithm-1.pari
2018-06-22 20:57:24 +00:00

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