1 #ifndef CommonTools_Utils_Grammar_h 2 #define CommonTools_Utils_Grammar_h 13 #include "boost/spirit/include/classic_core.hpp" 14 #include "boost/spirit/include/classic_grammar_def.hpp" 15 #include "boost/spirit/include/classic_chset.hpp" 45 struct Grammar :
public boost::spirit::classic::grammar<Grammar> {
63 sel_(& sel), expr_(& dummyExpr_), lazy_(lazy) {
64 typeStack.push_back(iType);
68 sel_(& dummySel_), expr_(& expr), lazy_(lazy) {
69 typeStack.push_back(iType);
72 template <
typename ScannerT>
74 public boost::spirit::classic::grammar_def<boost::spirit::classic::rule<ScannerT>,
75 boost::spirit::classic::same,
76 boost::spirit::classic::same>{
77 typedef boost::spirit::classic::rule<ScannerT>
rule;
78 rule
number,
var,
arrayAccess,
metharg,
method,
term,
power,
factor,
function1,
function2,
function4,
expression,
88 ExpressionVarSetter var_s(
self.exprStack,
self.methStack,
self.lazyMethStack,
self.typeStack);
91 MethodSetter method_s(
self.methStack,
self.lazyMethStack,
self.typeStack,
self.methArgStack,
self.lazy_);
99 abs_s(
kAbs,
self.funStack), acos_s(
kAcos,
self.funStack), asin_s(
kAsin,
self.funStack),
100 atan2_s(
kAtan,
self.funStack), atan_s(
kAtan,
self.funStack),
102 cosh_s(
kCosh,
self.funStack),
103 cos_s(
kCos,
self.funStack), exp_s(
kExp,
self.funStack), hypot_s(
kHypot,
self.funStack), log_s(
kLog,
self.funStack),
104 log10_s(
kLog10,
self.funStack), max_s(
kMax,
self.funStack), min_s(
kMin,
self.funStack),
105 pow_s(
kPow,
self.funStack), sinh_s(
kSinh,
self.funStack),
106 sin_s(
kSin,
self.funStack), sqrt_s(
kSqrt,
self.funStack), tanh_s(
kTanh,
self.funStack),
107 tan_s(
kTan,
self.funStack),
109 test_bit_s(
kTestBit,
self.funStack);
117 CutSetter cut_s(*
self.sel_,
self.selStack);
127 BOOST_SPIRIT_DEBUG_RULE(var);
128 BOOST_SPIRIT_DEBUG_RULE(arrayAccess);
129 BOOST_SPIRIT_DEBUG_RULE(method);
130 BOOST_SPIRIT_DEBUG_RULE(logical_expression);
131 BOOST_SPIRIT_DEBUG_RULE(cond_expression);
132 BOOST_SPIRIT_DEBUG_RULE(logical_term);
133 BOOST_SPIRIT_DEBUG_RULE(logical_factor);
134 BOOST_SPIRIT_DEBUG_RULE(number);
135 BOOST_SPIRIT_DEBUG_RULE(metharg);
136 BOOST_SPIRIT_DEBUG_RULE(function1);
137 BOOST_SPIRIT_DEBUG_RULE(function2);
138 BOOST_SPIRIT_DEBUG_RULE(function4);
139 BOOST_SPIRIT_DEBUG_RULE(expression);
140 BOOST_SPIRIT_DEBUG_RULE(term);
141 BOOST_SPIRIT_DEBUG_RULE(power);
142 BOOST_SPIRIT_DEBUG_RULE(factor);
143 BOOST_SPIRIT_DEBUG_RULE(or_op);
144 BOOST_SPIRIT_DEBUG_RULE(and_op);
145 BOOST_SPIRIT_DEBUG_RULE(comparison_op);
146 BOOST_SPIRIT_DEBUG_RULE(binary_comp);
147 BOOST_SPIRIT_DEBUG_RULE(trinary_comp);
148 BOOST_SPIRIT_DEBUG_RULE(cut);
149 BOOST_SPIRIT_DEBUG_RULE(fun);
152 boost::spirit::classic::assertion<SyntaxErrors> expect(
kSyntaxError);
156 metharg = ( strict_real_p [ methodArg_s ] ) |
157 ( int_p [ methodArg_s ] ) |
158 ( ch_p(
'"' ) >> *(~ch_p(
'"' )) >> ch_p(
'"' ) ) [ methodArg_s ] |
159 ( ch_p(
'\'') >> *(~ch_p(
'\'')) >> ch_p(
'\'') ) [ methodArg_s ];
161 (lexeme_d[alpha_p >> * chset<>(
"a-zA-Z0-9_")] >>
162 ch_p(
'(') >> metharg >> * (ch_p(
',') >>
metharg ) >> expectParenthesis(ch_p(
')'))) [ method_s ] |
163 ( (lexeme_d[alpha_p >> * chset<>(
"a-zA-Z0-9_")]) [ method_s ] >> ! (ch_p(
'(') >> ch_p(
')')) ) ;
164 arrayAccess = ( ch_p(
'[') >> metharg >> * (ch_p(
',') >>
metharg ) >> expectParenthesis(ch_p(
']'))) [ method_s ];
166 (var >> * (arrayAccess | (ch_p(
'.') >> expect(var)))) [ var_s ];
168 chseq_p(
"abs") [ abs_s ] | chseq_p(
"acos") [ acos_s ] | chseq_p(
"asin") [ asin_s ] |
169 chseq_p(
"atan") [ atan_s ] | chseq_p(
"cosh") [ cosh_s ] | chseq_p(
"cos") [ cos_s ] |
170 chseq_p(
"exp") [ exp_s ] | chseq_p(
"log") [ log_s ] | chseq_p(
"log10") [ log10_s ] |
171 chseq_p(
"sinh") [ sinh_s ] | chseq_p(
"sin") [ sin_s ] | chseq_p(
"sqrt") [ sqrt_s ] |
172 chseq_p(
"tanh") [ tanh_s ] | chseq_p(
"tan") [ tan_s ];
174 chseq_p(
"atan2") [ atan2_s ] | chseq_p(
"chi2prob") [ chi2prob_s ] | chseq_p(
"pow") [ pow_s ] |
175 chseq_p(
"min") [ min_s ] | chseq_p(
"max") [ max_s ] | chseq_p(
"deltaPhi") [deltaPhi_s] | chseq_p(
"hypot") [hypot_s] | chseq_p(
"test_bit") [test_bit_s] ;
177 chseq_p(
"deltaR") [deltaR_s];
182 term >> (* ((
'+' >> expect(term)) [ plus_s ] |
183 (
'-' >> expect(term)) [ minus_s ]));
185 (ch_p(
'?') >> logical_expression >> ch_p(
'?') >> expect(expression) >> ch_p(
":") >> expect(expression)) [cond_s];
187 power >> * ((
'*' >> expect(power)) [ multiplies_s ] |
188 (
'/' >> expect(power)) [ divides_s ]);
190 factor >> * ((
'^' >> expect(factor)) [ power_of_s ]);
193 (function1 >> ch_p(
'(') [funOk_s ] >> expect(expression) >> expectParenthesis(ch_p(
')'))) [ fun_s ] |
194 (function2 >> ch_p(
'(') [funOk_s ] >> expect(expression) >>
195 expect(ch_p(
',')) >> expect(expression) >> expectParenthesis(ch_p(
')'))) [ fun_s ] |
196 (function4 >> ch_p(
'(') [funOk_s ] >> expect(expression) >> expect(ch_p(
',')) >> expect(expression) >> expect(ch_p(
',')) >> expect(expression) >>
197 expect(ch_p(
',')) >> expect(expression) >> expectParenthesis(ch_p(
')'))) [ fun_s ] |
207 ch_p(
'(') >> expression >> ch_p(
')') |
208 (ch_p(
'-') >>
factor) [ negate_s ] |
211 (ch_p(
'<') >> ch_p(
'=') [ less_equal_s ]) |
212 (ch_p(
'<') [ less_s ]) |
213 (ch_p(
'=') >> ch_p(
'=') [ equal_to_s ]) |
214 (ch_p(
'=') [ equal_to_s ]) |
215 (ch_p(
'>') >> ch_p(
'=') [ greater_equal_s ]) |
216 (ch_p(
'>') [ greater_s ]) |
217 (ch_p(
'!') >> ch_p(
'=') [ not_equal_to_s ]);
219 (expression >> comparison_op >> expect(expression)) [ binary_s ];
221 (expression >> comparison_op >> expect(expression) >> comparison_op >> expect(expression)) [ trinary_s ];
222 or_op = ch_p(
'|') >> ch_p(
'|') | ch_p(
'|');
223 and_op = ch_p(
'&') >> ch_p(
'&') | ch_p(
'&');
225 logical_term >> * (or_op >> expect(logical_term)) [ or_s ];
227 logical_factor >> * (and_op >> expect(logical_factor)) [ and_s ];
231 ch_p(
'(') >> logical_expression >> expectParenthesis(ch_p(
')')) |
232 (ch_p(
'!') >> expect(logical_factor)) [ not_s ] |
233 expression [ expr_sel_s ];
235 cut = logical_expression [ cut_s ];
236 fun = expression [ expr_s ];
237 this->start_parsers(cut, fun);
Grammar(SelectorPtr &sel, const edm::TypeWithDict &iType, bool lazy=false)
LazyMethodStack lazyMethStack
std::vector< edm::TypeWithDict > TypeStack
FunctionStack finalFunStack
boost::shared_ptr< ExpressionBase > ExpressionPtr
Grammar(ExpressionPtr &expr, const edm::TypeWithDict &iType, bool lazy=false)
std::vector< AnyMethodArgument > MethodArgumentStack
boost::spirit::classic::rule< ScannerT > rule
std::vector< boost::shared_ptr< ExpressionBase > > ExpressionStack
std::vector< SelectorPtr > SelectorStack
std::vector< LazyInvoker > LazyMethodStack
std::vector< int > IntStack
boost::shared_ptr< SelectorBase > SelectorPtr
MethodArgumentStack methArgStack
definition(const Grammar &self)
std::vector< MethodInvoker > MethodStack
ExpressionStack exprStack
std::vector< boost::shared_ptr< ComparisonBase > > ComparisonStack
std::vector< Function > FunctionStack