61{
65
66 const std::string rpn_program =
67 " var stack[1000] := [0]; "
68 " var stack_size := 0; "
69 " "
70 " for (var i := 0; i < rpn_expression[]; i += 1) "
71 " { "
72 " var c := rpn_expression[i : i + 1]; "
73 " "
74 " if (c == ' ') "
75 " { "
76 " continue; "
77 " } "
78 " else if (is_digit(c)) "
79 " { "
80 " stack[stack_size] := to_num(c); "
81 " stack_size += 1; "
82 " } "
83 " else "
84 " { "
85 " var operator := c; "
86 " var operand1 := stack[stack_size - 2]; "
87 " var operand2 := stack[stack_size - 1]; "
88 " stack_size -= 2; "
89 " "
90 " switch "
91 " { "
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; "
97 " }; "
98 " "
99 " stack_size += 1; "
100 " } "
101 " }; "
102 " "
103 " println(stack[0], ' = ', rpn_expression); "
104 " ";
105
106 std::string rpn_expression;
107
111
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 );
117
118 expression_t expression;
119 expression.register_symbol_table(symbol_table);
120
121 parser_t parser;
122 parser.compile(rpn_program, expression);
123
124 const std::string rpn_expressions[] =
125 {
126 "2 3 8 / ^ 4 6 * + 3 9 / -",
127 "1 2 / 6 5 2 - / * 7 +" ,
128 "1 2 * 3 / 4 * 5 / 6 *" ,
129 "8 6 4 + * 2 /"
130 };
131
132 for (std::size_t i = 0; i < sizeof(rpn_expressions) / sizeof(std::string); ++i)
133 {
134 rpn_expression = rpn_expressions[i];
135 expression.value();
136 }
137}