2 #ifndef GAUDIKERNEL_GRAMMARSV2_H 3 #define GAUDIKERNEL_GRAMMARSV2_H 1 5 #pragma GCC system_header 21 #include <boost/spirit/include/qi.hpp> 22 #include <boost/fusion/include/unused.hpp> 23 #include <boost/fusion/include/std_pair.hpp> 25 #include <boost/spirit/include/phoenix_core.hpp> 26 #include <boost/spirit/include/phoenix_operator.hpp> 28 #include <boost/utility/enable_if.hpp> 29 #include <boost/type_traits.hpp> 31 #include <boost/spirit/repository/include/qi_confix.hpp> 42 namespace Gaudi {
namespace Parsers {
47 namespace ph = boost::phoenix;
48 namespace qi = sp::qi;
49 namespace enc = sp::ascii;
50 namespace rep = sp::repository;
69 #define REGISTER_GRAMMAR(ResultType, GrammarName) \ 70 template <typename Iterator, typename Skipper>\ 71 struct Grammar_<Iterator, ResultType, Skipper> \ 73 typedef GrammarName<Iterator, Skipper> Grammar;\ 76 template<
typename Iterator>
77 struct SkipperGrammar : qi::grammar<Iterator>
80 comments = enc::space | rep::confix(
"/*",
"*/")[*(qi::char_ -
"*/")]
82 rep::confix(
"//", (sp::eol | sp::eoi))[*(qi::char_ - (sp::eol|sp::eoi))];
84 qi::rule<Iterator> comments;
87 template<
typename Iterator,
typename Skipper>
88 struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>,
95 begin_quote = enc::char_(
"\"'");
96 quote = enc::char_(qi::_r1);
98 str = qi::lexeme[begin_quote[qi::_a = qi::_1]
99 > *( (enc::char_(
'\\') >> quote(qi::_a))[qi::_val += qi::_a]
100 | (enc::char_[qi::_val += qi::_1] - quote(qi::_a))) >
105 qi::rule<Iterator, std::string(), qi::locals<char>, Skipper> str;
106 qi::rule<Iterator, char()> begin_quote;
107 qi::rule<Iterator, void(char)> quote;
113 template<
typename Iterator,
typename Skipper>
118 ch = qi::int_parser<char>()
120 '\'' >> (qi::char_-
'\'') >>
'\'';
122 qi::rule<Iterator, char(), Skipper>
ch;
126 template<
typename Iterator,
typename Skipper>
127 struct BoolGrammar : qi::grammar<Iterator, bool(), Skipper>
132 (qi::lit(
"true") |
"True" |
"TRUE" |
"1")[qi::_val=
true]
134 (qi::lit(
"false") |
"False" |
"FALSE" |
"0")[qi::_val=
false];
140 template<
typename Iterator,
typename RT ,
typename Skipper>
145 integer = qi::int_parser<RT>()[qi::_val = qi::_1]
146 >> -qi::no_case[qi::char_(
'L')];
153 template <
typename Iterator,
typename T,
typename Skipper>
155 typename
boost::enable_if<boost::is_integral<T> >
::type>
160 template<
typename Iterator,
typename RT,
typename Skipper>
161 struct RealGrammar : qi::grammar<Iterator, RT(), Skipper>
165 real = qi::real_parser<RT>();
167 qi::rule<Iterator, RT(), Skipper>
real;
172 template <
typename Iterator,
typename T,
typename Skipper >
174 typename
boost::enable_if<boost::is_floating_point<T> >
::type >
191 template<
typename T,
typename... Ts>
197 template<
typename T,
typename... Ts>
205 template<
typename Iterator,
typename TupleT, std::
size_t N,
typename Skipper>
207 TupleT(), qi::locals<typename tuple_get_first_type<TupleT>::type>, Skipper>
216 template <
typename A,
typename B = boost::fusion::unused_type,
217 typename C = boost::fusion::unused_type,
218 typename D = boost::fusion::unused_type>
222 void operator()(ResultT& res, HeadT& head, TailT& tail)
const {
229 tup = grHead[qi::_a = qi::_1] >>
',' >> grLast[op(qi::_val, qi::_a, qi::_1)];
236 qi::rule<Iterator, ResultT(), qi::locals<HeadT>, Skipper>
tup;
237 ph::function<Operations>
op;
240 template<
typename Iterator,
typename TupleT,
typename Skipper>
250 template <
typename A,
typename B = boost::fusion::unused_type,
251 typename C = boost::fusion::unused_type,
252 typename D = boost::fusion::unused_type>
253 struct result {
typedef void type; };
258 std::get<0>(res) = val;
264 tup = grFirst[op(qi::_val, qi::_1)];
271 qi::rule<Iterator, ResultT(), Skipper>
tup;
272 ph::function<Operations>
op;
276 template<
typename Iterator,
typename TupleT, std::
size_t N,
typename Skipper>
277 struct TupleGrammar : qi::grammar<Iterator, TupleT(), qi::locals<char>, Skipper>
281 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'(')[qi::_val=
')'];
282 end = enc::char_(qi::_r1);
284 tup =
begin[qi::_a = qi::_1] >> grTuple[qi::_val = qi::_1] >>
end(qi::_a);
288 qi::rule<Iterator, void(char)>
end;
289 qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper>
tup;
304 template<
typename Iterator,
typename VectorT,
typename Skipper>
306 VectorT(), qi::locals<char>,Skipper>
312 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'{')[qi::_val=
'}']
313 | enc::char_(
'(')[qi::_val=
')'];
314 end = enc::char_(qi::_r1);
315 list = elementGrammar %
',';
316 vec =
begin[qi::_a = qi::_1] >> -list[qi::_val=qi::_1] >>
end(qi::_a);
323 qi::rule<Iterator, void(char)>
end;
325 qi::rule<Iterator, ResultT(), qi::locals<char>,Skipper>
vec;
326 qi::rule<Iterator, ResultT(), Skipper>
list;
332 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
343 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
354 template <
typename Iterator,
typename InnerT,
typename CompareT,
355 typename AllocatorT,
typename Skipper>
364 template<
typename Iterator,
typename PairT,
typename Skipper>
366 qi::grammar<Iterator,PairT(), qi::locals<char>, Skipper> {
383 begin = enc::char_(
'(')[qi::_val=
')']
385 enc::char_(
'[')[qi::_val=
']'];
386 end = qi::char_(qi::_r1);
387 pair =
begin[qi::_a = qi::_1] >> pair_in[qi::_val = qi::_1] >>
end(qi::_a);
388 pair_in = key >> qi::lit(delimeter) >> value;
397 qi::rule<Iterator, void(char)>
end;
398 qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper>
pair;
399 qi::rule<Iterator, ResultT(), Skipper>
pair_in;
406 template <
typename Iterator,
typename KeyT,
typename ValueT,
413 template<
typename Iterator,
typename MapT,
typename Skipper>
418 typedef typename MapT::key_type
KeyT;
428 template <
typename A,
typename B = boost::fusion::unused_type,
429 typename C = boost::fusion::unused_type,
430 typename D = boost::fusion::unused_type>
434 for(
auto cur = vec.
begin(); cur != vec.
end(); ++cur){
448 pair = key[op(qi::_val,qi::_1,
tag_key())] > (qi::lit(
':') |
'=') >
450 list = -(pair % enc::char_(
','));
451 map = ((
'[' >> list >>
']')
452 | (
'{' >> list >>
'}'))[op(qi::_val,qi::_1)];
459 qi::rule<Iterator, PairT(), Skipper>
pair;
460 qi::rule<Iterator, VectorPairT(), Skipper>
list;
461 qi::rule<Iterator, ResultT(), Skipper>
map;
462 ph::function<Operations>
op;
468 template <
typename Iterator,
typename KeyT,
typename ValueT,
469 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
478 template <
typename Iterator,
typename KeyT,
typename ValueT,
479 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
481 KeyCompareT, AllocatorT>, Skipper>
488 template<
typename Iterator,
typename Po
intT,
typename Skipper>
494 template <
typename A,
typename B = boost::fusion::unused_type,
495 typename C = boost::fusion::unused_type,
496 typename D = boost::fusion::unused_type>
499 const char xyz)
const{
501 case 'x': res.SetX(scalar);
break;
502 case 'y': res.SetY(scalar);
break;
503 case 'z': res.SetZ(scalar);
break;
510 point = list | (
'(' >> list >>
')') | (
'[' >> list >>
']');
511 list = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
512 >> scalar[op(qi::_val,qi::_1,
'x')] >>
513 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
514 >> scalar[op(qi::_val,qi::_1,
'y')] >>
515 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
516 >> scalar[op(qi::_val,qi::_1,
'z')];
519 qi::rule<Iterator, ResultT(), Skipper>
point, list;
521 ph::function<Operations>
op;
527 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
536 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
543 template<
typename Iterator,
typename Po
intT,
typename Skipper>
550 template <
typename A,
typename B = boost::fusion::unused_type,
551 typename C = boost::fusion::unused_type,
552 typename D = boost::fusion::unused_type>
556 const char xyz)
const{
558 case 'x': res.SetPx(scalar);
break;
559 case 'y': res.SetPy(scalar);
break;
560 case 'z': res.SetPz(scalar);
break;
561 case 'e': res.SetE(scalar);
break;
573 point4d = list4d | (
'(' >> list4d >>
')') | (
'[' >> list4d >>
']');
574 list4d = (point3d[op(qi::_val,qi::_1)] >> enc::char_(
";,")
575 >> e[op(qi::_val, qi::_1,
'e')])
577 (e[op(qi::_val,qi::_1,
'e')] >> enc::char_(
";,")
578 >> point3d[op(qi::_val, qi::_1)]);
579 e = -(enc::no_case[enc::char_(
"te")] >>
':')
580 >> scalar[qi::_val = qi::_1];
582 point3d = list3d | (
'(' >> list3d >>
')') | (
'[' >> list3d >>
']');
583 list3d = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
584 >> scalar[op(qi::_val, qi::_1,
'x')] >>
585 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
586 >> scalar[op(qi::_val, qi::_1,
'y')] >>
587 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
588 >> scalar[op(qi::_val, qi::_1,
'z')];
591 qi::rule<Iterator, ResultT(), Skipper> point3d,
point4d, list3d,
593 qi::rule<Iterator, ScalarT(), Skipper>
e;
595 ph::function<Operations>
op;
601 template <
typename Iterator,
typename T1,
typename Skipper>
608 template<
typename Iterator,
typename Skipper>
610 qi::locals<char>, Skipper>
615 template <
typename A,
typename B = boost::fusion::unused_type,
616 typename C = boost::fusion::unused_type,
617 typename D = boost::fusion::unused_type>
622 void operator()(ResultT& res,
const double& val,
const char lh)
const{
624 case 'l': res.setLowEdge(val);
break;
625 case 'h': res.setHighEdge(val);
break;
636 val1 = title[op(qi::_val, qi::_1)] >>
',' 637 >> qi::double_[op(qi::_val, qi::_1,
'l')] >>
',' 638 >> qi::double_[op(qi::_val, qi::_1,
'h')]
639 >> -(
',' >> qi::int_[op(qi::_val, qi::_1)]);
640 val2 = qi::double_[op(qi::_val, qi::_1,
'l')] >>
',' 641 >> qi::double_[op(qi::_val, qi::_1,
'h')] >>
',' 642 >> title[op(qi::_val, qi::_1)] >> -(
',' 643 >> qi::int_[op(qi::_val, qi::_1)]);
644 val3 = qi::double_[op(qi::_val, qi::_1,
'l')] >>
',' 645 >> qi::double_[op(qi::_val, qi::_1,
'h')]
646 >> -(
',' >> title[op(qi::_val, qi::_1)])
647 >> -(
',' >> qi::int_[op(qi::_val, qi::_1)]);
648 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'(')[qi::_val=
')'];
649 end = enc::char_(qi::_r1);
650 hist = begin[qi::_a = qi::_1] >> (val1 | val2 | val3)[qi::_val=qi::_1]
654 qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper>
hist;
655 qi::rule<Iterator, ResultT(), Skipper> val1, val2,
val3;
657 qi::rule<Iterator, void(char)>
end;
659 ph::function<Operations>
op;
665 template<
typename Iterator,
typename Skipper>
667 qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
676 pair = gstring >>
":" >> +enc::char_;
680 qi::rule<Iterator, ResultT(), Skipper>
pair;
qi::rule< Iterator, char()> begin
qi::rule< Iterator, ResultT(), Skipper > pair
qi::rule< Iterator, ResultT(), Skipper > val3
A bit modified version of 'Loki::AssocVector' associative vector from Loki library by Andrei Alexandr...
qi::rule< Iterator, VectorPairT(), Skipper > list
StringGrammar< Iterator, Skipper > gstring
void init(const std::string &delimeter)
MapGrammar< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
void operator()(ResultT &res, const ScalarT &scalar, const char xyz) const
void operator()(ResultT &res, const std::string &title) const
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
PairT::second_type second_type
The namespace threadpool contains a thread pool and related utility classes.
REGISTER_GRAMMAR(std::string, StringGrammar)
Grammar_< Iterator, typename PairT::first_type, Skipper >::Grammar key
qi::rule< Iterator, ResultT(), Skipper > point
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
void operator()(ResultT &res, const typename std::tuple_element< 0, ResultT >::type &val) const
SkipperGrammar< IteratorT > Skipper
qi::rule< Iterator, ResultT(), qi::locals< HeadT >, Skipper > tup
ph::function< Operations > op
MapT::mapped_type MappedT
RealGrammar< Iterator, T, Skipper > Grammar
StringGrammar< Iterator, Skipper > title
qi::rule< Iterator, ResultT(), Skipper > map
void operator()(ResultT &res) const
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
The helper class to represent the efficient "key" for access.
qi::rule< Iterator, ScalarT(), Skipper > e
auto begin(reverse_wrapper< T > &w)
PairGrammar(const std::string &delimeter)
Grammar_< Iterator, typename VectorT::value_type, Skipper >::Grammar elementGrammar
Grammar_< Iterator, HeadT, Skipper >::Grammar grHead
void operator()(ResultT &res, const double &val, const char lh) const
qi::rule< Iterator, char()> begin
struct GAUDI_API map
Parametrisation class for map-like implementation.
std::pair< KeyT, MappedT > PairT
ph::function< Operations > op
Grammar_< Iterator, typename PairT::second_type, Skipper >::Grammar value
void operator()(ResultT &res, const Scalar &scalar, const char xyz) const
VectorGrammar< Iterator, std::list< InnerT, AllocatorT >, Skipper > Grammar
Simple helper class for description of 1D-histogram The class is targeted to act as the primary "hist...
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > hist
VectorGrammar< Iterator, std::set< InnerT, CompareT, AllocatorT >, Skipper > Grammar
qi::rule< Iterator, ResultT(), Skipper > pair_in
PairT::first_type first_type
tuple_get_first_type< TupleT >::type HeadT
qi::rule< Iterator, ResultT(), Skipper > point4d
qi::rule< Iterator, PairT(), Skipper > pair
auto end(reverse_wrapper< T > &w)
TupleInnerGrammar< Iterator, TailT, N-1, Skipper > grLast
qi::rule< Iterator, ResultT(), Skipper > list
std::string::const_iterator DefaultIterator
void operator()(PairT &res, const KeyT &key, tag_key) const
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
void operator()(ResultT &res, int val) const
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
enc::space_type DefaultSkipper
std::vector< PairT > VectorPairT
qi::rule< Iterator, bool(), Skipper > boolean_literal
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
void operator()(ResultT &res, const VectorPairT &vec) const
ph::function< Operations > op
void operator()(ResultT &res, const ResultT &xyz) const
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
Forward declarations for the functions in SerializeSTL.h.
tuple_remove_first_type< TupleT >::type TailT
IntGrammar< Iterator, T, Skipper > Grammar
qi::rule< Iterator, char(), Skipper > ch
TupleInnerGrammar< Iterator, TupleT, N, Skipper > grTuple
Grammar_< Iterator, typename std::tuple_element< 0, ResultT >::type, Skipper >::Grammar grFirst
qi::rule< Iterator, char()> begin
ph::function< Operations > op
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, void(char)> end
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
qi::rule< Iterator, void(char)> end
Grammar_< Iterator, typename MapT::mapped_type, Skipper >::Grammar value
qi::rule< Iterator, RT(), Skipper > real
qi::rule< Iterator, RT(), Skipper > integer
void operator()(ResultT &res, HeadT &head, TailT &tail) const
qi::rule< Iterator, char()> begin
qi::rule< Iterator, void(char)> end
void operator()(PairT &res, const MappedT &value, tag_mapped) const
Helper functions to set/get the application return code.
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
Gaudi::Histo1DDef ResultT
std::pair< std::string, std::string > ResultT
ph::function< Operations > op
qi::rule< Iterator, ResultT(), Skipper > tup
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
ph::function< Operations > op