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))];
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;
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);
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> {
256 void init(
const std::string& delimeter) {
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;
294 typedef std::pair<KeyT, MappedT>
PairT;
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> {
544 typedef std::pair<std::string, std::string>
ResultT;
555 qi::rule<Iterator, ResultT(), Skipper>
pair;
qi::rule< Iterator, ResultT(), Skipper > pair
The valid represenation of boolean values are:
The valid represenation of char values are:
qi::rule< Iterator, ResultT(), Skipper > val3
qi::rule< Iterator, ResultT(), Skipper > list
A bit modified version of 'Loki::AssocVector' associative vector from Loki library by Andrei Alexandr...
StringGrammar< Iterator, Skipper > gstring
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
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
Grammar_< Iterator, typename PairT::second_type, Skipper >::Grammar value
std::vector< PairT > VectorPairT
std::map< KeyT, ValueT > ResultT
qi::rule< Iterator, ResultT(), Skipper > map
The valid represenation of real values are:
qi::rule< Iterator, char()> begin
void operator()(PairT &res, const MappedT &value, tag_mapped) const
REGISTER_GRAMMAR(std::string, StringGrammar)
The valid represenation of pairs are: ("abc",123) or ("abc","def") Inner types of pair depends on Key...
qi::rule< Iterator > comments
qi::rule< Iterator, ResultT(), Skipper > point
qi::rule< Iterator, void(char)> end
RealGrammar< Iterator, T, Skipper > Grammar
MapT::mapped_type MappedT
void operator()(PairT &res, const KeyT &key, tag_key) const
PairT::first_type first_type
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
Grammar_< Iterator, typename MapT::mapped_type, Skipper >::Grammar value
SkipperGrammar< IteratorT > Skipper
ph::function< Operations > op
KeyGrammarT::ResultT KeyT
StringGrammar< Iterator, Skipper > title
qi::rule< Iterator, char()> begin
qi::rule< Iterator, char(), Skipper > ch
The valid represenation of string values are:
void operator()(ResultT &res) const
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
void init(const std::string &delimeter)
The helper class to represent the efficient "key" for access.
qi::rule< Iterator, void(char)> quote
qi::rule< Iterator, ScalarT(), Skipper > e
qi::rule< Iterator, ResultT(), Skipper > list3d
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.
qi::rule< Iterator, ResultT(), Skipper > point3d
qi::rule< Iterator, Node(), Skipper > real
qi::rule< Iterator, ResultT(), Skipper > val1
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 > point4d
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
The valid representation of integers values are:
std::string::const_iterator DefaultIterator
IntGrammar< Iterator, T, Skipper > Grammar
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
The valid represenation of vector are:
Skipping spaces and comments.
qi::rule< Iterator, PairT(), Skipper > pair
qi::rule< Iterator, ResultT(), Skipper > pair_in
void operator()(ResultT &res, int val) const
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
qi::rule< Iterator, void(char)> end
enc::space_type DefaultSkipper
void operator()(ResultT &res, const VectorPairT &vec) const
std::pair< KeyT, MappedT > PairT
qi::rule< Iterator, bool(), Skipper > boolean_literal
Grammar_< Iterator, typename PairT::first_type, Skipper >::Grammar key
qi::rule< Iterator, VectorPairT(), Skipper > list
The valid represenation of map are:
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
void operator()(ResultT &res, const ResultT &xyz) const
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
PairGrammar(const std::string &delimeter)
std
AIDA -> ROTO converter.
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
qi::rule< Iterator, ResultT(), Skipper > list4d
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
ph::function< Operations > op
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
qi::rule< Iterator, RT(), Skipper > integer
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec
qi::rule< Iterator, RT(), Skipper > real
This is a number of static methods for bootstrapping the Gaudi framework.
PairT::second_type second_type
qi::rule< Iterator, ResultT(), Skipper > val2
Grammar_< Iterator, typename VectorT::value_type, Skipper >::Grammar elementGrammar
Gaudi::Histo1DDef ResultT
qi::rule< Iterator, char()> begin_quote
std::pair< std::string, std::string > ResultT
ph::function< Operations > op
qi::rule< Iterator, ResultT(), Skipper > list
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
ph::function< Operations > op