Task

Create a stack-based evaluator for an expression in   reverse Polish notation (RPN)   that also shows the changes in the stack as each individual token is processed as a table.



 Assume an input of a correct, space separated, string of tokens of an RPN expression
 Test with the RPN expression generated from the   Parsing/Shunting-yard algorithm   task: 

         3 4 2 * 1 5 - 2 3 ^ ^ / + 

 Print or display the output here


Notes

    ^    means exponentiation in the expression above.
    /    means division.


See also

   Parsing/Shunting-yard algorithm for a method of generating an RPN from an infix expression.
   Several solutions to 24 game/Solve make use of RPN evaluators (although tracing how they work is not a part of that task).
   Parsing/RPN to infix conversion.
   Arithmetic evaluation.


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