Belle II Software  release-08-01-10
DecayStringGrammar.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 #define BOOST_SPIRIT_UNICODE
11 #include <boost/spirit/include/qi.hpp>
12 #include <analysis/DecayDescriptor/DecayStringParticle.h>
13 #include <analysis/DecayDescriptor/DecayStringDecay.h>
14 #include <analysis/DecayDescriptor/DecayString.h>
15 #include <vector>
16 #include <string>
17 
18 namespace Belle2 {
29  template <typename Iterator>
30  struct DecayStringGrammar : boost::spirit::qi::grammar<Iterator, DecayString(), boost::spirit::unicode::space_type> {
31  DecayStringGrammar() : DecayStringGrammar::base_type(start)
32  {
33  using boost::spirit::unicode::char_;
34  using boost::spirit::unicode::string;
35  using boost::spirit::unicode::space;
36  using boost::spirit::qi::lit;
37  using boost::spirit::qi::lexeme;
38  using boost::spirit::repeat;
39 
40 
41  // Reserved characters for steering - cppcheck doesn't understand the
42  // boost::spirit syntax so we suppress warnings. we can't initialise
43  // these in the initialisation list because we need things from the
44  // namespace
45  //
46  // cppcheck-suppress incorrectCharBooleanError
47  // cppcheck-suppress useInitializationList
48  reserved = space || '^' || '[' || ']' || '>' || ':' || '.' || '?' || '!' || '@';
49 
50  // particle composed of selector, particle name, and user label: "^D_s+:label"
51  particle %= *selector >> lexeme[+(char_ - reserved)] >> -label;
52  // cppcheck-suppress useInitializationList
53  selector = string("^") | string("@") | string("(misID)") | string("(decay)");
54  label %= lit(":") >> lexeme[+(char_ - reserved)];
55 
56  // Arrow types
57  arrow %= string("->") | string("=direct=>") | string("=norad=>") | string("=exact=>");
58 
59  // Keyword for custom MC Matching
60  keyword = string("...") | string("?nu") | string("!nu") | string("?gamma") | string("!gamma") | string("?addbrems");
62 
63  // Basic decay: mother -> daughterlist
65  daughterdecay %= lit("[") >> decay >> lit("]");
68 
69  // This rule is where the parser starts
70  // The decay string can be either a single decay or a list of decays
71  start %= decay | particle;
72  }
74  boost::spirit::qi::rule<Iterator> reserved;
76  boost::spirit::qi::rule<Iterator, DecayStringParticle(), boost::spirit::unicode::space_type> particle;
78  boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::unicode::space_type> selector;
80  boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::unicode::space_type> label;
82  boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::unicode::space_type> arrow;
84  boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::unicode::space_type> keyword;
86  boost::spirit::qi::rule<Iterator, std::vector<std::string>(), boost::spirit::unicode::space_type> keywordlist;
88  boost::spirit::qi::rule<Iterator, DecayStringDecay(), boost::spirit::unicode::space_type> decay;
90  boost::spirit::qi::rule<Iterator, DecayStringDecay(), boost::spirit::unicode::space_type> daughterdecay;
92  boost::spirit::qi::rule<Iterator, DecayString(), boost::spirit::unicode::space_type> daughter;
94  boost::spirit::qi::rule<Iterator, std::vector<DecayString>(), boost::spirit::unicode::space_type> daughterlist;
96  boost::spirit::qi::rule<Iterator, DecayString(), boost::spirit::unicode::space_type> start;
97  };
99 }
boost::variant< boost::recursive_wrapper< DecayStringDecay >, DecayStringParticle > DecayString
The DecayStringElement can be either a DecayStringDecay or a vector of mother particles.
Definition: DecayString.h:18
map< unsigned, size_t >::const_iterator Iterator
Iteratior for m_map.
Abstract base class for different kinds of events.
Holds the information of a decay.
This class describes the grammar and the syntax elements of decay strings.
boost::spirit::qi::rule< Iterator, DecayString(), boost::spirit::unicode::space_type > start
The rule where the parser starts.
boost::spirit::qi::rule< Iterator, DecayString(), boost::spirit::unicode::space_type > daughter
A daughter particle which can be either a plain particle or a decaying particle.
boost::spirit::qi::rule< Iterator, std::string(), boost::spirit::unicode::space_type > keyword
Syntax keyword.
boost::spirit::qi::rule< Iterator, std::vector< std::string >), boost::spirit::unicode::space_type > keywordlist
The list of the keywords.
boost::spirit::qi::rule< Iterator, std::vector< DecayString >), boost::spirit::unicode::space_type > daughterlist
The list of the daughters, i.e.
boost::spirit::qi::rule< Iterator, DecayStringParticle(), boost::spirit::unicode::space_type > particle
Particle in the decay string: 'selector name label'.
boost::spirit::qi::rule< Iterator > reserved
Reserved characters that are not allowed in particle names or labels.
boost::spirit::qi::rule< Iterator, DecayStringDecay(), boost::spirit::unicode::space_type > decay
Syntax of a decay: 'mother arrow daughters ...'.
boost::spirit::qi::rule< Iterator, DecayStringDecay(), boost::spirit::unicode::space_type > daughterdecay
Syntax of decaying daughter particle.
boost::spirit::qi::rule< Iterator, std::string(), boost::spirit::unicode::space_type > selector
Particles can be selected by preceding '^' symbol.
boost::spirit::qi::rule< Iterator, std::string(), boost::spirit::unicode::space_type > label
Label that can be attached to a particle name, separated by the '/' symbol.
boost::spirit::qi::rule< Iterator, std::string(), boost::spirit::unicode::space_type > arrow
Allowed arrow types.
Holds the information of a particle in the decay string.