Belle II Software development
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
18namespace 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:23
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::vector< std::string >(), boost::spirit::unicode::space_type > keywordlist
The list of the keywords.
boost::spirit::qi::rule< Iterator, std::string(), boost::spirit::unicode::space_type > keyword
Syntax keyword.
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::vector< DecayString >(), boost::spirit::unicode::space_type > daughterlist
The list of the daughters, i.e.
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.