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>
35 #include "GaudiKernel/VectorMap.h"
36 #include "GaudiKernel/HashMap.h"
37 #include "GaudiKernel/StringKey.h"
38 #include "GaudiKernel/Point3DTypes.h"
39 #include "GaudiKernel/Point4DTypes.h"
40 #include "GaudiKernel/HistoDef.h"
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')];
148 qi::rule<Iterator, RT(), Skipper>
integer;
153 template <
typename Iterator,
typename T,
typename Skipper>
154 struct Grammar_<
Iterator, T, Skipper,
155 typename
boost::enable_if<boost::is_integral<T> >
::type>
157 typedef IntGrammar<Iterator, T, Skipper> Grammar;
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 >
173 struct Grammar_<
Iterator, T, Skipper,
174 typename
boost::enable_if<boost::is_floating_point<T> >
::type >
176 typedef RealGrammar<Iterator, T, Skipper> Grammar;
182 struct tuple_remove_first_type
187 struct tuple_get_first_type
191 template<
typename T,
typename... Ts>
192 struct tuple_remove_first_type<
std::tuple<T, Ts...>>
194 typedef std::tuple<Ts...>
type;
197 template<
typename T,
typename... Ts>
198 struct tuple_get_first_type<
std::tuple<T, Ts...>>
205 template<
typename Iterator,
typename TupleT, std::
size_t N,
typename Skipper>
206 struct TupleInnerGrammar : qi::grammar<Iterator,
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>
219 struct result {
typedef void type; };
222 void operator()(ResultT& res, HeadT& head, TailT& tail)
const {
223 res = std::tuple_cat(std::tuple<HeadT>(head), tail);
234 Grammar_<Iterator, HeadT, Skipper>::Grammar
grHead;
236 qi::rule<Iterator, ResultT(), qi::locals<HeadT>, Skipper>
tup;
237 ph::function<Operations>
op;
240 template<
typename Iterator,
typename TupleT,
typename Skipper>
241 struct TupleInnerGrammar<
Iterator, TupleT, 1, Skipper>: qi::grammar<Iterator,
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)];
269 Skipper>::Grammar grFirst;
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);
287 qi::rule<Iterator, char()>
begin;
288 qi::rule<Iterator, void(char)>
end;
289 qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper>
tup;
290 TupleInnerGrammar<Iterator, TupleT, N, Skipper>
grTuple;
297 struct Grammar_<
Iterator,
std::tuple<Args...>, Skipper>
300 TupleGrammar<
Iterator, std::tuple<Args...>,
sizeof...(Args ),
304 template<
typename Iterator,
typename VectorT,
typename Skipper>
305 struct VectorGrammar : qi::grammar<Iterator,
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);
320 Grammar_<Iterator, typename VectorT::value_type, Skipper>::Grammar
322 qi::rule<Iterator, char()>
begin;
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,
337 VectorGrammar<Iterator, std::vector<InnerT, AllocatorT>,Skipper>
343 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
345 struct Grammar_<
Iterator,
std::list<InnerT, AllocatorT>, Skipper >
348 VectorGrammar<Iterator, std::list<InnerT, AllocatorT>,Skipper>
354 template <
typename Iterator,
typename InnerT,
typename CompareT,
355 typename AllocatorT,
typename Skipper>
356 struct Grammar_<
Iterator,
std::set<InnerT, CompareT, AllocatorT>, Skipper >
359 VectorGrammar<Iterator, std::set<InnerT, CompareT, AllocatorT>,Skipper>
364 template<
typename Iterator,
typename PairT,
typename Skipper>
366 qi::grammar<Iterator,PairT(), qi::locals<char>, Skipper> {
369 typedef typename PairT::first_type
first_type;
382 void init(
const std::string& delimeter) {
383 begin = enc::char_(
'(')[qi::_val=
')']
385 enc::char_(
'[')[qi::_val=
']'];
386 end = qi::char_(qi::_r1);
392 Grammar_<Iterator, typename PairT::first_type, Skipper>::Grammar
key;
394 Grammar_<Iterator, typename PairT::second_type, Skipper>::Grammar
396 qi::rule<Iterator, char()>
begin;
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,
408 struct Grammar_<
Iterator,
std::pair<KeyT, ValueT>, Skipper >
410 typedef PairGrammar<Iterator, std::pair<KeyT, ValueT>, Skipper> Grammar;
413 template<
typename Iterator,
typename MapT,
typename Skipper>
414 struct MapGrammar : qi::grammar<Iterator,MapT(), Skipper>
418 typedef typename MapT::key_type
KeyT;
419 typedef typename MapT::mapped_type
MappedT;
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>
431 struct result {
typedef void type; };
433 void operator()(ResultT& res,
const VectorPairT& vec)
const{
434 for(
typename VectorPairT::const_iterator cur = vec.begin();
435 cur != vec.end(); cur++){
449 pair =
key[
op(qi::_val,qi::_1, tag_key())] > (qi::lit(
':') |
'=') >
450 value[
op(qi::_val,qi::_1, tag_mapped())];
452 map = ((
'[' >> list >>
']')
453 | (
'{' >> list >>
'}'))[
op(qi::_val,qi::_1)];
457 Grammar_<Iterator, typename MapT::key_type, Skipper>::Grammar
key;
459 Grammar_<Iterator, typename MapT::mapped_type, Skipper>::Grammar
value;
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>
471 struct Grammar_<
Iterator,
std::
map<KeyT, ValueT, KeyCompareT, AllocatorT>,
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>
490 struct Pnt3DGrammar : qi::grammar<Iterator, PointT(), Skipper> {
492 typedef typename PointT::Scalar
Scalar;
495 template <
typename A,
typename B = boost::fusion::unused_type,
496 typename C = boost::fusion::unused_type,
497 typename D = boost::fusion::unused_type>
498 struct result {
typedef void 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;
511 point = list | (
'(' >> list >>
')') | (
'[' >> list >>
']');
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")] >>
':')
517 >> scalar[
op(qi::_val,qi::_1,
'z')];
520 qi::rule<Iterator, ResultT(), Skipper>
point,
list;
521 typename Grammar_<Iterator, Scalar, Skipper>::Grammar
scalar;
522 ph::function<Operations>
op;
528 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
529 struct Grammar_<
Iterator,
ROOT::Math::PositionVector3D<T1,T2>, Skipper>{
531 Pnt3DGrammar<Iterator, ROOT::Math::PositionVector3D<T1,T2>, Skipper>
537 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
538 struct Grammar_<
Iterator,
ROOT::Math::DisplacementVector3D<T1,T2>, Skipper>{
544 template<
typename Iterator,
typename Po
intT,
typename Skipper>
545 struct Pnt4DGrammar : qi::grammar<Iterator, PointT(), Skipper>
548 typedef typename PointT::Scalar
ScalarT;
551 template <
typename A,
typename B = boost::fusion::unused_type,
552 typename C = boost::fusion::unused_type,
553 typename D = boost::fusion::unused_type>
554 struct result {
typedef void type; };
556 void operator()(ResultT& res,
const ScalarT& scalar,
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;
566 void operator()(ResultT& res,
const ResultT& xyz)
const{
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;
595 typename Grammar_<Iterator, ScalarT, Skipper>::Grammar
scalar;
596 ph::function<Operations>
op;
602 template <
typename Iterator,
typename T1,
typename Skipper>
603 struct Grammar_<
Iterator,
ROOT::Math::LorentzVector<T1>, Skipper >
605 typedef Pnt4DGrammar<Iterator, ROOT::Math::LorentzVector<T1>, Skipper>
609 template<
typename Iterator,
typename Skipper>
610 struct Histo1DGrammar : qi::grammar<Iterator, Gaudi::Histo1DDef(),
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>
619 struct result {
typedef void 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;
637 val1 = title[
op(qi::_val, qi::_1)] >>
','
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;
656 qi::rule<Iterator, ResultT(), Skipper>
val1,
val2,
val3;
657 qi::rule<Iterator, char()>
begin;
658 qi::rule<Iterator, void(char)>
end;
659 StringGrammar<Iterator, Skipper>
title;
660 ph::function<Operations>
op;
666 template<
typename Iterator,
typename Skipper>
667 struct KeyValueGrammar :
668 qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
670 typedef std::pair<std::string, std::string>
ResultT;
680 StringGrammar<Iterator, Skipper>
gstring;
681 qi::rule<Iterator, ResultT(), Skipper>
pair;
A bit modified version of 'Loki::AssocVector' associative vector from Loki library by Andrei Alexandr...
qi::rule< Iterator, Node(), Skipper > real
qi::rule< Iterator, void(char)> end
Grammar_< Iterator, typename VectorT::value_type, Skipper >::Grammar elementGrammar
Grammar_< Iterator, typename MapT::mapped_type, Skipper >::Grammar value
qi::rule< Iterator, ResultT(), Skipper > point4d
void operator()(ResultT &res, const ScalarT &scalar, const char xyz) const
void operator()(ResultT &res, const std::string &title) const
std::vector< PairT > VectorPairT
ph::function< Operations > op
std::map< KeyT, ValueT > ResultT
REGISTER_GRAMMAR(std::string, StringGrammar)
qi::rule< Iterator > comments
qi::rule< Iterator, ResultT(), Skipper > map
MapT::mapped_type MappedT
qi::rule< Iterator, char()> begin
qi::rule< Iterator, PairT(), Skipper > pair
PairT::first_type first_type
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
qi::rule< Iterator, void(char)> end
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
qi::rule< Iterator, char()> begin
qi::rule< Iterator, ResultT(), Skipper > point3d
KeyGrammarT::ResultT KeyT
qi::rule< Iterator, char()> begin
std::pair< KeyT, ValueT > ResultT
qi::rule< Iterator, char(), Skipper > ch
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, ResultT(), Skipper > val3
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
ph::function< Operations > op
Grammar_< Iterator, typename PairT::first_type, Skipper >::Grammar key
struct GAUDI_API map
Parametrisation class for map-like implementation.
qi::rule< Iterator, char()> begin
qi::rule< Iterator, ResultT(), Skipper > point
qi::rule< Iterator, ResultT(), qi::locals< HeadT >, Skipper > tup
Grammar_< Iterator, typename PairT::second_type, Skipper >::Grammar value
qi::rule< Iterator, VectorPairT(), Skipper > list
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
TupleInnerGrammar< Iterator, TailT, N-1, Skipper > grLast
void operator()(ResultT &res, const Scalar &scalar, const char xyz) const
Simple helper class for description of 1D-histogram The class is targeted to act as the primary "hist...
qi::rule< Iterator, ScalarT(), Skipper > e
StringGrammar< Iterator, Skipper > gstring
tuple_get_first_type< TupleT >::type HeadT
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
qi::rule< Iterator, bool(), Skipper > boolean_literal
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec
ph::function< Operations > op
std::string::const_iterator DefaultIterator
enc::space_type DefaultSkipper
qi::rule< Iterator, ResultT(), Skipper > pair
void operator()(ResultT &res, const VectorPairT &vec) const
qi::rule< Iterator, void(char)> end
std::pair< KeyT, MappedT > PairT
SkipperGrammar< IteratorT > Skipper
qi::rule< Iterator, ResultT(), Skipper > pair_in
qi::rule< Iterator, RT(), Skipper > integer
std::vector< ValueT > ResultT
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
qi::rule< Iterator, ResultT(), Skipper > list
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > hist
qi::rule< Iterator, ResultT(), Skipper > list3d
StringGrammar< Iterator, Skipper > title
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
ph::function< Operations > op
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
qi::rule< Iterator, ResultT(), Skipper > list
qi::rule< Iterator, ResultT(), Skipper > val2
void operator()(ResultT &res, HeadT &head, TailT &tail) const
PairT::second_type second_type
ph::function< Operations > op
Helper functions to set/get the application return code.
Gaudi::Histo1DDef ResultT
qi::rule< Iterator, char()> begin_quote
std::pair< std::string, std::string > ResultT
qi::rule< Iterator, ResultT(), Skipper > val1
Grammar_< Iterator, HeadT, Skipper >::Grammar grHead
TupleInnerGrammar< Iterator, TupleT, N, Skipper > grTuple
qi::rule< Iterator, ResultT(), Skipper > list4d