1 #ifndef _MathExpression 2 #define _MathExpression 4 #include <boost/config/warning_disable.hpp> 5 #include <boost/spirit/include/qi.hpp> 6 #include <boost/spirit/include/lex_lexertl.hpp> 7 #include <boost/spirit/include/phoenix_operator.hpp> 8 #include <boost/spirit/include/phoenix_core.hpp> 9 #include <boost/spirit/include/phoenix_fusion.hpp> 10 #include <boost/spirit/include/phoenix_stl.hpp> 11 #include <boost/fusion/include/adapt_struct.hpp> 12 #include <boost/bind/bind.hpp> 22 using boost::phoenix::val;
25 typedef lex::lexertl::token<base_iterator_type, boost::mpl::vector<int,double,std::string> >
lex_token_type;
33 std::cout << item <<
" Enter->";
60 typedef boost::variant<struct funcTable,int,double, std::string>
operand_type;
64 template <
typename Lexer>
69 item =
"[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z0-9_]+)*";
70 func =
"[a-zA-Z_][a-zA-Z0-9_]*\\(";
71 regvar =
"\\$[a-zA-Z_][a-zA-Z0-9_]*";
72 constant_float =
"[0-9]*\\.[0-9]*([eE][-\\+]?[0-9]+)?";
73 constant_int =
"[0-9]+";
92 this->
self = mul | div | exp | minus | plus | lif;
93 this->
self += func | item | constant_int | constant_float | regvar ;
94 this->
self += lbr | rbr | comma | lthen ;
95 this->
self += leq | lnot | lt | gt | land | lor;
100 this->
self(
"WS") = ws;
103 lex::token_def<lex::omit>
ws;
104 lex::token_def<std::string> item , func,
regvar;
105 lex::token_def<>plus,minus,div,exp,mul,lbr,
rbr,comma;
106 lex::token_def<>land,lor,lnot,leq,gt,lt,lif,
lthen;
112 template <
typename Iterator,
typename Skipper>
115 template <
typename TokenDef>
119 using boost::phoenix::ref;
120 using boost::phoenix::push_back;
121 using boost::spirit::qi::_1;
129 term >> *(term_minus | term_plus);
131 factor_expression = tok.lbr >> expressionA >> tok.rbr;
133 term_minus = tok.minus >> term
138 term_plus = tok.plus >> term
145 term = factor_p_m >> *(factor_mul | factor_div);
147 factor_mul = tok.mul >> factor_exp
152 factor_div = tok.div >> factor_exp
157 factor_exp = factor_p_m >> *(factor_exp2 );
159 factor_exp2 = tok.exp >> factor_p_m
164 factor = factor_expression | factor_int | factor_float | factor_func | factor_item | factor_regvar;
166 factor_p_m = factor_minus | factor_plus | factor;
168 factor_int = tok.constant_int
170 push_back(boost::phoenix::ref(opts), _1)
172 factor_float = tok.constant_float
174 push_back(boost::phoenix::ref(opts), _1)
177 factor_func = tok.func [_a = _1] >> factor_arg
182 factor_arg = (expressionA % tok.comma ) >> tok.rbr;
184 factor_item = tok.item
186 push_back(boost::phoenix::ref(opts), _1)
191 factor_minus = tok.minus >> factor
196 factor_plus = tok.plus >> factor ;
198 factor_regvar = tok.regvar
200 push_back(boost::phoenix::ref(opts), _1)
204 expressionL = lterm >> *(logic_or);
206 lfactor_expression = tok.lbr >> expressionL >> tok.rbr;
208 lterm = lfactor >> *(logic_and);
210 logic_or = tok.lor >> tok.lor >> lterm
215 logic_and = tok.land >> tok.land >> lfactor
222 lfactor = logic_exp | lfactor_expression | lfactor2;
224 logic_exp = tok.lnot >> lfactor
230 lfactor2 = expressionA >> -(ltermlt | ltermgt | ltermle | ltermge | ltermlne | ltermleq) ;
232 ltermleq = tok.leq >> expressionA
236 ltermge = tok.gt >> tok.leq >> expressionA
241 ltermlne = tok.lnot >> tok.leq >> expressionA
246 ltermgt = tok.gt >> expressionA
251 ltermlt = tok.lt >> expressionA
256 ltermle = tok.lt >> tok.leq >> expressionA
264 #ifdef BOOST_SPIRIT_DEBUG 266 expressionL.name(
"expressionL");
267 qi::debug(expressionL);
268 expressionA.name(
"expressionA");
269 qi::debug(expressionA);
272 term_minus.name(
"term_minus");
273 qi::debug(term_minus);
274 term_plus.name(
"term_plus");
275 qi::debug(term_plus);
278 lfactor.name(
"lfactor");
280 logic_or.name(
"logic_or");
282 logic_and.name(
"logic_and");
283 qi::debug(logic_and);
284 ltermge.name(
"ltermge");
286 ltermgt.name(
"ltermgt");
288 ltermlt.name(
"ltermlt");
290 ltermle.name(
"ltermle");
292 ltermlne.name(
"ltermlne");
294 ltermleq.name(
"ltermleq");
296 lfactor_expression.name(
"lfactor_expression");
297 qi::debug(lfactor_expression);
298 factor.name(
"factor");
300 factor_p_m.name(
"factor_p_m");
301 qi::debug(factor_p_m);
302 factor_div.name(
"factor_div");
303 qi::debug(factor_div);
304 factor_mul.name(
"factor_mul");
305 qi::debug(factor_mul);
306 factor_exp.name(
"factor_exp");
307 qi::debug(factor_exp);
308 factor_exp2.name(
"factor_exp");
309 qi::debug(factor_exp2);
310 factor_item.name(
"factor_item");
311 qi::debug(factor_item);
312 factor_minus.name(
"factor_minus");
313 qi::debug(factor_minus);
314 factor_plus.name(
"factor_plus");
315 qi::debug(factor_plus);
316 factor_int.name(
"factor_int");
317 qi::debug(factor_int);
318 factor_float.name(
"factor_float");
319 qi::debug(factor_float);
320 factor_arg.name(
"factor_arg");
321 qi::debug(factor_arg);
322 factor_func.name(
"factor_func");
323 qi::debug(factor_func);
324 factor_regvar.name(
"factor_regvar");
325 qi::debug(factor_regvar);
334 qi::rule< Iterator,Skipper > term,factor_exp,factor_exp2,factor_mul,factor_div, term_minus,
term_plus,factor_regvar,factor_p_m;
335 qi::rule< Iterator,Skipper > factor_int,factor_float,factor_item, factor_minus,factor_expression,
factor_plus,factor_arg;
336 qi::rule< Iterator, Skipper > logic_or, logic_and, lfactor, ltermgt,
ltermlt, lterm, ltermge, ltermle, ltermleq, ltermlne, lfactor_expression;
338 qi::rule< Iterator,Skipper > expressionL,expressionA,
start;
355 std::cout << ind <<
"Enter->";
361 boost::function<double(std::string)> getValueFromItem;
364 bool evalCondition();
368 return (idn ==
SGE) | (idn ==
SGT) | (idn ==
SLT) | (idn ==
SLE) | (idn ==
SNE) | (idn ==
SEQ);
371 double _eval( operands_type_set::reverse_iterator &in);
372 bool _evalCondition(operands_type_set::reverse_iterator &in);