| 58 | |
| 59 | template <typename T> |
| 60 | void rpn_example() |
| 61 | { |
| 62 | typedef exprtk::symbol_table<T> symbol_table_t; |
| 63 | typedef exprtk::expression<T> expression_t; |
| 64 | typedef exprtk::parser<T> parser_t; |
| 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 | |
| 108 | char_process<T,is_digit_func<T>> isdigit; |
| 109 | char_process<T,to_num_func<T>> tonum; |
| 110 | exprtk::rtl::io::println<T> println; |
| 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 | |