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");
139 integerOverflowHelperRule = qi::eps[qi::_pass = !qi::_r1];
140 integerOverflowHelperRule.name(
"no 64-bit integer overflow");
142 qi::_1, qi::_pass, qi::_a)] > integerOverflowHelperRule(qi::_a);
143 integerLiteralExpression.name(
"integer literal");
149 integerLiteralExpression[qi::_val = qi::_1];
150 literalExpression.name(
"literal expression");
152 atomicExpression = predicateExpression | floorCeilExpression | roundExpression | prefixPowerModuloLogarithmExpression | minMaxExpression |
153 (qi::lit(
"(") >> expression >> qi::lit(
")")) | identifierExpression | literalExpression;
154 atomicExpression.name(
"atomic expression");
159 unaryExpression.name(
"unary expression");
161 if (allowBacktracking) {
162 infixPowerModuloExpression =
163 unaryExpression[qi::_val = qi::_1] >>
164 -(infixPowerModuloOperator_ >>
166 qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
168 infixPowerModuloExpression =
169 unaryExpression[qi::_val = qi::_1] >
171 phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)];
173 infixPowerModuloExpression.name(
"(infix) power/modulo expression");
175 if (allowBacktracking) {
176 multiplicationExpression =
177 infixPowerModuloExpression[qi::_val = qi::_1] >>
178 *(multiplicationOperator_ >>
180 qi::_2, qi::_pass)][qi::_val = qi::_a];
182 multiplicationExpression =
183 infixPowerModuloExpression[qi::_val = qi::_1] >
184 *(multiplicationOperator_ >
188 multiplicationExpression.name(
"multiplication expression");
190 if (allowBacktracking) {
192 multiplicationExpression[qi::_val = qi::_1] >>
194 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
197 multiplicationExpression[qi::_val = qi::_1] >
199 qi::_val, qi::_1, qi::_2, qi::_pass)];
201 plusExpression.name(
"plus expression");
203 if (allowBacktracking) {
205 plusExpression[qi::_val = qi::_1] >>
207 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
210 plusExpression[qi::_val = qi::_1] >
212 qi::_val, qi::_1, qi::_2, qi::_pass)];
214 relativeExpression.name(
"relative expression");
216 if (allowBacktracking) {
218 relativeExpression[qi::_val = qi::_1] >>
220 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
223 relativeExpression[qi::_val = qi::_1] >>
225 qi::_val, qi::_1, qi::_2, qi::_pass)];
227 equalityExpression.name(
"equality expression");
229 if (allowBacktracking) {
230 andExpression = equalityExpression[qi::_val = qi::_1] >>
232 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
234 andExpression = equalityExpression[qi::_val = qi::_1] >>
236 qi::_val, qi::_1, qi::_2, qi::_pass)];
238 andExpression.name(
"and expression");
240 if (allowBacktracking) {
241 orExpression = andExpression[qi::_val = qi::_1] >>
243 qi::_val, qi::_1, qi::_2, qi::_pass)][qi::_val = qi::_a];
245 orExpression = andExpression[qi::_val = qi::_1] >
247 qi::_val, qi::_1, qi::_2, qi::_pass)];
249 orExpression.name(
"or expression");
251 if (allowBacktracking) {
252 iteExpression = orExpression[qi::_val = qi::_1] >>
253 -(qi::lit(
"?") >> iteExpression >> qi::lit(
":") >>
255 qi::_2, qi::_pass)][qi::_val = qi::_a];
258 orExpression[qi::_val = qi::_1] > -(qi::lit(
"?") > iteExpression > qi::lit(
":") >
260 phoenix::ref(*expressionCreator), qi::_val, qi::_1, qi::_2, qi::_pass)];
262 iteExpression.name(
"if-then-else expression");
264 expression %= iteExpression;
265 expression.name(
"expression");
286 if (enableErrorHandling) {
288 qi::on_error<qi::fail>(expression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
289 qi::on_error<qi::fail>(iteExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
290 qi::on_error<qi::fail>(orExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
291 qi::on_error<qi::fail>(andExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
292 qi::on_error<qi::fail>(equalityExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
293 qi::on_error<qi::fail>(relativeExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
294 qi::on_error<qi::fail>(plusExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
295 qi::on_error<qi::fail>(multiplicationExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
296 qi::on_error<qi::fail>(unaryExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
297 qi::on_error<qi::fail>(atomicExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
298 qi::on_error<qi::fail>(literalExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
299 qi::on_error<qi::fail>(integerLiteralExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
300 qi::on_error<qi::fail>(integerOverflowHelperRule, handler(qi::_1, qi::_2, qi::_3, qi::_4));
301 qi::on_error<qi::fail>(identifierExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
302 qi::on_error<qi::fail>(minMaxExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
303 qi::on_error<qi::fail>(floorCeilExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));
304 qi::on_error<qi::fail>(roundExpression, handler(qi::_1, qi::_2, qi::_3, qi::_4));