66 const std::string rpn_program =
67 " var stack[1000] := [0]; "
68 " var stack_size := 0; "
70 " for (var i := 0; i < rpn_expression[]; i += 1) "
72 " var c := rpn_expression[i : i + 1]; "
78 " else if (is_digit(c)) "
80 " stack[stack_size] := to_num(c); "
85 " var operator := c; "
86 " var operand1 := stack[stack_size - 2]; "
87 " var operand2 := stack[stack_size - 1]; "
92 " case operator == '+' : stack[stack_size] := operand1 + operand2; "
93 " case operator == '-' : stack[stack_size] := operand1 - operand2; "
94 " case operator == '*' : stack[stack_size] := operand1 * operand2; "
95 " case operator == '/' : stack[stack_size] := operand1 / operand2; "
96 " case operator == '^' : stack[stack_size] := operand1 ^ operand2; "
103 " println(stack[0], ' = ', rpn_expression); "
106 std::string rpn_expression;
112 symbol_table_t symbol_table;
113 symbol_table.add_stringvar(
"rpn_expression", rpn_expression);
114 symbol_table.add_function (
"println" , println );
115 symbol_table.add_function (
"is_digit" , isdigit );
116 symbol_table.add_function (
"to_num" , tonum );
118 expression_t expression;
119 expression.register_symbol_table(symbol_table);
122 parser.compile(rpn_program, expression);
124 const std::string rpn_expressions[] =
126 "2 3 8 / ^ 4 6 * + 3 9 / -",
127 "1 2 / 6 5 2 - / * 7 +" ,
128 "1 2 * 3 / 4 * 5 / 6 *" ,
132 for (std::size_t i = 0; i <
sizeof(rpn_expressions) /
sizeof(std::string); ++i)
134 rpn_expression = rpn_expressions[i];