@@ -171,7 +171,7 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
171171 , MAPD(" mapD:" )
172172{
173173 // Take out "x" as identifier to preserve it for linear expressions
174- ident = qi::lexeme[qi::char_ (" a-wy -zA-WY -Z" )
174+ ident = qi::lexeme[qi::char_ (" a-xy -zA-XY -Z" )
175175 >> *(qi::alnum | qi::char_ (' _' ))]
176176 | qi::lexeme[qi::char_ (" x" ) >> +(qi::alnum | qi::char_ (' _' ))];
177177
@@ -192,7 +192,8 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
192192 rat_primary = rat_legacy[qi::_val = qi::_1]
193193 | (int_expr >> DIV >> int_expr)
194194 [qi::_val = phx::construct<AST::Rational>(qi::_1, qi::_2)]
195- | int_expr[qi::_val = qi::_1];
195+ | int_expr[qi::_val = qi::_1]
196+ | (OPAREN >> arithmetic_expr>> CPAREN)[qi::_val = qi::_1];
196197
197198 rat_term = rat_primary[qi::_val = qi::_1] >> *(mult_symbol >> rat_primary)
198199 [qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
@@ -238,25 +239,10 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
238239
239240 // ------------ //
240241
241- lexp_left = ( arithmetic_expr >> SLO >> VAR)[qi::_val = qi::_1] ;
242+ lexp_list = arithmetic_expr % PIPE ;
242243
243- lexp = (lexp_left >> ADD >> arithmetic_expr)
244- [qi::_val = phx::construct<AST::LinearExp>(qi::_1, qi::_2)]
245- | (VAR >> ADD >> arithmetic_expr)
246- [qi::_val = phx::construct<AST::LinearExp>(1 , qi::_1)]
247- | (lexp_left >> SUB >> arithmetic_expr)
248- [qi::_val = phx::construct<AST::LinearExp>(qi::_1
249- , phx::construct<AST::UnaryOp>(AST::UnOp::neg, qi::_2))]
250- | (VAR >> SUB >> arithmetic_expr)
251- [qi::_val = phx::construct<AST::LinearExp>(1
252- , phx::construct<AST::UnaryOp>(AST::UnOp::neg, qi::_1))]
253- | lexp_left[qi::_val = phx::construct<AST::LinearExp>(qi::_1, 0 )];
254-
255- // ------------ //
256-
257- mdlexp = (lexp % PIPE)[qi::_val = phx::construct<AST::MDLExp>(qi::_1)]
258- | (OPAREN >> (lexp % PIPE)[qi::_val = phx::construct<AST::MDLExp>(qi::_1)]
259- >> CPAREN);
244+ mdlexp = (PIPE >> lexp_list >> PIPE)
245+ [qi::_val = phx::construct<AST::MDLExp>(qi::_1)];
260246
261247 // ------------ //
262248
@@ -274,42 +260,32 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
274260 // ------------ //
275261
276262 sbg = (V >> set
277- >> VMAP >> pwl
278- >> MAP1 >> pwl
279- >> MAP2 >> pwl
280- >> EMAP >> pwl
281- >> SUBE >> pwl)
282- [qi::_val = phx::construct<AST::SBG>(
283- qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6
284- )]
285- | (V >> set
286- >> VMAP >> pwl
287- >> MAP1 >> pwl
288- >> MAP2 >> pwl
289- >> EMAP >> pwl)
290- [qi::_val = phx::construct<AST::SBG>(
291- qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, phx::construct<AST::PWLMap>()
292- )];
263+ >> VMAP >> pwl
264+ >> MAP1 >> pwl
265+ >> MAP2 >> pwl
266+ >> EMAP >> pwl
267+ >> -(SUBE >> pwl))[qi::_val = phx::if_else (qi::_6
268+ , phx::construct<AST::SBG>(qi::_1, qi::_2, qi::_3, qi::_4, qi::_5
269+ , *qi::_6)
270+ , phx::construct<AST::SBG>(qi::_1, qi::_2, qi::_3, qi::_4, qi::_5
271+ , phx::construct<AST::PWLMap>())
272+ )
273+ ];
293274
294275 // ------------ //
295276
296277 dsbg = (V >> set
297- >> VMAP >> pwl
298- >> MAPB >> pwl
299- >> MAPD >> pwl
300- >> EMAP >> pwl
301- >> SUBE >> pwl)
302- [qi::_val = phx::construct<AST::DSBG>(
303- qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6
304- )]
305- | (V >> set
306- >> VMAP >> pwl
307- >> MAPB >> pwl
308- >> MAPD >> pwl
309- >> EMAP >> pwl)
310- [qi::_val = phx::construct<AST::DSBG>(
311- qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, phx::construct<AST::PWLMap>()
312- )];
278+ >> VMAP >> pwl
279+ >> MAPB >> pwl
280+ >> MAPD >> pwl
281+ >> EMAP >> pwl
282+ >> -(SUBE >> pwl))[qi::_val = phx::if_else (qi::_6
283+ , phx::construct<AST::DSBG>(qi::_1, qi::_2, qi::_3, qi::_4, qi::_5
284+ , *qi::_6)
285+ , phx::construct<AST::DSBG>(qi::_1, qi::_2, qi::_3, qi::_4, qi::_5
286+ , phx::construct<AST::PWLMap>())
287+ )
288+ ];
313289
314290 // ------------ //
315291
@@ -332,31 +308,23 @@ ExprRule<Iterator>::ExprRule(Iterator &it) :
332308 | map
333309 | mdlexp
334310 | set
335- | md_inter;
311+ | md_inter
312+ | arithmetic_expr;
336313
337- sbg_term = (OPAREN >> sbg_expr >> binary_symbol >> sbg_expr >> CPAREN)
338- [qi::_val = phx::construct<AST::BinOp>(qi::_1, qi::_2, qi::_3)]
339- | (sbg_primary >> binary_symbol >> sbg_primary)
340- [qi::_val = phx::construct<AST::BinOp>(qi::_1, qi::_2, qi::_3)]
341- | sbg_primary[qi::_val = qi::_1];
314+ sbg_factor = (sbg_primary
315+ | (OPAREN >> sbg_expr >> CPAREN))[qi::_val = qi::_1]
316+ >> -(sbg_unary_symbol[qi::_val = phx::construct<AST::UnaryOp>(qi::_1, qi::_val)]);
342317
343- sbg_expr = (sbg_unary_symbol >> sbg_term )
344- [qi::_val = phx::construct<AST::UnaryOp >(qi::_1, qi::_2)]
345- | sbg_term [qi::_val = qi::_1];
318+ sbg_expr = (sbg_factor >> binary_symbol >> sbg_factor )
319+ [qi::_val = phx::construct<AST::BinOp >(qi::_1, qi::_2, qi::_3 )]
320+ | sbg_factor [qi::_val = qi::_1];
346321
347322 // ------------ //
348323
349- primary = sbg_expr[qi::_val = qi::_1] | arithmetic_expr[qi::_val = qi::_1];
350-
351- expr = primary[qi::_val = qi::_1] >> -(rel_symbol >> primary)
324+ expr = sbg_expr[qi::_val = qi::_1] >> -(rel_symbol >> sbg_expr)
352325 [qi::_val = phx::construct<AST::BinOp>(qi::_val, qi::_1, qi::_2)];
353326
354327 expr_list = expr % COMA;
355-
356- BOOST_SPIRIT_DEBUG_NODE (sbg_expr);
357- BOOST_SPIRIT_DEBUG_NODE (sbg_term);
358- BOOST_SPIRIT_DEBUG_NODE (sbg_primary);
359- BOOST_SPIRIT_DEBUG_NODE (mdlexp);
360328};
361329
362330template struct ExprRule <StrIt>;
0 commit comments