C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
Classes | Functions
exprtk_simple_example_24.cpp File Reference
#include <cstdio>
#include <string>
#include "exprtk.hpp"
Include dependency graph for exprtk_simple_example_24.cpp:

Go to the source code of this file.

Classes

struct  char_process< T, Process >
 

Functions

template<typename T >
is_digit_func (const unsigned char c)
 
template<typename T >
to_num_func (const unsigned char c)
 
template<typename T >
void rpn_example ()
 
int main ()
 

Function Documentation

◆ is_digit_func()

template<typename T >
T is_digit_func ( const unsigned char  c)

Definition at line 48 of file exprtk_simple_example_24.cpp.

49{
50 return (('0' <= c) && (c <= '9')) ? T(1) : T(0);
51}

◆ main()

int main ( )

Definition at line 139 of file exprtk_simple_example_24.cpp.

140{
141 rpn_example<double>();
142 return 0;
143}

◆ rpn_example()

template<typename T >
void rpn_example ( )

Definition at line 60 of file exprtk_simple_example_24.cpp.

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
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 / -", // 2 ^ (3 / 8) + 4 * 6 - 3 / 9
127 "1 2 / 6 5 2 - / * 7 +" , // (1 / 2) * (6 / (5 - 2)) + 7
128 "1 2 * 3 / 4 * 5 / 6 *" , // ((((1 * 2) / 3) * 4) / 5) * 6
129 "8 6 4 + * 2 /" // (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}

◆ to_num_func()

template<typename T >
T to_num_func ( const unsigned char  c)

Definition at line 54 of file exprtk_simple_example_24.cpp.

55{
56 return static_cast<T>(c - '0');
57}