17# pragma GCC system_header
32#include <unordered_map>
33#include <unordered_set>
36#include <boost/fusion/include/std_pair.hpp>
37#include <boost/fusion/include/unused.hpp>
38#if ( BOOST_VERSION >= 187000 ) && ( BOOST_VERSION < 188000 )
39# define BOOST_ALLOW_DEPRECATED_HEADERS
41#include <boost/spirit/include/qi.hpp>
42#undef BOOST_ALLOW_DEPRECATED_HEADERS
44#include <boost/phoenix/core.hpp>
45#include <boost/phoenix/operator.hpp>
47#include <boost/spirit/repository/include/qi_confix.hpp>
51 namespace sp = boost::spirit;
52 namespace ph = boost::phoenix;
53 namespace qi = sp::qi;
54 namespace enc = sp::ascii;
55 namespace rep = sp::repository;
60 template <
typename Iterator,
typename T,
typename Skipper,
class Enable =
void>
71#define REGISTER_GRAMMAR( ResultType, GrammarName ) \
72 template <typename Iterator, typename Skipper> \
73 struct Grammar_<Iterator, ResultType, Skipper> { \
74 typedef GrammarName<Iterator, Skipper> Grammar; \
77 template <
typename Iterator>
80 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>, Skipper> {
93 quote = enc::char_( qi::_r1 );
96 *( ( enc::char_(
'\\' ) >>
quote( qi::_a ) )[qi::_val += qi::_a] |
97 ( enc::char_(
'\\' ) >> enc::char_(
'\\' ) )[qi::_val +=
'\\'] |
98 ( enc::char_[qi::_val += qi::_1] -
quote( qi::_a ) ) ) >
quote( qi::_a )];
108 template <
typename Iterator,
typename Skipper>
112 ch = qi::int_parser<char>() |
'\'' >> ( qi::char_ -
'\'' ) >>
'\'';
118 template <
typename Iterator,
typename Skipper>
122 boolean_literal = ( qi::lit(
"true" ) |
"True" |
"TRUE" |
"1" )[qi::_val =
true] |
123 ( qi::lit(
"false" ) |
"False" |
"FALSE" |
"0" )[qi::_val =
false];
129 template <
typename Iterator,
typename RT,
typename Skipper>
133 integer = qi::int_parser<RT>()[qi::_val = qi::_1] >> -qi::no_case[qi::char_(
'L' )];
138 template <
typename Iterator, std::
integral T,
typename Skipper>
143 template <
typename Iterator,
typename RT,
typename Skipper>
150 template <
typename Iterator, std::
floating_po
int T,
typename Skipper>
155 template <
typename T>
158 template <
typename T>
161 template <
typename T,
typename... Ts>
163 typedef std::tuple<Ts...>
type;
166 template <
typename T,
typename... Ts>
171 template <
typename Iterator,
typename TupleT, std::
size_t N,
typename Skipper>
173 : qi::grammar<Iterator, TupleT(), qi::locals<typename tuple_get_first_type<TupleT>::type>, Skipper> {
180 res = std::tuple_cat( std::tuple<HeadT>( head ), tail );
192 ph::function<Operations>
op;
195 template <
typename Iterator,
typename TupleT,
typename Skipper>
202 std::get<0>( res ) = val;
211 ph::function<Operations>
op;
214 template <
typename Iterator,
typename TupleT, std::
size_t N,
typename Skipper>
215 struct TupleGrammar : qi::grammar<Iterator, TupleT(), qi::locals<char>, Skipper> {
218 begin = enc::char_(
'[' )[qi::_val =
']'] | enc::char_(
'(' )[qi::_val =
')'];
219 end = *( enc::char_(
',' ) ) >> enc::char_( qi::_r1 );
235 template <
typename Iterator,
typename VectorT,
typename Skipper>
236 struct VectorGrammar : qi::grammar<Iterator, VectorT(), qi::locals<char>, Skipper> {
241 enc::char_(
'[' )[qi::_val =
']'] | enc::char_(
'{' )[qi::_val =
'}'] | enc::char_(
'(' )[qi::_val =
')'];
242 end = *( enc::char_(
',' ) ) >> enc::char_( qi::_r1 );
244 vec =
begin[qi::_a = qi::_1] >> -
list[qi::_val = qi::_1] >>
end( qi::_a );
255 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
typename Skipper>
260 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
typename Skipper>
265 template <
typename Iterator,
typename InnerT,
typename CompareT,
typename AllocatorT,
typename Skipper>
270 template <
typename Iterator,
typename SetT,
typename Skipper>
271 struct SetGrammar : qi::grammar<Iterator, SetT(), qi::locals<char>, Skipper> {
280 template <
typename Iterator,
typename InnerT,
typename HashT,
typename CompareT,
typename AllocatorT,
286 template <
typename Iterator,
typename PairT,
typename Skipper>
287 struct PairGrammar : qi::grammar<Iterator, PairT(), qi::locals<char>, Skipper> {
297 begin = enc::char_(
'(' )[qi::_val =
')'] | enc::char_(
'[' )[qi::_val =
']'];
298 end = qi::char_( qi::_r1 );
311 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename Skipper>
316 template <
typename Iterator,
typename MapT,
typename Skipper>
319 typedef typename MapT::key_type
KeyT;
321 typedef std::pair<KeyT, MappedT>
PairT;
329 for (
auto cur = vec.begin(); cur != vec.end(); ++cur ) { res.insert( *cur ); }
336 pair =
key[
op( qi::_val, qi::_1, tag_key() )] > ( qi::lit(
':' ) |
'=' ) >
337 value[
op( qi::_val, qi::_1, tag_mapped() )];
338 list = -(
pair % enc::char_(
',' ) );
339 map = ( (
'[' >>
list >>
']' ) | (
'{' >>
list >>
'}' ) | (
'[' >>
list >>
',' >>
']' ) |
340 (
'{' >>
list >>
',' >>
'}' ) )[
op( qi::_val, qi::_1 )];
348 ph::function<Operations>
op;
351 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename KeyCompareT,
typename AllocatorT,
357 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename HashT,
typename KeyCompareT,
358 typename AllocatorT,
typename Skipper>
363 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename KeyCompareT,
typename AllocatorT,
369 template <
typename Iterator,
typename Po
intT,
typename Skipper>
394 list = -( enc::no_case[qi::lit(
"x" ) | qi::lit(
"px" )] >>
':' ) >>
scalar[
op( qi::_val, qi::_1,
'x' )] >>
395 ',' >> -( enc::no_case[qi::lit(
"y" ) | qi::lit(
"py" )] >>
':' ) >>
396 scalar[
op( qi::_val, qi::_1,
'y' )] >>
',' >>
397 -( enc::no_case[qi::lit(
"z" ) | qi::lit(
"pz" )] >>
':' ) >>
scalar[
op( qi::_val, qi::_1,
'z' )];
402 ph::function<Operations>
op;
405 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
410 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
415 template <
typename Iterator,
typename Po
intT,
typename Skipper>
440 res.SetPx( xyz.Px() );
441 res.SetPy( xyz.Py() );
442 res.SetPz( xyz.Pz() );
448 list4d = (
point3d[
op( qi::_val, qi::_1 )] >> enc::char_(
";," ) >>
e[
op( qi::_val, qi::_1,
'e' )] ) |
449 (
e[
op( qi::_val, qi::_1,
'e' )] >> enc::char_(
";," ) >>
point3d[
op( qi::_val, qi::_1 )] );
450 e = -( enc::no_case[enc::char_(
"te" )] >>
':' ) >>
scalar[qi::_val = qi::_1];
453 list3d = -( enc::no_case[qi::lit(
"x" ) | qi::lit(
"px" )] >>
':' ) >>
scalar[
op( qi::_val, qi::_1,
'x' )] >>
454 ',' >> -( enc::no_case[qi::lit(
"y" ) | qi::lit(
"py" )] >>
':' ) >>
455 scalar[
op( qi::_val, qi::_1,
'y' )] >>
',' >>
456 -( enc::no_case[qi::lit(
"z" ) | qi::lit(
"pz" )] >>
':' ) >>
scalar[
op( qi::_val, qi::_1,
'z' )];
462 ph::function<Operations>
op;
465 template <
typename Iterator,
typename T1,
typename Skipper>
470 template <
typename Iterator,
typename Skipper>
471 struct Histo1DGrammar : qi::grammar<Iterator, Gaudi::Histo1DDef(), qi::locals<char>, Skipper> {
493 val1 =
title[
op( qi::_val, qi::_1 )] >>
',' >> qi::double_[
op( qi::_val, qi::_1,
'l' )] >>
',' >>
494 qi::double_[
op( qi::_val, qi::_1,
'h' )] >> -(
',' >> qi::int_[
op( qi::_val, qi::_1 )] );
495 val2 = qi::double_[
op( qi::_val, qi::_1,
'l' )] >>
',' >> qi::double_[
op( qi::_val, qi::_1,
'h' )] >>
',' >>
496 title[
op( qi::_val, qi::_1 )] >> -(
',' >> qi::int_[
op( qi::_val, qi::_1 )] );
497 val3 = qi::double_[
op( qi::_val, qi::_1,
'l' )] >>
',' >> qi::double_[
op( qi::_val, qi::_1,
'h' )] >>
498 -(
',' >>
title[
op( qi::_val, qi::_1 )] ) >> -(
',' >> qi::int_[
op( qi::_val, qi::_1 )] );
499 begin = enc::char_(
'[' )[qi::_val =
']'] | enc::char_(
'(' )[qi::_val =
')'];
500 end = enc::char_( qi::_r1 );
509 ph::function<Operations>
op;
513 template <
typename Iterator,
typename Skipper>
514 struct KeyValueGrammar : qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
515 typedef std::pair<std::string, std::string>
ResultT;
#define REGISTER_GRAMMAR(ResultType, GrammarName)
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Simple helper class for description of 1D-histogram The class is targeted to act as the primary "hist...
void setTitle(std::string value)
set the title
void setBins(int value)
set number of bis
void setLowEdge(double value)
set low edge
void setHighEdge(double value)
set high edge
Helper class for efficient "key" access for strings.
enc::space_type DefaultSkipper
SkipperGrammar< IteratorT > Skipper
std::string::const_iterator DefaultIterator
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
qi::rule< Iterator, bool(), Skipper > boolean_literal
qi::rule< Iterator, char(), Skipper > ch
MapGrammar< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
VectorGrammar< Iterator, std::set< InnerT, CompareT, AllocatorT >, Skipper > Grammar
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
IntGrammar< Iterator, T, Skipper > Grammar
TupleGrammar< Iterator, std::tuple< Args... >, sizeof...(Args), Skipper > Grammar
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
SetGrammar< Iterator, std::unordered_set< InnerT, HashT, CompareT, AllocatorT >, Skipper > Grammar
VectorGrammar< Iterator, std::list< InnerT, AllocatorT >, Skipper > Grammar
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
MapGrammar< Iterator, std::unordered_map< KeyT, ValueT, HashT, KeyCompareT, AllocatorT >, Skipper > Grammar
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
void operator()(ResultT &res, const double &val, const char lh) const
void operator()(ResultT &res, int val) const
void operator()(ResultT &res, const std::string &title) const
void operator()(ResultT &res) const
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > hist
Gaudi::Histo1DDef ResultT
qi::rule< Iterator, ResultT(), Skipper > val3
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, ResultT(), Skipper > val2
StringGrammar< Iterator, Skipper > title
ph::function< Operations > op
qi::rule< Iterator, char()> begin
qi::rule< Iterator, ResultT(), Skipper > val1
qi::rule< Iterator, T(), Skipper > integer
std::pair< std::string, std::string > ResultT
qi::rule< Iterator, ResultT(), Skipper > pair
StringGrammar< Iterator, Skipper > gstring
void operator()(PairT &res, const MappedT &value, tag_mapped) const
void operator()(ResultT &res, const VectorPairT &vec) const
void operator()(PairT &res, const KeyT &key, tag_key) const
MapT::mapped_type MappedT
qi::rule< Iterator, VectorPairT(), Skipper > list
qi::rule< Iterator, ResultT(), Skipper > map
Grammar_< Iterator, typenameMapT::key_type, Skipper >::Grammar key
qi::rule< Iterator, PairT(), Skipper > pair
ph::function< Operations > op
std::vector< PairT > VectorPairT
Grammar_< Iterator, typenameMapT::mapped_type, Skipper >::Grammar value
std::pair< KeyT, MappedT > PairT
PairT::second_type second_type
PairGrammar(const std::string &delimeter)
Grammar_< Iterator, typenamePairT::first_type, Skipper >::Grammar key
qi::rule< Iterator, char()> begin
qi::rule< Iterator, void(char)> end
Grammar_< Iterator, typenamePairT::second_type, Skipper >::Grammar value
PairT::first_type first_type
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
qi::rule< Iterator, ResultT(), Skipper > pair_in
void operator()(ResultT &res, const Scalar &scalar, const char xyz) const
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
qi::rule< Iterator, ResultT(), Skipper > list
ph::function< Operations > op
qi::rule< Iterator, ResultT(), Skipper > point
void operator()(ResultT &res, const ScalarT &scalar, const char xyz) const
void operator()(ResultT &res, const ResultT &xyz) const
qi::rule< Iterator, ResultT(), Skipper > list4d
ph::function< Operations > op
qi::rule< Iterator, ResultT(), Skipper > list3d
qi::rule< Iterator, ResultT(), Skipper > point4d
qi::rule< Iterator, ResultT(), Skipper > point3d
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
qi::rule< Iterator, ScalarT(), Skipper > e
qi::rule< Iterator, Node(), Skipper > real
VectorGrammar< Iterator, std::unordered_set< InnerT, HashT, CompareT, AllocatorT >, Skipper > grVector
qi::rule< Iterator, std::unordered_set< InnerT, HashT, CompareT, AllocatorT >(), qi::locals< char >, Skipper > set
qi::rule< IteratorT > comments
qi::rule< Iterator, void(char)> quote
qi::rule< Iterator, char()> begin_quote
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
TupleInnerGrammar< Iterator, std::tuple< Args... >, N, Skipper > grTuple
qi::rule< Iterator, char()> begin
void operator()(ResultT &res, HeadT &head, TailT &tail) const
void operator()(ResultT &res, const std::tuple_element_t< 0, ResultT > &val) const
Grammar_< Iterator, std::tuple_element_t< 0, ResultT >, Skipper >::Grammar grFirst
tuple_remove_first_type< TupleT >::type TailT
ph::function< Operations > op
tuple_get_first_type< TupleT >::type HeadT
ph::function< Operations > op
TupleInnerGrammar< Iterator, TailT, N - 1, Skipper > grLast
Grammar_< Iterator, HeadT, Skipper >::Grammar grHead
qi::rule< Iterator, ResultT(), Skipper > tup
qi::rule< Iterator, ResultT(), qi::locals< HeadT >, Skipper > tup
qi::rule< Iterator, char()> begin
Grammar_< Iterator, typenameVectorT::value_type, Skipper >::Grammar elementGrammar
qi::rule< Iterator, void(char)> end
qi::rule< Iterator, ResultT(), Skipper > list
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec