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))];
87 template<
typename Iterator,
typename Skipper>
88 struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>,
96 quote = enc::char_(qi::_r1);
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;
107 qi::rule<Iterator, void(char)>
quote;
113 template<
typename Iterator,
typename Skipper>
114 struct CharGrammar : qi::grammar<Iterator, char(), 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>
141 struct IntGrammar : qi::grammar<Iterator, RT(), 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>
194 typedef std::tuple<Ts...>
type;
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 {
223 res = std::tuple_cat(std::tuple<HeadT>(head), tail);
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);
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);
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> {
382 void init(
const std::string& delimeter) {
383 begin = enc::char_(
'(')[qi::_val=
')']
385 enc::char_(
'[')[qi::_val=
']'];
386 end = qi::char_(qi::_r1);
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>
414 struct MapGrammar : qi::grammar<Iterator,MapT(), Skipper>
418 typedef typename MapT::key_type
KeyT;
420 typedef std::pair<KeyT, MappedT>
PairT;
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(
typename VectorPairT::const_iterator cur = vec.begin();
435 cur != vec.end(); cur++){
452 map = ((
'[' >> list >>
']')
453 | (
'{' >> list >>
'}'))[
op(qi::_val,qi::_1)];
460 qi::rule<Iterator, PairT(), Skipper>
pair;
461 qi::rule<Iterator, VectorPairT(), Skipper>
list;
462 qi::rule<Iterator, ResultT(), Skipper>
map;
463 ph::function<Operations>
op;
469 template <
typename Iterator,
typename KeyT,
typename ValueT,
470 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
474 std::map<KeyT, ValueT, KeyCompareT, AllocatorT>, Skipper>
Grammar;
479 template <
typename Iterator,
typename KeyT,
typename ValueT,
480 typename KeyCompareT,
typename AllocatorT,
typename Skipper>
482 KeyCompareT, AllocatorT>, Skipper>
489 template<
typename Iterator,
typename Po
intT,
typename Skipper>
495 template <
typename A,
typename B = boost::fusion::unused_type,
496 typename C = boost::fusion::unused_type,
497 typename D = boost::fusion::unused_type>
500 const char xyz)
const{
502 case 'x': res.SetX(scalar);
break;
503 case 'y': res.SetY(scalar);
break;
504 case 'z': res.SetZ(scalar);
break;
512 list = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
513 >>
scalar[
op(qi::_val,qi::_1,
'x')] >>
514 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
515 >>
scalar[
op(qi::_val,qi::_1,
'y')] >>
516 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
522 ph::function<Operations>
op;
528 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
537 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
544 template<
typename Iterator,
typename Po
intT,
typename Skipper>
551 template <
typename A,
typename B = boost::fusion::unused_type,
552 typename C = boost::fusion::unused_type,
553 typename D = boost::fusion::unused_type>
557 const char xyz)
const{
559 case 'x': res.SetPx(scalar);
break;
560 case 'y': res.SetPy(scalar);
break;
561 case 'z': res.SetPz(scalar);
break;
562 case 'e': res.SetE(scalar);
break;
576 >>
e[
op(qi::_val, qi::_1,
'e')])
578 (
e[
op(qi::_val,qi::_1,
'e')] >> enc::char_(
";,")
580 e = -(enc::no_case[enc::char_(
"te")] >>
':')
581 >>
scalar[qi::_val = qi::_1];
584 list3d = -(enc::no_case[qi::lit(
"x") | qi::lit(
"px")] >>
':')
585 >>
scalar[
op(qi::_val, qi::_1,
'x')] >>
586 ',' >> -(enc::no_case[qi::lit(
"y") | qi::lit(
"py")] >>
':')
587 >>
scalar[
op(qi::_val, qi::_1,
'y')] >>
588 ',' >> -(enc::no_case[qi::lit(
"z") | qi::lit(
"pz")] >>
':')
589 >>
scalar[
op(qi::_val, qi::_1,
'z')];
594 qi::rule<Iterator, ScalarT(), Skipper>
e;
596 ph::function<Operations>
op;
602 template <
typename Iterator,
typename T1,
typename Skipper>
609 template<
typename Iterator,
typename Skipper>
611 qi::locals<char>, Skipper>
616 template <
typename A,
typename B = boost::fusion::unused_type,
617 typename C = boost::fusion::unused_type,
618 typename D = boost::fusion::unused_type>
623 void operator()(ResultT& res,
const double& val,
const char lh)
const{
625 case 'l': res.setLowEdge(val);
break;
626 case 'h': res.setHighEdge(val);
break;
638 >> qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
639 >> qi::double_[
op(qi::_val, qi::_1,
'h')]
640 >> -(
',' >> qi::int_[
op(qi::_val, qi::_1)]);
641 val2 = qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
642 >> qi::double_[
op(qi::_val, qi::_1,
'h')] >>
','
643 >>
title[
op(qi::_val, qi::_1)] >> -(
','
644 >> qi::int_[
op(qi::_val, qi::_1)]);
645 val3 = qi::double_[
op(qi::_val, qi::_1,
'l')] >>
','
646 >> qi::double_[
op(qi::_val, qi::_1,
'h')]
647 >> -(
',' >>
title[
op(qi::_val, qi::_1)])
648 >> -(
',' >> qi::int_[
op(qi::_val, qi::_1)]);
649 begin = enc::char_(
'[')[qi::_val=
']'] | enc::char_(
'(')[qi::_val=
')'];
650 end = enc::char_(qi::_r1);
651 hist = begin[qi::_a = qi::_1] >> (
val1 | val2 |
val3)[qi::_val=qi::_1]
655 qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper>
hist;
658 qi::rule<Iterator, void(char)>
end;
660 ph::function<Operations>
op;
666 template<
typename Iterator,
typename Skipper>
668 qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
670 typedef std::pair<std::string, std::string>
ResultT;
681 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
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
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
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
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
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
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.
qi::rule< Iterator, ResultT(), Skipper > point3d
qi::rule< Iterator, Node(), Skipper > real
ph::function< Operations > op
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
tuple_get_first_type< TupleT >::type HeadT
qi::rule< Iterator, ResultT(), Skipper > point4d
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
TupleInnerGrammar< Iterator, TailT, N-1, Skipper > grLast
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
ph::function< Operations > op
void operator()(ResultT &res, const ResultT &xyz) const
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
PairGrammar(const std::string &delimeter)
Forward declarations for the functions in SerializeSTL.h.
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
tuple_remove_first_type< TupleT >::type TailT
TupleInnerGrammar< Iterator, TupleT, N, Skipper > grTuple
Grammar_< Iterator, typename std::tuple_element< 0, ResultT >::type, Skipper >::Grammar grFirst
qi::rule< Iterator, ResultT(), Skipper > list4d
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
ph::function< Operations > op
qi::rule< Iterator, void(char)> end
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
void operator()(ResultT &res, HeadT &head, TailT &tail) const
PairT::second_type second_type
qi::rule< Iterator, char()> begin
qi::rule< Iterator, ResultT(), Skipper > val2
Helper functions to set/get the application return code.
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 > tup
qi::rule< Iterator, ResultT(), Skipper > list
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
ph::function< Operations > op