43 bool enableErrorHandling,
bool allowBacktracking)
48 relationalOperator_(),
50 multiplicationOperator_(),
51 infixPowerModuloOperator_(),
55 prefixPowerModuloLogarithmOperator_(),
56 invalidIdentifiers_(invalidIdentifiers_) {
57 expressionCreator = std::make_unique<ExpressionCreator>(manager);
59 identifier %= qi::as_string[qi::raw[qi::lexeme[((qi::alpha | qi::char_(
'_') | qi::char_(
'.')) >> *(qi::alnum | qi::char_(
'_')))]]]
60 [qi::_pass = phoenix::bind(&ExpressionParser::isValidIdentifier, phoenix::ref(*
this), qi::_1)];
61 identifier.name(
"identifier");
63 if (allowBacktracking) {
65 ((predicateOperator_ >> qi::lit(
"(")) >> (expression % qi::lit(
",")) >>
70 ((predicateOperator_ >> qi::lit(
"(")) > (expression % qi::lit(
",")) >
74 predicateExpression.name(
"predicate expression");
76 if (allowBacktracking) {
78 ((floorCeilOperator_ >> qi::lit(
"(")) >> expression >>
83 ((floorCeilOperator_ >> qi::lit(
"(")) > expression >
87 floorCeilExpression.name(
"floor/ceil expression");
89 if (allowBacktracking) {
91 ((qi::lit(
"round") >> qi::lit(
"(")) >> expression >>
95 ((qi::lit(
"round") >> qi::lit(
"(")) > expression >
98 roundExpression.name(
"round expression");
100 if (allowBacktracking) {
102 ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit(
"(")) >> expression[qi::_val = qi::_1] >>
104 qi::_val, qi::_a, qi::_1, qi::_pass)][qi::_val = qi::_b]) >>
108 ((minMaxOperator_[qi::_a = qi::_1] >> qi::lit(
"(")) > expression[qi::_val = qi::_1] >
110 qi::_val, qi::_a, qi::_1, qi::_pass)]) > qi::lit(
")");
112 minMaxExpression.name(
"min/max expression");
114 if (allowBacktracking) {
115 prefixPowerModuloLogarithmExpression =
116 ((prefixPowerModuloLogarithmOperator_ >> qi::lit(
"(")) >> expression >> qi::lit(
",") >> expression >>
118 qi::_3, qi::_pass)] |
119 (qi::lit(
"func") >> qi::lit(
"(") >> prefixPowerModuloLogarithmOperator_ >> qi::lit(
",") >> expression >> qi::lit(
",") >> expression >>
123 prefixPowerModuloLogarithmExpression =
124 ((prefixPowerModuloLogarithmOperator_ >> qi::lit(
"(")) > expression > qi::lit(
",") > expression >
126 qi::_3, qi::_pass)] |
127 ((qi::lit(
"func") >> qi::lit(
"(")) > prefixPowerModuloLogarithmOperator_ > qi::lit(
",") > expression > qi::lit(
",") > expression >
131 prefixPowerModuloLogarithmExpression.name(
"(prefix) power/modulo/logarithm expression");
133 identifierExpression =
135 identifierExpression.name(
"identifier expression");
142 literalExpression.name(
"literal expression");
144 atomicExpression = predicateExpression | floorCeilExpression | roundExpression | prefixPowerModuloLogarithmExpression | minMaxExpression |
145 (qi::lit(
"(") >> expression >> qi::lit(
")")) | identifierExpression | literalExpression;
146 atomicExpression.name(
"atomic expression");
151 unaryExpression.name(
"unary expression");
153 if (allowBacktracking) {
154 infixPowerModuloExpression =
155 unaryExpression[qi::_val = qi::_1] >>
156 -(infixPowerModuloOperator_ >>
158 qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
160 infixPowerModuloExpression =
161 unaryExpression[qi::_val = qi::_1] >
163 phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)];
165 infixPowerModuloExpression.name(
"(infix) power/modulo expression");
167 if (allowBacktracking) {
168 multiplicationExpression =
169 infixPowerModuloExpression[qi::_val = qi::_1] >>
170 *(multiplicationOperator_ >>
172 qi::_2, qi::_pass)][qi::_val = qi::_a];
174 multiplicationExpression =
175 infixPowerModuloExpression[qi::_val = qi::_1] >
176 *(multiplicationOperator_ >
180 multiplicationExpression.name(
"multiplication expression");
182 if (allowBacktracking) {
184 multiplicationExpression[qi::_val = qi::_1] >>
186 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
189 multiplicationExpression[qi::_val = qi::_1] >
191 qi::_val, qi::_1, qi::_2, qi::_pass)];
193 plusExpression.name(
"plus expression");
195 if (allowBacktracking) {
197 plusExpression[qi::_val = qi::_1] >>
199 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
202 plusExpression[qi::_val = qi::_1] >
204 qi::_val, qi::_1, qi::_2, qi::_pass)];
206 relativeExpression.name(
"relative expression");
208 if (allowBacktracking) {
210 relativeExpression[qi::_val = qi::_1] >>
212 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
215 relativeExpression[qi::_val = qi::_1] >>
217 qi::_val, qi::_1, qi::_2, qi::_pass)];
219 equalityExpression.name(
"equality expression");
221 if (allowBacktracking) {
222 andExpression = equalityExpression[qi::_val = qi::_1] >>
224 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
226 andExpression = equalityExpression[qi::_val = qi::_1] >>
228 qi::_val, qi::_1, qi::_2, qi::_pass)];
230 andExpression.name(
"and expression");
232 if (allowBacktracking) {
233 orExpression = andExpression[qi::_val = qi::_1] >>
235 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
237 orExpression = andExpression[qi::_val = qi::_1] >
239 qi::_val, qi::_1, qi::_2, qi::_pass)];
241 orExpression.name(
"or expression");
243 if (allowBacktracking) {
244 iteExpression = orExpression[qi::_val = qi::_1] >>
245 -(qi::lit(
"?") >> iteExpression >> qi::lit(
":") >>
247 qi::_2, qi::_pass)][qi::_val = qi::_a];
250 orExpression[qi::_val = qi::_1] > -(qi::lit(
"?") > iteExpression > qi::lit(
":") >
252 phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)];
254 iteExpression.name(
"if-then-else expression");
256 expression %= iteExpression;
257 expression.name(
"expression");
276 if (enableErrorHandling) {
278 qi::on_error<qi::fail>(expression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
279 qi::on_error<qi::fail>(iteExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
280 qi::on_error<qi::fail>(orExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
281 qi::on_error<qi::fail>(andExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
282 qi::on_error<qi::fail>(equalityExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
283 qi::on_error<qi::fail>(relativeExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
284 qi::on_error<qi::fail>(plusExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
285 qi::on_error<qi::fail>(multiplicationExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
286 qi::on_error<qi::fail>(unaryExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
287 qi::on_error<qi::fail>(atomicExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
288 qi::on_error<qi::fail>(literalExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
289 qi::on_error<qi::fail>(identifierExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
290 qi::on_error<qi::fail>(minMaxExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
291 qi::on_error<qi::fail>(floorCeilExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
292 qi::on_error<qi::fail>(roundExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));