17# pragma GCC system_header
30#include <unordered_map>
31#include <unordered_set>
34#include <boost/fusion/include/std_pair.hpp>
35#if ( BOOST_VERSION >= 187000 ) && ( BOOST_VERSION < 188000 )
36# define BOOST_ALLOW_DEPRECATED_HEADERS
38#include <boost/spirit/include/qi.hpp>
39#undef BOOST_ALLOW_DEPRECATED_HEADERS
41#include <boost/fusion/adapted/std_tuple.hpp>
42#include <boost/phoenix/bind.hpp>
43#include <boost/phoenix/core.hpp>
44#include <boost/phoenix/operator.hpp>
45#include <boost/spirit/repository/include/qi_confix.hpp>
48 namespace sp = boost::spirit;
49 namespace ph = boost::phoenix;
50 namespace qi = sp::qi;
51 namespace enc = sp::ascii;
52 namespace rep = sp::repository;
54 template <
typename Iterator,
typename T,
typename Skipper,
class Enable =
void>
65#define REGISTER_GRAMMAR( ResultType, GrammarName ) \
66 template <typename Iterator, typename Skipper> \
67 struct Grammar_<Iterator, ResultType, Skipper> { \
68 using Grammar = GrammarName<Iterator, Skipper>; \
71 template <
typename Iterator>
75 comments = enc::space | rep::confix(
"/*",
"*/" )[*( qi::char_ -
"*/" )] |
76 rep::confix(
"//", ( sp::eol | sp::eoi ) )[*( qi::char_ - ( sp::eol | sp::eoi ) )];
80 template <
typename It,
typename Skipper>
85 dq_body = qi::eps[qi::_val = std::string{}] >> *( ( qi::lit(
'\\' ) >> qi::char_(
'"' ) )[qi::_val +=
'"'] |
86 ( qi::lit(
'\\' ) >> qi::char_(
'\\' ) )[qi::_val +=
'\\'] |
87 ( qi::char_ - qi::char_(
'"' ) )[qi::_val += qi::_1] );
88 sq_body = qi::eps[qi::_val = std::string{}] >> *( ( qi::lit(
'\\' ) >> qi::char_(
'\'' ) )[qi::_val +=
'\''] |
89 ( qi::lit(
'\\' ) >> qi::char_(
'\\' ) )[qi::_val +=
'\\'] |
90 ( qi::char_ - qi::char_(
'\'' ) )[qi::_val += qi::_1] );
91 str = qi::lexeme[rep::confix(
'"',
'"' )[
dq_body] | rep::confix(
'\'',
'\'' )[
sq_body]];
97 template <
typename Iterator,
typename Skipper>
105 template <
typename Iterator,
typename Skipper>
107 qi::symbols<char, bool>
kw;
111 kw.add(
"true",
true )(
"True",
true )(
"TRUE",
true )(
"1",
true )(
"false",
false )(
"False",
false )(
112 "FALSE",
false )(
"0",
false );
118 template <
typename Iterator,
typename RT,
typename Skipper>
122 integer = qi::int_parser<RT>()[qi::_val = qi::_1] >> -qi::no_case[qi::char_(
'L' )];
127 template <
typename Iterator, std::
integral T,
typename Skipper>
132 template <
typename Iterator,
typename RT,
typename Skipper>
139 template <
typename Iterator, std::
floating_po
int T,
typename Skipper>
144 template <
typename It,
typename Skipper,
typename... Ts>
146 static_assert(
sizeof...( Ts ) > 0,
"Tuple must have at least one element" );
147 std::tuple<typename Grammar_<It, Ts, Skipper>::Grammar...>
elems{};
153 template <std::size_t... Is>
154 void init( std::index_sequence<Is...> ) {
155 if constexpr (
sizeof...( Is ) == 0 ) {
156 body = get<0>(
elems ) >> -qi::lit(
',' );
158 body = get<0>(
elems ) >> ( ( qi::lit(
',' ) >> get<Is + 1>(
elems ) ) >> ... ) >> -qi::lit(
',' );
160 tuple = rep::confix(
'(',
')' )[
body] | rep::confix(
'[',
']' )[
body];
170 template <
typename Iterator,
typename VectorT,
typename Skipper>
183 vec = rep::confix(
'(',
')' )[
body] | rep::confix(
'[',
']' )[
body] | rep::confix(
'{',
'}' )[
body];
187 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
typename Skipper>
192 template <
typename Iterator,
typename InnerT,
typename AllocatorT,
typename Skipper>
197 template <
typename Iterator,
typename InnerT,
typename CompareT,
typename AllocatorT,
typename Skipper>
202 template <
typename Iterator,
typename SetT,
typename Skipper>
203 struct SetGrammar : qi::grammar<Iterator, SetT(), qi::locals<char>, Skipper> {
212 template <
typename Iterator,
typename InnerT,
typename HashT,
typename CompareT,
typename AllocatorT,
218 template <
typename Iterator,
typename PairT,
typename Skipper,
char Delim = ','>
225 kv =
key >> qi::lit( Delim ) >>
val;
226 pair = rep::confix(
'(',
')' )[
kv] | rep::confix(
'[',
']' )[
kv];
230 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename Skipper>
235 template <
typename It,
typename MapT,
typename Skipper>
237 using KeyT =
typename MapT::key_type;
239 using PairT = std::pair<KeyT, MappedT>;
250 kv =
key >> ( qi::lit(
':' ) | qi::lit(
'=' ) ) >>
val;
251 body = -(
kv %
',' ) >> qi::omit[*enc::char_(
',' )];
257 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename KeyCompareT,
typename AllocatorT,
262 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename HashT,
typename KeyEqT,
typename AllocatorT,
267 template <
typename Iterator,
typename KeyT,
typename ValueT,
typename KeyCompareT,
typename AllocatorT,
273 template <
typename Iterator,
typename Po
intT,
typename Skipper>
282 auto const setX = ph::bind( &ResultT::SetX, qi::_val, qi::_1 );
283 auto const setY = ph::bind( &ResultT::SetY, qi::_val, qi::_1 );
284 auto const setZ = ph::bind( &ResultT::SetZ, qi::_val, qi::_1 );
285 list = -( enc::no_case[qi::lit(
"x" ) | qi::lit(
"px" )] >>
':' ) >>
scalar[setX] >>
',' >>
286 -( enc::no_case[qi::lit(
"y" ) | qi::lit(
"py" )] >>
':' ) >>
scalar[setY] >>
',' >>
287 -( enc::no_case[qi::lit(
"z" ) | qi::lit(
"pz" )] >>
':' ) >>
scalar[setZ];
292 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
297 template <
typename Iterator,
typename T1,
typename T2,
typename Skipper>
302 template <
typename Iterator,
typename Po
intT,
typename Skipper>
312 auto const setPx = ph::bind( &ResultT::SetPx, qi::_val, qi::_1 );
313 auto const setPy = ph::bind( &ResultT::SetPy, qi::_val, qi::_1 );
314 auto const setPz = ph::bind( &ResultT::SetPz, qi::_val, qi::_1 );
315 auto const setE = ph::bind( &ResultT::SetE, qi::_val, qi::_1 );
316 auto const setXYZ = ph::bind(
318 out.SetPx( in.Px() );
319 out.SetPy( in.Py() );
320 out.SetPz( in.Pz() );
325 e = -( enc::no_case[enc::char_(
"te" )] >>
':' ) >>
scalar[qi::_val = qi::_1];
328 list3d = -( enc::no_case[qi::lit(
"x" ) | qi::lit(
"px" )] >>
':' ) >>
scalar[setPx] >>
',' >>
329 -( enc::no_case[qi::lit(
"y" ) | qi::lit(
"py" )] >>
':' ) >>
scalar[setPy] >>
',' >>
330 -( enc::no_case[qi::lit(
"z" ) | qi::lit(
"pz" )] >>
':' ) >>
scalar[setPz];
337 (
point3d[setXYZ] >> enc::char_(
";," ) >>
e[setE] ) | (
e[setE] >> enc::char_(
";," ) >>
point3d[setXYZ] );
344 template <
typename Iterator,
typename T1,
typename Skipper>
349 template <
typename Iterator,
typename Skipper>
368 val1 =
title[setTitle] >>
',' >> qi::double_[setLo] >>
',' >> qi::double_[setHi] >> -(
',' >> qi::int_[setBins] );
371 val2 = qi::double_[setLo] >>
',' >> qi::double_[setHi] >>
',' >>
title[setTitle] >> -(
',' >> qi::int_[setBins] );
374 val3 = qi::double_[setLo] >>
',' >> qi::double_[setHi] >> -(
',' >>
title[setTitle] ) >>
375 -(
',' >> qi::int_[setBins] );
383 template <
typename Iterator,
typename Skipper>
384 struct KeyValueGrammar : qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
385 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.
SkipperGrammar< IteratorT > Skipper
qi::rule< Iterator, bool(), Skipper > boolean_literal
qi::symbols< char, bool > kw
qi::rule< Iterator, char(), Skipper > ch
IntGrammar< Iterator, T, Skipper > Grammar
TupleGrammar< Iterator, Skipper, Ts... > Grammar
MapGrammar< Iterator, std::unordered_map< KeyT, ValueT, HashT, KeyEqT, AllocatorT >, Skipper > Grammar
VectorGrammar< Iterator, std::list< InnerT, AllocatorT >, Skipper > Grammar
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
MapGrammar< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
VectorGrammar< Iterator, std::set< InnerT, CompareT, AllocatorT >, Skipper > Grammar
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
SetGrammar< Iterator, std::unordered_set< InnerT, HashT, CompareT, AllocatorT >, Skipper > Grammar
qi::rule< Iterator, ResultT(), Skipper > hist
qi::rule< Iterator, ResultT(), Skipper > val3
qi::rule< Iterator, ResultT(), Skipper > val2
Gaudi::Histo1DDef ResultT
StringGrammar< Iterator, Skipper > title
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
typename MapT::mapped_type MappedT
std::pair< KeyT, MappedT > PairT
qi::rule< Iterator, std::vector< PairT >(), Skipper > bracketed
Grammar_< Iterator, MappedT, Skipper >::Grammar val
typename MapT::key_type KeyT
qi::rule< Iterator, std::vector< PairT >(), Skipper > body
qi::rule< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >(), Skipper > map
Grammar_< Iterator, KeyT, Skipper >::Grammar key
qi::rule< Iterator, PairT(), Skipper > kv
Grammar_< Iterator, typenamePairT::first_type, Skipper >::Grammar key
qi::rule< Iterator, std::pair< KeyT, ValueT >(), Skipper > kv
Grammar_< Iterator, typenamePairT::second_type, Skipper >::Grammar val
qi::rule< Iterator, std::pair< KeyT, ValueT >(), Skipper > pair
typename PointT::Scalar Scalar
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
qi::rule< Iterator, ResultT(), Skipper > list
qi::rule< Iterator, ResultT(), Skipper > point
qi::rule< Iterator, ResultT(), Skipper > list4d
qi::rule< Iterator, ResultT(), Skipper > list3d
qi::rule< Iterator, ResultT(), Skipper > point4d
qi::rule< Iterator, ResultT(), Skipper > point3d
typename PointT::Scalar ScalarT
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< Iterator > comments
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
qi::rule< It, std::string()> dq_body
qi::rule< It, std::string()> sq_body
qi::rule< Iterator, std::tuple< Ts... >(), Skipper > body
std::tuple< typename Grammar_< Iterator, Ts, Skipper >::Grammar... > elems
void init(std::index_sequence< Is... >)
qi::rule< Iterator, std::tuple< Ts... >(), Skipper > tuple
qi::rule< Iterator, Skipper > trailing_commas
qi::rule< Iterator, ResultT(), Skipper > vec
typename VectorT::value_type value_type
qi::rule< Iterator, ResultT(), Skipper > list
Grammar_< Iterator, value_type, Skipper >::Grammar element
qi::rule< Iterator, ResultT(), Skipper > body