2 #ifndef GAUDIKERNEL_GRAMMARSV2_H
3 #define GAUDIKERNEL_GRAMMARSV2_H 1
5 #pragma GCC system_header
20 #include <boost/spirit/include/qi.hpp>
21 #include <boost/fusion/include/unused.hpp>
22 #include <boost/fusion/include/std_pair.hpp>
24 #include <boost/spirit/include/phoenix_core.hpp>
25 #include <boost/spirit/include/phoenix_operator.hpp>
27 #include <boost/utility/enable_if.hpp>
28 #include <boost/type_traits.hpp>
30 #include <boost/spirit/repository/include/qi_confix.hpp>
41 namespace Gaudi {
namespace Parsers {
45 namespace sp = boost::spirit;
46 namespace ph = boost::phoenix;
47 namespace qi = sp::qi;
48 namespace enc = sp::ascii;
49 namespace rep = sp::repository;
68 #define REGISTER_GRAMMAR(ResultType, GrammarName) \
69 template <typename Iterator, typename Skipper>\
70 struct Grammar_<Iterator, ResultType, Skipper> \
72 typedef GrammarName<Iterator, Skipper> Grammar;\
75 template<
typename Iterator>
76 struct SkipperGrammar : qi::grammar<Iterator>
79 comments = enc::space | rep::confix(
"/*",
"*/")[*(qi::char_ -
"*/")]
81 rep::confix(
"//", (sp::eol | sp::eoi))[*(qi::char_ - (sp::eol|sp::eoi))];
83 qi::rule<Iterator> comments;
86 template<
typename Iterator,
typename Skipper>
87 struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>,
95 quote = enc::char_(qi::_r1);
98 > *( (enc::char_(
'\\') >>
quote(qi::_a))[qi::_val += qi::_a]
99 | (enc::char_[qi::_val += qi::_1] -
quote(qi::_a))) >
104 qi::rule<Iterator, std::string(), qi::locals<char>,
Skipper> str;
105 qi::rule<Iterator, char()> begin_quote;
106 qi::rule<Iterator, void(char)> quote;
112 template<
typename Iterator,
typename Skipper>
113 struct CharGrammar : qi::grammar<Iterator, char(), Skipper>
117 ch = qi::int_parser<char>()
119 '\'' >> (qi::char_-
'\'') >>
'\'';
121 qi::rule<Iterator, char(), Skipper>
ch;
125 template<
typename Iterator,
typename Skipper>
126 struct BoolGrammar : qi::grammar<Iterator, bool(), Skipper>
131 (qi::lit(
"true") |
"True" |
"TRUE" |
"1")[qi::_val=
true]
133 (qi::lit(
"false") |
"False" |
"FALSE" |
"0")[qi::_val=
false];
139 template<
typename Iterator,
typename RT ,
typename Skipper>
140 struct IntGrammar : qi::grammar<Iterator, RT(), Skipper>
144 integer = qi::int_parser<RT>()[qi::_val = qi::_1]
145 >> -qi::no_case[qi::char_(
'L')];
152 template <
typename Iterator,
typename T,
typename Skipper>
154 typename boost::enable_if<boost::is_integral<T> >
::type>
159 template<
typename Iterator,
typename RT,
typename Skipper>
160 struct RealGrammar : qi::grammar<Iterator, RT(), Skipper>
164 real = qi::real_parser<RT>();
166 qi::rule<Iterator, RT(), Skipper>
real;
171 template <
typename Iterator,
typename T,
typename Skipper >
173 typename boost::enable_if<boost::is_floating_point<T> >
::type >
178 template<
typename Iterator,
typename VectorT,
typename Skipper>
180 VectorT(), qi::locals<char>,Skipper>
186 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'{')[qi::_val=
'}']
187 | enc::char_(
'(')[qi::_val=
')'];
188 end = enc::char_(qi::_r1);
189 list = elementGrammar %
',';
190 vec = begin[qi::_a = qi::_1] >> -
list[qi::_val=qi::_1] >>
end(qi::_a);
197 qi::rule<Iterator, void(char)>
end;
200 qi::rule<Iterator, ResultT(), Skipper>
list;
206 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
217 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
228 template <
typename Iterator,
typename InnerT,
typename CompareT,
229 typename AllocatorT,
typename Skipper>
238 template<
typename Iterator,
typename PairT,
typename Skipper>
240 qi::grammar<Iterator,PairT(), qi::locals<char>, Skipper> {
257 begin = enc::char_(
'(')[qi::_val=
')']
259 enc::char_(
'[')[qi::_val=
']'];
260 end = qi::char_(qi::_r1);
271 qi::rule<Iterator, void(char)>
end;
273 qi::rule<Iterator, ResultT(), Skipper>
pair_in;
280 template <
typename Iterator,
typename KeyT,
typename ValueT,
287 template<
typename Iterator,
typename MapT,
typename Skipper>
288 struct MapGrammar : qi::grammar<Iterator,MapT(), Skipper>
292 typedef typename MapT::key_type
KeyT;
302 template <
typename A,
typename B = boost::fusion::unused_type,
303 typename C = boost::fusion::unused_type,
304 typename D = boost::fusion::unused_type>
308 for(
typename VectorPairT::const_iterator cur = vec.
begin();
309 cur != vec.
end(); cur++){
326 map = ((
'[' >> list >>
']')
327 | (
'{' >> list >>
'}'))[
op(qi::_val,qi::_1)];
334 qi::rule<Iterator, PairT(), Skipper>
pair;
335 qi::rule<Iterator, VectorPairT(), Skipper>
list;
336 qi::rule<Iterator, ResultT(), Skipper>
map;
337 ph::function<Operations>
op;
343 template <
typename Iterator,
typename KeyT,
typename ValueT,
344 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
353 template <
typename Iterator,
typename KeyT,
typename ValueT,
354 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
356 KeyCompareT, AllocatorT>,
Skipper>
363 template<
typename Iterator,
typename Po
intT,
typename Skipper>
369 template <
typename A,
typename B = boost::fusion::unused_type,
370 typename C = boost::fusion::unused_type,
371 typename D = boost::fusion::unused_type>
374 const char xyz)
const{
376 case 'x': res.SetX(scalar);
break;
377 case 'y': res.SetY(scalar);
break;
378 case 'z': res.SetZ(scalar);
break;
386 list = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
387 >>
scalar[
op(qi::_val,qi::_1,
'x')] >>
388 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
389 >>
scalar[
op(qi::_val,qi::_1,
'y')] >>
390 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
396 ph::function<Operations>
op;
402 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
411 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
418 template<
typename Iterator,
typename Po
intT,
typename Skipper>
425 template <
typename A,
typename B = boost::fusion::unused_type,
426 typename C = boost::fusion::unused_type,
427 typename D = boost::fusion::unused_type>
431 const char xyz)
const{
433 case 'x': res.SetPx(scalar);
break;
434 case 'y': res.SetPy(scalar);
break;
435 case 'z': res.SetPz(scalar);
break;
436 case 'e': res.SetE(scalar);
break;
450 >>
e[
op(qi::_val, qi::_1,
'e')])
452 (
e[
op(qi::_val,qi::_1,
'e')] >> enc::char_(
";,")
454 e = -(enc::no_case[enc::char_(
"te")] >>
':')
455 >>
scalar[qi::_val = qi::_1];
458 list3d = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
459 >>
scalar[
op(qi::_val, qi::_1,
'x')] >>
460 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
461 >>
scalar[
op(qi::_val, qi::_1,
'y')] >>
462 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
463 >>
scalar[
op(qi::_val, qi::_1,
'z')];
468 qi::rule<Iterator, ScalarT(), Skipper>
e;
470 ph::function<Operations>
op;
476 template <
typename Iterator,
typename T1,
typename Skipper>
483 template<
typename Iterator,
typename Skipper>
485 qi::locals<char>, Skipper>
490 template <
typename A,
typename B = boost::fusion::unused_type,
491 typename C = boost::fusion::unused_type,
492 typename D = boost::fusion::unused_type>
499 case 'l': res.setLowEdge(val);
break;
500 case 'h': res.setHighEdge(val);
break;
512 >> qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
513 >> qi::double_[
op(qi::_val, qi::_1,
'h')]
514 >> -(
',' >> qi::int_[
op(qi::_val, qi::_1)]);
515 val2 = qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
516 >> qi::double_[
op(qi::_val, qi::_1,
'h')] >>
','
517 >>
title[
op(qi::_val, qi::_1)] >> -(
','
518 >> qi::int_[
op(qi::_val, qi::_1)]);
519 val3 = qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
520 >> qi::double_[
op(qi::_val, qi::_1,
'h')]
521 >> -(
',' >>
title[
op(qi::_val, qi::_1)])
522 >> -(
',' >> qi::int_[
op(qi::_val, qi::_1)]);
523 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'(')[qi::_val=
')'];
524 end = enc::char_(qi::_r1);
525 hist = begin[qi::_a = qi::_1] >> (
val1 | val2 | val3)[qi::_val=qi::_1]
532 qi::rule<Iterator, void(char)>
end;
534 ph::function<Operations>
op;
540 template<
typename Iterator,
typename Skipper>
542 qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
555 qi::rule<Iterator, ResultT(), Skipper>
pair;