Ejemplo n.º 1
0
Result Calculator::run(Expression expr)
{
    auto rpn = _parser.toRPN(expr);
    RPNStack calcStack;

    while (!rpn.empty()) {
        auto element = rpn.top();
        if (!_parser.isOperator(element)) {
            calcStack.push(element);
            rpn.pop();
            continue;
        }
        auto rhs = BigInteger(calcStack.top());
        calcStack.pop();
        auto lhs = BigInteger(calcStack.top());
        calcStack.pop();

        BigInteger result;

        if (element == "*") {
            result = lhs * rhs;
        } else if (element == "+") {
            result = lhs + rhs;
        } else if (element == "-") {
            result = lhs - rhs;
        }

        calcStack.push(result.value());
        rpn.pop();
    }

    return calcStack.top();
}
Ejemplo n.º 2
0
void RPNFunction::evaluate(RPNScript & scr, RPNStack & st) const
{
	RPNConst * res = evaluateFun(st);
	if (res != 0)
		st.push(res);
	scr.nextCmd();
}
Ejemplo n.º 3
0
void RPNConst::evaluate(RPNScript & scr, RPNStack & st) const
{
	st.push(clone());
	scr.nextCmd();
}