GrammarsV2.h
Go to the documentation of this file.
1 // ============================================================================
2 #ifndef GAUDIKERNEL_GRAMMARSV2_H
3 #define GAUDIKERNEL_GRAMMARSV2_H 1
4 #ifdef __GNUC__
5 #pragma GCC system_header
6 #endif
7 // ============================================================================
8 // Include files
9 // ============================================================================
10 // STD:
11 //==============================================================================
12 #include <string>
13 #include <vector>
14 #include <list>
15 #include <set>
16 #include <map>
17 #include <tuple>
18 //==============================================================================
19 // Boost:
20 //==============================================================================
21 #include <boost/spirit/include/qi.hpp>
22 #include <boost/fusion/include/unused.hpp>
23 #include <boost/fusion/include/std_pair.hpp>
24 
25 #include <boost/spirit/include/phoenix_core.hpp>
26 #include <boost/spirit/include/phoenix_operator.hpp>
27 
28 #include <boost/utility/enable_if.hpp>
29 #include <boost/type_traits.hpp>
30 
31 #include <boost/spirit/repository/include/qi_confix.hpp>
32 //==============================================================================
33 // Gaudi:
34 //==============================================================================
35 #include "GaudiKernel/VectorMap.h"
36 #include "GaudiKernel/HashMap.h"
37 #include "GaudiKernel/StringKey.h"
40 #include "GaudiKernel/HistoDef.h"
41 //==============================================================================
42 namespace Gaudi { namespace Parsers {
43 //==============================================================================
44 // Namespace aliases:
45 //==============================================================================
46 namespace sp = boost::spirit;
47 namespace ph = boost::phoenix;
48 namespace qi = sp::qi;
49 namespace enc = sp::ascii;
50 namespace rep = sp::repository;
51 //==============================================================================
52 // Grammars
53 //==============================================================================
54 typedef std::string::const_iterator DefaultIterator;
55 typedef enc::space_type DefaultSkipper;
56 //==============================================================================
57 template <typename Iterator, typename T, typename Skipper,
58  class Enable = void>
59 struct Grammar_ {
60  /* READ THIS IF YOUR COMPILE BREAKS ON THE FOLLOWING LINE
61  *
62  * To users: You have to ask developers to implement parser for your type T
63  * To developer: You have to implement and register Grammar for type T
64  *
65  */
66  BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS, (T));
67 };
68 
69 #define REGISTER_GRAMMAR(ResultType, GrammarName) \
70  template <typename Iterator, typename Skipper>\
71  struct Grammar_<Iterator, ResultType, Skipper> \
72  { \
73  typedef GrammarName<Iterator, Skipper> Grammar;\
74  }
75 //==============================================================================
76 template< typename Iterator>
77 struct SkipperGrammar : qi::grammar<Iterator>
78 {
80  comments = enc::space | rep::confix("/*", "*/")[*(qi::char_ - "*/")]
81  |
82  rep::confix("//", (sp::eol | sp::eoi))[*(qi::char_ - (sp::eol|sp::eoi))];
83  }
84  qi::rule<Iterator> comments;
85 };
86 //==============================================================================
87 template< typename Iterator, typename Skipper>
88 struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>,
89  Skipper>
90 {
91 //------------------------------------------------------------------------------
92  typedef std::string ResultT;
93 //------------------------------------------------------------------------------
94  StringGrammar() : StringGrammar::base_type( str ) {
95  begin_quote = enc::char_("\"'");
96  quote = enc::char_(qi::_r1);
97 
98  str = qi::lexeme[begin_quote[qi::_a = qi::_1]
99  > *( (enc::char_('\\') >> quote(qi::_a))[qi::_val += qi::_a]
100  | (enc::char_[qi::_val += qi::_1] - quote(qi::_a))) >
101  quote(qi::_a)]
102  ;
103  }
104 //------------------------------------------------------------------------------
105  qi::rule<Iterator, std::string(), qi::locals<char>, Skipper> str;
106  qi::rule<Iterator, char()> begin_quote;
107  qi::rule<Iterator, void(char)> quote;
108 //------------------------------------------------------------------------------
109 };
110 REGISTER_GRAMMAR(std::string, StringGrammar);
111 REGISTER_GRAMMAR(Gaudi::StringKey, StringGrammar);
112 //==============================================================================
113 template< typename Iterator, typename Skipper>
114 struct CharGrammar : qi::grammar<Iterator, char(), Skipper>
115 {
116  typedef char ResultT;
117  CharGrammar() : CharGrammar::base_type( ch ) {
118  ch = qi::int_parser<char>()
119  |
120  '\'' >> (qi::char_-'\'') >> '\'';
121  }
122  qi::rule<Iterator, char(), Skipper> ch;
123 };
125 //==============================================================================
126 template< typename Iterator, typename Skipper>
127 struct BoolGrammar : qi::grammar<Iterator, bool(), Skipper>
128 {
129  typedef bool ResultT;
132  (qi::lit("true") | "True" | "TRUE" | "1")[qi::_val=true]
133  |
134  (qi::lit("false") | "False" | "FALSE" | "0")[qi::_val=false];
135  }
136  qi::rule<Iterator, bool(), Skipper> boolean_literal;
137 };
139 //==============================================================================
140 template< typename Iterator, typename RT , typename Skipper>
141 struct IntGrammar : qi::grammar<Iterator, RT(), Skipper>
142 {
143  typedef RT ResultT;
144  IntGrammar() : IntGrammar::base_type( integer ) {
145  integer = qi::int_parser<RT>()[qi::_val = qi::_1]
146  >> -qi::no_case[qi::char_('L')];
147  }
148  qi::rule<Iterator, RT(), Skipper> integer;
149 };
150 // ----------------------------------------------------------------------------
151 // Register IntGrammar:
152 // ----------------------------------------------------------------------------
153 template <typename Iterator, typename T, typename Skipper>
154 struct Grammar_<Iterator, T, Skipper,
155  typename boost::enable_if<boost::is_integral<T> >::type>
156 {
158 };
159 //==============================================================================
160 template< typename Iterator, typename RT, typename Skipper>
161 struct RealGrammar : qi::grammar<Iterator, RT(), Skipper>
162 {
163  typedef RT ResultT;
164  RealGrammar() : RealGrammar::base_type(real) {
165  real = qi::real_parser<RT>();
166  }
167  qi::rule<Iterator, RT(), Skipper> real;
168 };
169 // ----------------------------------------------------------------------------
170 // Register RealGrammar:
171 // ----------------------------------------------------------------------------
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 >
175 {
177 };
178 //==============================================================================
179 // Grammar for std::tuples
180 //==============================================================================
181 template<typename T>
183 {
184 };
185 
186 template<typename T>
188 {
189 };
190 
191 template<typename T, typename... Ts>
192 struct tuple_remove_first_type<std::tuple<T, Ts...>>
193 {
194  typedef std::tuple<Ts...> type;
195 };
196 
197 template<typename T, typename... Ts>
198 struct tuple_get_first_type<std::tuple<T, Ts...>>
199 {
200  typedef T type;
201 };
202 
203 // ----------------------------------------------------------------------------
204 
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>
208 {
209  //---------------------------------------------------------------------------
210  typedef TupleT ResultT;
213  //---------------------------------------------------------------------------
214  struct Operations
215  {
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; };
220  //----------------------------------------------------------------------
221 
222  void operator()(ResultT& res, HeadT& head, TailT& tail) const {
223  res = std::tuple_cat(std::tuple<HeadT>(head), tail);
224  }
225  //----------------------------------------------------------------------
226  };
227  //---------------------------------------------------------------------------
229  tup = grHead[qi::_a = qi::_1] >> ',' >> grLast[op(qi::_val, qi::_a, qi::_1)];
230  }
231 
233  typename
235 
236  qi::rule<Iterator, ResultT(), qi::locals<HeadT>, Skipper> tup;
237  ph::function<Operations> op;
238 };
239 
240 template< typename Iterator, typename TupleT, typename Skipper>
241 struct TupleInnerGrammar<Iterator, TupleT, 1, Skipper>: qi::grammar<Iterator,
242  TupleT(), Skipper>
243 {
244  //---------------------------------------------------------------------------
245  typedef TupleT ResultT;
246  //typedef typename ResultT::value_type Tuple1T;
247  //---------------------------------------------------------------------------
248  struct Operations
249  {
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; };
254  //---------------------------------------------------------------------
255  void operator()(ResultT& res,
256  const typename std::tuple_element<0, ResultT>::type& val) const {
257  res = ResultT();
258  std::get<0>(res) = val;
259  }
260  //----------------------------------------------------------------------
261  };
262  //---------------------------------------------------------------------------
264  tup = grFirst[op(qi::_val, qi::_1)];
265  }
266 
267  typename
269  Skipper>::Grammar grFirst;
270 
271  qi::rule<Iterator, ResultT(), Skipper> tup;
272  ph::function<Operations> op;
273 };
274 
275 // ----------------------------------------------------------------------------
276 template< typename Iterator, typename TupleT, std::size_t N, typename Skipper>
277 struct TupleGrammar : qi::grammar<Iterator, TupleT(), qi::locals<char>, Skipper>
278 {
279  typedef TupleT ResultT;
280  TupleGrammar(): TupleGrammar::base_type(tup) {
281  begin = enc::char_('[')[qi::_val=']'] | enc::char_('(')[qi::_val=')'];
282  end = enc::char_(qi::_r1);
283 
284  tup = begin[qi::_a = qi::_1] >> grTuple[qi::_val = qi::_1] >> end(qi::_a);
285  }
286 
287  qi::rule<Iterator, char()> begin;
288  qi::rule<Iterator, void(char)> end;
289  qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper> tup;
291 };
292 
293 // -----------------------------------------------------------------------------
294 // Register TupleGrammar for std::tuple:
295 // ----------------------------------------------------------------------------
296 template <typename Iterator, typename Skipper, typename... Args>
297 struct Grammar_<Iterator, std::tuple<Args...>, Skipper>
298 {
299  typedef
300  TupleGrammar<Iterator, std::tuple<Args...>, sizeof...(Args ),
301  Skipper> Grammar;
302 };
303 //==============================================================================
304 template< typename Iterator, typename VectorT, typename Skipper>
305 struct VectorGrammar : qi::grammar<Iterator,
306  VectorT(), qi::locals<char>,Skipper>
307 {
308 //------------------------------------------------------------------------------
309  typedef VectorT ResultT;
310 //------------------------------------------------------------------------------
311  VectorGrammar() : VectorGrammar::base_type(vec) {
312  begin = enc::char_('[')[qi::_val=']'] | enc::char_('{')[qi::_val='}']
313  | enc::char_('(')[qi::_val=')'];
314  end = enc::char_(qi::_r1);
315  list = elementGrammar % ',';
316  vec = begin[qi::_a = qi::_1] >> -list[qi::_val=qi::_1] >> end(qi::_a);
317  }
318 // ----------------------------------------------------------------------------
319  typename
322  qi::rule<Iterator, char()> begin;
323  qi::rule<Iterator, void(char)> end;
324 
325  qi::rule<Iterator, ResultT(), qi::locals<char>,Skipper> vec;
326  qi::rule<Iterator, ResultT(), Skipper> list;
327 // ----------------------------------------------------------------------------
328 };
329 // ----------------------------------------------------------------------------
330 // Register VectorGrammar for std::vector:
331 // ----------------------------------------------------------------------------
332 template <typename Iterator, typename InnerT, typename AllocatorT,
333  typename Skipper>
334 struct Grammar_<Iterator, std::vector<InnerT, AllocatorT>, Skipper >
335 {
336  typedef
339 };
340 // ----------------------------------------------------------------------------
341 // Register VectorGrammar for std::list:
342 // ----------------------------------------------------------------------------
343 template <typename Iterator, typename InnerT, typename AllocatorT,
344  typename Skipper>
345 struct Grammar_<Iterator, std::list<InnerT, AllocatorT>, Skipper >
346 {
347  typedef
350 };
351 // ----------------------------------------------------------------------------
352 // Register VectorGrammar for std::set:
353 // ----------------------------------------------------------------------------
354 template <typename Iterator, typename InnerT, typename CompareT,
355  typename AllocatorT, typename Skipper>
356 struct Grammar_<Iterator, std::set<InnerT, CompareT, AllocatorT>, Skipper >
357 {
358  typedef
361 };
362 
363 //==============================================================================
364 template< typename Iterator, typename PairT, typename Skipper>
365 struct PairGrammar :
366  qi::grammar<Iterator,PairT(), qi::locals<char>, Skipper> {
367 //------------------------------------------------------------------------------
368  typedef PairT ResultT;
369  typedef typename PairT::first_type first_type;
370  typedef typename PairT::second_type second_type;
371 //------------------------------------------------------------------------------
372  PairGrammar() : PairGrammar::base_type(pair) {
373  init(",");
374  }
375 
376  PairGrammar(const std::string& delimeter) : PairGrammar::base_type(pair) {
377  init(delimeter);
378  }
379 //------------------------------------------------------------------------------
380  struct first {};
381  struct second {};
382  void init(const std::string& delimeter) {
383  begin = enc::char_('(')[qi::_val=')']
384  |
385  enc::char_('[')[qi::_val=']'];
386  end = qi::char_(qi::_r1);
387  pair = begin[qi::_a = qi::_1] >> pair_in[qi::_val = qi::_1] >> end(qi::_a);
388  pair_in = key >> qi::lit(delimeter) >> value;
389  }
390 // ----------------------------------------------------------------------------
391  typename
393  typename
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;
400  //ph::function<Operations> op;
401 // ----------------------------------------------------------------------------
402 }; // END PairGrammar
403 // ----------------------------------------------------------------------------
404 // Register PairGrammar:
405 // ----------------------------------------------------------------------------
406 template <typename Iterator, typename KeyT, typename ValueT,
407  typename Skipper>
408 struct Grammar_<Iterator, std::pair<KeyT, ValueT>, Skipper >
409 {
411 };
412 // ============================================================================
413 template< typename Iterator, typename MapT, typename Skipper>
414 struct MapGrammar : qi::grammar<Iterator,MapT(), Skipper>
415 {
416 //------------------------------------------------------------------------------
417  typedef MapT ResultT;
418  typedef typename MapT::key_type KeyT;
419  typedef typename MapT::mapped_type MappedT;
420  typedef std::pair<KeyT, MappedT> PairT;
421 
422  typedef std::vector<PairT> VectorPairT;
423 //------------------------------------------------------------------------------
424  struct tag_key{};
425  struct tag_mapped{};
426  struct Operations
427  {
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; };
432  //----------------------------------------------------------------------
433  void operator()(ResultT& res, const VectorPairT& vec) const{
434  for(typename VectorPairT::const_iterator cur = vec.begin();
435  cur != vec.end(); cur++){
436  res.insert(*cur);
437  }
438  }
439  void operator()(PairT& res, const KeyT& key, tag_key) const{
440  res.first = key;
441  }
442  void operator()(PairT& res, const MappedT& value, tag_mapped) const{
443  res.second = value;
444  }
445  //----------------------------------------------------------------------
446  };
447 //------------------------------------------------------------------------------
448  MapGrammar() : MapGrammar::base_type(map) {
449  pair = key[op(qi::_val,qi::_1, tag_key())] > (qi::lit(':') | '=') >
450  value[op(qi::_val,qi::_1, tag_mapped())];
451  list = -(pair % enc::char_(','));
452  map = (('[' >> list >> ']')
453  | ('{' >> list >> '}'))[op(qi::_val,qi::_1)];
454  }
455 // ----------------------------------------------------------------------------
456  typename
458  typename
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;
464 // ----------------------------------------------------------------------------
465 };
466 // ----------------------------------------------------------------------------
467 // Register MapGrammar for std::map:
468 // ----------------------------------------------------------------------------
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>,
472  Skipper > {
473  typedef MapGrammar<Iterator,
474  std::map<KeyT, ValueT, KeyCompareT, AllocatorT>, Skipper> Grammar;
475 };
476 // ----------------------------------------------------------------------------
477 // Register MapGrammar for GaudiUtils::VectorMap:
478 // ----------------------------------------------------------------------------
479 template <typename Iterator, typename KeyT, typename ValueT,
480  typename KeyCompareT, typename AllocatorT, typename Skipper>
481 struct Grammar_<Iterator, GaudiUtils::VectorMap<KeyT, ValueT,
482  KeyCompareT, AllocatorT>, Skipper>
483 {
484  typedef MapGrammar<Iterator,
486  Skipper> Grammar;
487 };
488 // ============================================================================
489 template< typename Iterator, typename PointT, typename Skipper>
490 struct Pnt3DGrammar : qi::grammar<Iterator, PointT(), Skipper> {
491  typedef PointT ResultT;
492  typedef typename PointT::Scalar Scalar;
493 // ----------------------------------------------------------------------------
494  struct Operations {
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; };
499  void operator()(ResultT& res, const Scalar& scalar,
500  const char xyz) const{
501  switch(xyz){
502  case 'x': res.SetX(scalar); break;
503  case 'y': res.SetY(scalar); break;
504  case 'z': res.SetZ(scalar); break;
505  default: break;
506  }
507  }
508  }; // Operations
509 // ----------------------------------------------------------------------------
510  Pnt3DGrammar() : Pnt3DGrammar::base_type(point) {
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')];
518  }
519 // ----------------------------------------------------------------------------
520  qi::rule<Iterator, ResultT(), Skipper> point, list;
522  ph::function<Operations> op;
523 // ----------------------------------------------------------------------------
524 }; // Pnt3DGrammar
525 // ----------------------------------------------------------------------------
526 // Register Pnt3DGrammar for ROOT::Math::PositionVector3D:
527 // ----------------------------------------------------------------------------
528 template <typename Iterator, typename T1, typename T2, typename Skipper>
529 struct Grammar_<Iterator, ROOT::Math::PositionVector3D<T1,T2>, Skipper>{
530  typedef
533 };
534 // ----------------------------------------------------------------------------
535 // Register Pnt3DGrammar for ROOT::Math::DisplacementVector3D:
536 // ----------------------------------------------------------------------------
537 template <typename Iterator, typename T1, typename T2, typename Skipper>
538 struct Grammar_<Iterator, ROOT::Math::DisplacementVector3D<T1,T2>, Skipper>{
539  typedef
542 };
543 // ============================================================================
544 template< typename Iterator, typename PointT, typename Skipper>
545 struct Pnt4DGrammar : qi::grammar<Iterator, PointT(), Skipper>
546 {
547  typedef PointT ResultT;
548  typedef typename PointT::Scalar ScalarT;
549 //-----------------------------------------------------------------------------
550  struct Operations {
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; };
555 
556  void operator()(ResultT& res, const ScalarT& scalar,
557  const char xyz) const{
558  switch(xyz){
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;
563  default: break;
564  }
565  }
566  void operator()(ResultT& res, const ResultT& xyz) const{
567  res.SetPx(xyz.Px());
568  res.SetPy(xyz.Py());
569  res.SetPz(xyz.Pz());
570  }
571  }; // Operations
572 // ----------------------------------------------------------------------------
574  point4d = list4d | ('(' >> list4d >> ')') | ('[' >> list4d >> ']');
575  list4d = (point3d[op(qi::_val,qi::_1)] >> enc::char_(";,")
576  >> e[op(qi::_val, qi::_1, 'e')])
577  |
578  (e[op(qi::_val,qi::_1, 'e')] >> enc::char_(";,")
579  >> point3d[op(qi::_val, qi::_1)]);
580  e = -(enc::no_case[enc::char_("te")] >> ':')
581  >> scalar[qi::_val = qi::_1];
582 
583  point3d = list3d | ('(' >> list3d >> ')') | ('[' >> list3d >> ']');
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')];
590  }
591 // ----------------------------------------------------------------------------
592  qi::rule<Iterator, ResultT(), Skipper> point3d, point4d, list3d,
593  list4d;
594  qi::rule<Iterator, ScalarT(), Skipper> e;
596  ph::function<Operations> op;
597 // ----------------------------------------------------------------------------
598 }; // Pnt4DGrammar
599 // ----------------------------------------------------------------------------
600 // Register Pnt4DGrammar for ROOT::Math::LorentzVector:
601 // ----------------------------------------------------------------------------
602 template <typename Iterator, typename T1, typename Skipper>
603 struct Grammar_<Iterator, ROOT::Math::LorentzVector<T1>, Skipper >
604 {
607 };
608 // ============================================================================
609 template< typename Iterator, typename Skipper>
610 struct Histo1DGrammar : qi::grammar<Iterator, Gaudi::Histo1DDef(),
611  qi::locals<char>, Skipper>
612 {
614 // ----------------------------------------------------------------------------
615  struct Operations {
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; };
620  void operator()(ResultT& res, const std::string& title) const{
621  res.setTitle(title);
622  }
623  void operator()(ResultT& res, const double& val, const char lh) const{
624  switch (lh) {
625  case 'l': res.setLowEdge(val); break;
626  case 'h': res.setHighEdge(val); break;
627  default: break;
628  }
629  }
630  void operator()(ResultT& res, int val) const{
631  res.setBins(val);
632  }
633  void operator()(ResultT& res) const{}
634  }; // Operations
635 // ----------------------------------------------------------------------------
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]
652  >> end(qi::_a);
653  }
654 // ----------------------------------------------------------------------------
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;
660  ph::function<Operations> op;
661 // ----------------------------------------------------------------------------
662 }; // Histo1DGrammar
663 // ----------------------------------------------------------------------------
665 // ============================================================================
666 template< typename Iterator, typename Skipper>
668  qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
669 //------------------------------------------------------------------------------
670  typedef std::pair<std::string, std::string> ResultT;
671 //------------------------------------------------------------------------------
672  struct first {};
673  struct second {};
674 
676 //------------------------------------------------------------------------------
677  pair = gstring >> ":" >> +enc::char_;
678  }
679 // ----------------------------------------------------------------------------
681  qi::rule<Iterator, ResultT(), Skipper> pair;
682 // ----------------------------------------------------------------------------
683 }; // END KeyValueGrammar
684 // We don't register KeyalueGrammar because it's a special parser
685 // ============================================================================
686 }} // Gaudi::Parsers
687 //============================================================================
688 #endif
qi::rule< Iterator, ResultT(), Skipper > pair
Definition: GrammarsV2.h:681
The valid represenation of boolean values are:
Definition: Grammar.h:95
The valid represenation of char values are:
Definition: Grammars.h:137
qi::rule< Iterator, ResultT(), Skipper > val3
Definition: GrammarsV2.h:656
qi::rule< Iterator, ResultT(), Skipper > list
Definition: GrammarsV2.h:326
A bit modified version of 'Loki::AssocVector' associative vector from Loki library by Andrei Alexandr...
Definition: VectorMap.h:110
StringGrammar< Iterator, Skipper > gstring
Definition: GrammarsV2.h:680
MapGrammar< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
Definition: GrammarsV2.h:474
void operator()(ResultT &res, const ScalarT &scalar, const char xyz) const
Definition: GrammarsV2.h:556
void operator()(ResultT &res, const std::string &title) const
Definition: GrammarsV2.h:620
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
Definition: GrammarsV2.h:398
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
Definition: GrammarsV2.h:595
Grammar_< Iterator, typename PairT::second_type, Skipper >::Grammar value
Definition: GrammarsV2.h:395
std::vector< PairT > VectorPairT
Definition: GrammarsV2.h:422
qi::rule< Iterator, ResultT(), Skipper > map
Definition: GrammarsV2.h:462
The valid represenation of real values are:
Definition: Grammar.h:111
qi::rule< Iterator, char()> begin
Definition: GrammarsV2.h:396
void operator()(PairT &res, const MappedT &value, tag_mapped) const
Definition: GrammarsV2.h:442
REGISTER_GRAMMAR(std::string, StringGrammar)
The valid represenation of pairs are: ("abc",123) or ("abc","def") Inner types of pair depends on Key...
Definition: Grammars.h:358
qi::rule< Iterator > comments
Definition: Grammar.h:51
qi::rule< Iterator, ResultT(), Skipper > point
Definition: GrammarsV2.h:520
qi::rule< Iterator, void(char)> end
Definition: GrammarsV2.h:323
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
Definition: GrammarsV2.h:289
MapT::mapped_type MappedT
Definition: GrammarsV2.h:419
void operator()(PairT &res, const KeyT &key, tag_key) const
Definition: GrammarsV2.h:439
PairT::first_type first_type
Definition: GrammarsV2.h:369
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
Grammar_< Iterator, typename MapT::mapped_type, Skipper >::Grammar value
Definition: GrammarsV2.h:459
void operator()(ResultT &res, const typename std::tuple_element< 0, ResultT >::type &val) const
Definition: GrammarsV2.h:255
SkipperGrammar< IteratorT > Skipper
qi::rule< Iterator, ResultT(), qi::locals< HeadT >, Skipper > tup
Definition: GrammarsV2.h:236
ph::function< Operations > op
Definition: GrammarsV2.h:522
STL namespace.
StringGrammar< Iterator, Skipper > title
Definition: GrammarsV2.h:659
qi::rule< Iterator, char()> begin
Definition: GrammarsV2.h:322
qi::rule< Iterator, char(), Skipper > ch
Definition: GrammarsV2.h:122
The valid represenation of string values are:
Definition: Grammar.h:55
void operator()(ResultT &res) const
Definition: GrammarsV2.h:633
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
void init(const std::string &delimeter)
Definition: GrammarsV2.h:382
The helper class to represent the efficient "key" for access.
Definition: StringKey.h:35
qi::rule< Iterator, void(char)> quote
Definition: Grammar.h:72
qi::rule< Iterator, ScalarT(), Skipper > e
Definition: GrammarsV2.h:594
qi::rule< Iterator, ResultT(), Skipper > list3d
Definition: GrammarsV2.h:592
Grammar_< Iterator, HeadT, Skipper >::Grammar grHead
Definition: GrammarsV2.h:234
int N
Definition: IOTest.py:90
void operator()(ResultT &res, const double &val, const char lh) const
Definition: GrammarsV2.h:623
qi::rule< Iterator, char()> begin
Definition: GrammarsV2.h:657
3D point typedefs
string type
Definition: gaudirun.py:127
struct GAUDI_API map
Parametrisation class for map-like implementation.
qi::rule< Iterator, ResultT(), Skipper > point3d
Definition: GrammarsV2.h:592
qi::rule< Iterator, Node(), Skipper > real
Definition: Grammar.h:122
ph::function< Operations > op
Definition: GrammarsV2.h:237
qi::rule< Iterator, ResultT(), Skipper > val1
Definition: GrammarsV2.h:656
void operator()(ResultT &res, const Scalar &scalar, const char xyz) const
Definition: GrammarsV2.h:499
VectorGrammar< Iterator, std::list< InnerT, AllocatorT >, Skipper > Grammar
Definition: GrammarsV2.h:349
Simple helper class for description of 1D-histogram The class is targeted to act as the primary "hist...
Definition: HistoDef.h:32
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > hist
Definition: GrammarsV2.h:655
VectorGrammar< Iterator, std::set< InnerT, CompareT, AllocatorT >, Skipper > Grammar
Definition: GrammarsV2.h:360
tuple_get_first_type< TupleT >::type HeadT
Definition: GrammarsV2.h:212
qi::rule< Iterator, ResultT(), Skipper > point4d
Definition: GrammarsV2.h:592
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
Definition: GrammarsV2.h:486
TupleInnerGrammar< Iterator, TailT, N-1, Skipper > grLast
Definition: GrammarsV2.h:232
The valid representation of integers values are:
Definition: Grammars.h:174
std::string::const_iterator DefaultIterator
Definition: GrammarsV2.h:54
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
Definition: GrammarsV2.h:606
The valid represenation of vector are:
Definition: Grammars.h:424
Skipping spaces and comments.
Definition: Grammar.h:45
qi::rule< Iterator, PairT(), Skipper > pair
Definition: GrammarsV2.h:460
qi::rule< Iterator, ResultT(), Skipper > pair_in
Definition: GrammarsV2.h:399
void operator()(ResultT &res, int val) const
Definition: GrammarsV2.h:630
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
Definition: GrammarsV2.h:532
qi::rule< Iterator, void(char)> end
Definition: GrammarsV2.h:397
enc::space_type DefaultSkipper
Definition: GrammarsV2.h:55
void operator()(ResultT &res, const VectorPairT &vec) const
Definition: GrammarsV2.h:433
std::pair< KeyT, MappedT > PairT
Definition: GrammarsV2.h:420
qi::rule< Iterator, bool(), Skipper > boolean_literal
Definition: GrammarsV2.h:136
Grammar_< Iterator, typename PairT::first_type, Skipper >::Grammar key
Definition: GrammarsV2.h:392
qi::rule< Iterator, VectorPairT(), Skipper > list
Definition: GrammarsV2.h:461
The valid represenation of map are:
Definition: Grammars.h:472
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:19
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
Definition: GrammarsV2.h:410
void operator()(ResultT &res, const ResultT &xyz) const
Definition: GrammarsV2.h:566
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
Definition: GrammarsV2.h:541
PairGrammar(const std::string &delimeter)
Definition: GrammarsV2.h:376
Forward declarations for the functions in SerializeSTL.h.
Definition: GaudiHistoID.h:141
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
Definition: Grammar.h:70
tuple_remove_first_type< TupleT >::type TailT
Definition: GrammarsV2.h:211
TupleInnerGrammar< Iterator, TupleT, N, Skipper > grTuple
Definition: GrammarsV2.h:290
Grammar_< Iterator, typename std::tuple_element< 0, ResultT >::type, Skipper >::Grammar grFirst
Definition: GrammarsV2.h:269
qi::rule< Iterator, ResultT(), Skipper > list4d
Definition: GrammarsV2.h:592
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
Definition: GrammarsV2.h:457
ph::function< Operations > op
Definition: GrammarsV2.h:463
qi::rule< Iterator, void(char)> end
Definition: GrammarsV2.h:288
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
Definition: GrammarsV2.h:338
qi::rule< Iterator, RT(), Skipper > integer
Definition: GrammarsV2.h:148
qi::rule< Iterator, void(char)> end
Definition: GrammarsV2.h:658
4D point typedefs
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec
Definition: GrammarsV2.h:325
qi::rule< Iterator, RT(), Skipper > real
Definition: GrammarsV2.h:167
void operator()(ResultT &res, HeadT &head, TailT &tail) const
Definition: GrammarsV2.h:222
PairT::second_type second_type
Definition: GrammarsV2.h:370
qi::rule< Iterator, char()> begin
Definition: GrammarsV2.h:287
qi::rule< Iterator, ResultT(), Skipper > val2
Definition: GrammarsV2.h:656
Helper functions to set/get the application return code.
Definition: __init__.py:1
Grammar_< Iterator, typename VectorT::value_type, Skipper >::Grammar elementGrammar
Definition: GrammarsV2.h:321
Gaudi::Histo1DDef ResultT
Definition: GrammarsV2.h:613
qi::rule< Iterator, char()> begin_quote
Definition: Grammar.h:71
std::pair< std::string, std::string > ResultT
Definition: GrammarsV2.h:670
ph::function< Operations > op
Definition: GrammarsV2.h:596
qi::rule< Iterator, ResultT(), Skipper > list
Definition: GrammarsV2.h:520
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
Definition: GrammarsV2.h:521
ph::function< Operations > op
Definition: GrammarsV2.h:660