Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (f31105fd)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Grammar.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifndef JOBOPTIONSVC_GRAMMAR_H_
12 #define JOBOPTIONSVC_GRAMMAR_H_
13 // ============================================================================
14 // Includes:
15 // ============================================================================
16 // STD & STL:
17 // ============================================================================
18 #include <string>
19 // ============================================================================
20 // Boost:
21 // ============================================================================
22 #include <boost/phoenix/core.hpp>
23 #include <boost/phoenix/fusion.hpp>
24 #include <boost/phoenix/operator.hpp>
25 #include <boost/phoenix/stl.hpp>
26 #if ( BOOST_VERSION >= 187000 ) && ( BOOST_VERSION < 188000 )
27 # define BOOST_ALLOW_DEPRECATED_HEADERS
28 #endif
29 #include <boost/spirit/include/qi.hpp>
30 #undef BOOST_ALLOW_DEPRECATED_HEADERS
31 #include <boost/spirit/repository/include/qi_confix.hpp>
32 #include <boost/spirit/repository/include/qi_iter_pos.hpp>
33 
34 // ============================================================================
35 // Project:
36 // ============================================================================
37 #include "Node.h"
38 //============================================================================
39 namespace Gaudi {
40  namespace Parsers {
41  // ============================================================================
42  // Namespace aliases:
43  // ============================================================================
44  namespace sp = boost::spirit;
45  namespace ph = boost::phoenix;
46  namespace qi = sp::qi;
47  namespace enc = sp::ascii;
48  namespace rep = sp::repository;
49  //=============================================================================
50  // Grammars
51  //=============================================================================
52  template <typename Iterator>
53  struct SkipperGrammar : qi::grammar<Iterator> {
55  comments = enc::space | rep::confix( "/*", "*/" )[*( qi::char_ - "*/" )] |
56  rep::confix( "//", ( sp::eol | sp::eoi ) )[*( qi::char_ - ( sp::eol | sp::eoi ) )];
57  }
58  qi::rule<Iterator> comments;
59  };
60  // ============================================================================
61  template <typename Iterator, typename Skipper>
62  struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>, Skipper> {
63  //---------------------------------------------------------------------------
65  //---------------------------------------------------------------------
66  StringGrammar() : StringGrammar::base_type( str ) {
67  begin_quote = enc::char_( "\"'" );
68  quote = enc::char_( qi::_r1 );
69 
70  str = qi::lexeme[begin_quote[qi::_a = qi::_1] >>
71  *( ( enc::char_( '\\' ) >> quote( qi::_a ) )[qi::_val += qi::_a] |
72  ( enc::char_[qi::_val += qi::_1] - quote( qi::_a ) ) ) >>
73  quote( qi::_a )];
74  }
75  //-----------------------------------------------------------------------------
76  qi::rule<Iterator, std::string(), qi::locals<char>, Skipper> str;
77  qi::rule<Iterator, char()> begin_quote;
78  qi::rule<Iterator, void( char )> quote;
79  //-----------------------------------------------------------------------------
80  };
81  // ============================================================================
82  template <typename Iterator, typename Skipper>
83  struct IdentifierGrammar : qi::grammar<Iterator, Node(), Skipper> {
84  //-----------------------------------------------------------------------------
86  //-----------------------------------------------------------------------------
88  ident =
89  rep::qi::iter_pos[op( qi::_val, qi::_1 )] >> str[op( qi::_val, qi::_1 )][op( qi::_val, Node::kIdentifier )];
90  str = -qi::lit( "::" )[qi::_val += "::"] >> inner[qi::_val += qi::_1] >>
91  *( qi::lit( "::" ) >> inner[qi::_val += ( "::" + qi::_1 )] );
92  inner = qi::alpha >> *( qi::alnum | qi::char_( '_' ) );
93  }
94  // ----------------------------------------------------------------------------
95  qi::rule<Iterator, Node(), Skipper> ident;
97  qi::rule<Iterator, std::string()> inner;
98  ph::function<NodeOperations> op;
99  };
100  // ============================================================================
101  template <typename Iterator, typename Skipper>
102  struct BoolGrammar : qi::grammar<Iterator, bool(), Skipper> {
103  // ----------------------------------------------------------------------------
104  typedef bool ResultT;
105  // ----------------------------------------------------------------------------
106  BoolGrammar() : BoolGrammar::base_type( boolean ) {
107  boolean = enc::no_case[qi::lit( "true" )[qi::_val = true] | qi::lit( "false" )[qi::_val = false]];
108  }
109  // ----------------------------------------------------------------------------
110  qi::rule<Iterator, bool(), Skipper> boolean;
111  };
112  // ============================================================================
113  template <typename Iterator, typename Skipper>
114  struct RealGrammar : qi::grammar<Iterator, Node(), Skipper> {
115  // ----------------------------------------------------------------------------
116  typedef bool ResultT;
117  //---------------------------------------------------------------------
118  RealGrammar() : RealGrammar::base_type( real ) {
119  real = qi::raw[qi::double_][op( qi::_val, qi::_1 )][op( qi::_val, Node::kReal )] >> -qi::char_( 'L' ) >>
120  -( -qi::char_( '*' ) >> gunit[op( qi::_val, qi::_1 )] );
121  }
122  // ----------------------------------------------------------------------------
123  qi::rule<Iterator, Node(), Skipper> real;
125  ph::function<NodeOperations> op;
126  };
127  // ============================================================================
128  template <typename Iterator, typename Skipper>
129  struct UnitsGrammar : qi::grammar<Iterator, Node(), Skipper> {
130  // ----------------------------------------------------------------------------
131  UnitsGrammar() : UnitsGrammar::base_type( units ) {
132  units = *unit[op( qi::_val, qi::_1 )];
133  unit = rep::qi::iter_pos[op( qi::_val, qi::_1 )] >> val[op( qi::_val, qi::_1 )] >> -qi::lit( '*' ) >>
134  gunit[op( qi::_val, qi::_1 )] >> qi::lit( '=' ) >>
135  val[op( qi::_val, qi::_1 )][op( qi::_val, Node::kUnit )];
136  ;
137  val = qi::raw[qi::double_][op( qi::_val, qi::_1 )][op( qi::_val, Node::kReal )];
138  }
139  // ----------------------------------------------------------------------------
140  qi::rule<Iterator, Node(), Skipper> units, unit, val;
142  ph::function<NodeOperations> op;
143  };
144  // ============================================================================
145  template <typename Iterator, typename Skipper>
146  struct FileGrammar : qi::grammar<Iterator, Node(), Skipper> {
147  FileGrammar() : FileGrammar::base_type( file ) {
148  file = -shell[op( qi::_val, qi::_1 )] >> *( statement[op( qi::_val, qi::_1 )] )[op( qi::_val, Node::kRoot )];
149  shell = rep::confix(
150  "#!",
151  qi::eol )[*( qi::char_[qi::_a += qi::_1] - qi::eol )][op( qi::_val, Node::kShell )][op( qi::_val, qi::_a )];
152  statement = rep::qi::iter_pos[qi::_a = qi::_1] >> ( include | assign | units | print_options | pragma |
153  condition )[qi::_val = qi::_1][op( qi::_val, qi::_a )];
154  condition =
155  ( qi::lit( "#ifdef" )[op( qi::_a, Node::kIfdef )] | qi::lit( "#ifndef" )[op( qi::_a, Node::kIfndef )] ) >>
156  property[op( qi::_val, qi::_1 )] >> ( *statement[op( qi::_a, qi::_1 )] )[op( qi::_val, qi::_a )] >>
157  -( qi::lit( "#else" )[op( qi::_b, Node::kElse )] >>
158  *statement[op( qi::_b, qi::_1 )] )[op( qi::_val, qi::_b )] >>
159  qi::lit( "#endif" )[op( qi::_val, Node::kCondition )];
160  include = qi::lit( "#include" ) >> gstring[op( qi::_val, qi::_1 )][op( qi::_val, Node::kInclude )];
161  units = qi::lit( "#units" ) >> gstring[op( qi::_val, qi::_1 )][op( qi::_val, Node::kUnits )];
162  print_options = qi::lit( "#printOptions" ) >> qi::lit( "full" )[op( qi::_val, Node::kPrintOptions )];
163  pragma = qi::lit( "#pragma" ) >> ( pragma_print | pragma_tree | pragma_dump_file );
164  pragma_print = qi::lit( "print" ) >> enc::no_case[qi::lit( "on" )[op( qi::_val, Node::kPrintOn )] |
165  qi::lit( "off" )[op( qi::_val, Node::kPrintOff )]];
166  pragma_tree = enc::no_case[qi::lit( "printtree" )[op( qi::_val, Node::kPrintTree )]];
167  pragma_dump_file = qi::lit( "dumpfile" ) >> gstring[op( qi::_val, qi::_1 )][op( qi::_val, Node::kDumpFile )];
168  assign = property[op( qi::_val, qi::_1 )][op( qi::_val, Node::kAssign )] >> oper[op( qi::_val, qi::_1 )] >>
169  value[op( qi::_val, qi::_1 )] >> ';';
170  property = rep::qi::iter_pos[op( qi::_val, qi::_1 )] >>
171  ( gidentifier[op( qi::_val, qi::_1 )] % '.' )[op( qi::_val, Node::kProperty )];
172  property_ref %= -qi::lit( '@' ) >> property[op( qi::_val, Node::kPropertyRef )];
173  oper = rep::qi::iter_pos[op( qi::_val, qi::_1 )] >>
174  ( qi::lit( "=" )[op( qi::_val, Node::kEqual )] | qi::lit( "+=" )[op( qi::_val, Node::kPlusEqual )] |
175  qi::lit( "-=" )[op( qi::_val, Node::kMinusEqual )] );
176  value = rep::qi::iter_pos[qi::_a = qi::_1] >> ( map_value | vector_value | simple_value | property |
177  property_ref )[qi::_val = qi::_1][op( qi::_val, qi::_a )];
178  begin_vector =
179  enc::char_( '(' )[qi::_val = ')'] | enc::char_( '[' )[qi::_val = ']'] | enc::char_( '{' )[qi::_val = '}'];
180  end_vector = qi::char_( qi::_r1 );
181  vector_value = ( begin_vector[qi::_a = qi::_1] >> -( value[op( qi::_val, qi::_1 )] % ',' ) >>
182  end_vector( qi::_a ) )[op( qi::_val, Node::kVector )];
183  map_value = ( enc::char_( '{' ) >> -( pair[op( qi::_val, qi::_1 )] % ',' ) >>
184  enc::char_( '}' ) )[op( qi::_val, Node::kMap )];
185  pair =
186  simple_value[op( qi::_val, qi::_1 )] >> ':' >> value[op( qi::_val, qi::_1 )][op( qi::_val, Node::kPair )];
187  simple_value = ( gstring[op( qi::_val, qi::_1 )][op( qi::_val, Node::kString )] ) |
188  ( gbool[op( qi::_val, qi::_1 )][op( qi::_val, Node::kBool )] ) | ( greal[qi::_val = qi::_1] );
189  }
192  qi::rule<Iterator, Node(), qi::locals<std::string>> shell;
193  qi::rule<Iterator, Node(), qi::locals<Iterator>, Skipper> statement, value;
194  qi::rule<Iterator, Node(), qi::locals<char>, Skipper> vector_value;
195  qi::rule<Iterator, Node(), qi::locals<Node, Node>, Skipper> condition;
196  qi::rule<Iterator, char()> begin_vector;
197  qi::rule<Iterator, void( char )> end_vector;
202  ph::function<NodeOperations> op;
203  };
204  // ============================================================================
205  } // namespace Parsers
206 } // namespace Gaudi
207 // ============================================================================
208 #endif // JOBOPTIONSVC_GRAMMAR_H_
Gaudi::Parsers::UnitsGrammar::val
qi::rule< Iterator, Node(), Skipper > val
Definition: Grammar.h:140
Gaudi::Parsers::UnitsGrammar::units
qi::rule< Iterator, Node(), Skipper > units
Definition: Grammar.h:140
Gaudi::Parsers::RealGrammar::RealGrammar
RealGrammar()
Definition: Grammar.h:118
Gaudi::Parsers::StringGrammar::begin_quote
qi::rule< Iterator, char()> begin_quote
Definition: Grammar.h:77
Gaudi::Parsers::Node::kPrintOptions
@ kPrintOptions
Definition: Node.h:59
Gaudi::Parsers::RealGrammar::gunit
IdentifierGrammar< Iterator, Skipper > gunit
Definition: Grammar.h:124
Gaudi::Parsers::Node::kBool
@ kBool
Definition: Node.h:52
std::string
STL class.
Gaudi::Parsers::FileGrammar::oper
qi::rule< Iterator, Node(), Skipper > oper
Definition: Grammar.h:190
Gaudi::Parsers::BoolGrammar::BoolGrammar
BoolGrammar()
Definition: Grammar.h:106
Gaudi::Parsers::Node::kEqual
@ kEqual
Definition: Node.h:43
Gaudi::Parsers::UnitsGrammar::UnitsGrammar
UnitsGrammar()
Definition: Grammar.h:131
Gaudi::Parsers::FileGrammar::file
qi::rule< Iterator, Node(), Skipper > file
Definition: Grammar.h:190
Gaudi::Parsers::Node::kInclude
@ kInclude
Definition: Node.h:37
Gaudi::Parsers::Node::kIdentifier
@ kIdentifier
Definition: Node.h:38
Gaudi::Parsers::Node::kMinusEqual
@ kMinusEqual
Definition: Node.h:45
Gaudi::Parsers::Node::kCondition
@ kCondition
Definition: Node.h:55
Gaudi::Parsers::FileGrammar::simple_value
qi::rule< Iterator, Node(), Skipper > simple_value
Definition: Grammar.h:191
Gaudi::Parsers::FileGrammar::end_vector
qi::rule< Iterator, void(char)> end_vector
Definition: Grammar.h:197
Gaudi::Parsers::FileGrammar::gidentifier
IdentifierGrammar< Iterator, Skipper > gidentifier
Definition: Grammar.h:201
Gaudi::Parsers::Node::kAssign
@ kAssign
Definition: Node.h:42
Gaudi::Parsers::FileGrammar::pair
qi::rule< Iterator, Node(), Skipper > pair
Definition: Grammar.h:191
Gaudi::Parsers::FileGrammar
Definition: Grammar.h:146
Gaudi::Parsers::Node::kPropertyRef
@ kPropertyRef
Definition: Node.h:65
Gaudi::Parsers::IdentifierGrammar::inner
qi::rule< Iterator, std::string()> inner
Definition: Grammar.h:97
GaudiPartProp.Nodes.Node
Node
Definition: Nodes.py:247
Gaudi::Parsers::Node::kProperty
@ kProperty
Definition: Node.h:39
Gaudi::Parsers::FileGrammar::greal
RealGrammar< Iterator, Skipper > greal
Definition: Grammar.h:200
Gaudi::Parsers::Node::kPrintOn
@ kPrintOn
Definition: Node.h:60
Gaudi::Parsers::StringGrammar::StringGrammar
StringGrammar()
Definition: Grammar.h:66
Gaudi::Parsers::Node::kIfdef
@ kIfdef
Definition: Node.h:56
Gaudi::Parsers::Node::kString
@ kString
Definition: Node.h:50
Gaudi::Parsers::FileGrammar::property_ref
qi::rule< Iterator, Node(), Skipper > property_ref
Definition: Grammar.h:190
Gaudi::Parsers::Node::kShell
@ kShell
Definition: Node.h:62
Gaudi::Parsers::SkipperGrammar::SkipperGrammar
SkipperGrammar()
Definition: Grammar.h:54
compareOutputFiles.sp
sp
Definition: compareOutputFiles.py:506
Gaudi::Parsers::FileGrammar::pragma_dump_file
qi::rule< Iterator, Node(), Skipper > pragma_dump_file
Definition: Grammar.h:191
Gaudi::Parsers::FileGrammar::statement
qi::rule< Iterator, Node(), qi::locals< Iterator >, Skipper > statement
Definition: Grammar.h:193
Gaudi::Parsers::Node::kPlusEqual
@ kPlusEqual
Definition: Node.h:44
Gaudi::Parsers::RealGrammar::op
ph::function< NodeOperations > op
Definition: Grammar.h:125
Gaudi::Parsers::FileGrammar::assign
qi::rule< Iterator, Node(), Skipper > assign
Definition: Grammar.h:190
Gaudi::Parsers::FileGrammar::pragma_tree
qi::rule< Iterator, Node(), Skipper > pragma_tree
Definition: Grammar.h:191
Gaudi::Parsers::RealGrammar::real
qi::rule< Iterator, Node(), Skipper > real
Definition: Grammar.h:123
Gaudi::Parsers::FileGrammar::map_value
qi::rule< Iterator, Node(), Skipper > map_value
Definition: Grammar.h:190
Gaudi::Parsers::StringGrammar
Definition: Grammar.h:62
Gaudi::Parsers::FileGrammar::condition
qi::rule< Iterator, Node(), qi::locals< Node, Node >, Skipper > condition
Definition: Grammar.h:195
Gaudi::Parsers::FileGrammar::vector_value
qi::rule< Iterator, Node(), qi::locals< char >, Skipper > vector_value
Definition: Grammar.h:194
Gaudi::Parsers::Node::kUnit
@ kUnit
Definition: Node.h:54
Gaudi::Parsers::StringGrammar::quote
qi::rule< Iterator, void(char)> quote
Definition: Grammar.h:78
Gaudi::Parsers::FileGrammar::begin_vector
qi::rule< Iterator, char()> begin_vector
Definition: Grammar.h:196
Gaudi::Parsers::FileGrammar::op
ph::function< NodeOperations > op
Definition: Grammar.h:202
Gaudi::Parsers::SkipperGrammar::comments
qi::rule< Iterator > comments
Definition: Grammar.h:58
Gaudi::Parsers::BoolGrammar
Definition: Grammar.h:102
Gaudi::Parsers::SkipperGrammar
Definition: Grammar.h:53
Gaudi::Parsers::FileGrammar::units
qi::rule< Iterator, Node(), Skipper > units
Definition: Grammar.h:191
Gaudi::Parsers::IdentifierGrammar::IdentifierGrammar
IdentifierGrammar()
Definition: Grammar.h:87
Gaudi::Parsers::FileGrammar::property
qi::rule< Iterator, Node(), Skipper > property
Definition: Grammar.h:190
Gaudi::Parsers::Node::kDumpFile
@ kDumpFile
Definition: Node.h:64
Gaudi::Parsers::FileGrammar::include
qi::rule< Iterator, Node(), Skipper > include
Definition: Grammar.h:190
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
Gaudi::Parsers::UnitsGrammar::gunit
IdentifierGrammar< Iterator, Skipper > gunit
Definition: Grammar.h:141
Gaudi::Parsers::Node::kVector
@ kVector
Definition: Node.h:46
Gaudi::Parsers::Node::kRoot
@ kRoot
Definition: Node.h:36
Gaudi::Parsers::BoolGrammar::ResultT
bool ResultT
Definition: Grammar.h:104
Gaudi::Parsers::Node::kElse
@ kElse
Definition: Node.h:58
Gaudi::Parsers::Node::kUnits
@ kUnits
Definition: Node.h:53
Gaudi::Parsers::BoolGrammar::boolean
qi::rule< Iterator, bool(), Skipper > boolean
Definition: Grammar.h:110
Gaudi::Parsers::Node::kPrintTree
@ kPrintTree
Definition: Node.h:63
Gaudi::Parsers::UnitsGrammar
Definition: Grammar.h:129
Gaudi::Parsers::IdentifierGrammar::op
ph::function< NodeOperations > op
Definition: Grammar.h:98
Node.h
Gaudi::Parsers::StringGrammar::ResultT
std::string ResultT
Definition: Grammar.h:64
Gaudi::Parsers::UnitsGrammar::unit
qi::rule< Iterator, Node(), Skipper > unit
Definition: Grammar.h:140
Gaudi::Parsers::IdentifierGrammar::str
qi::rule< Iterator, std::string(), Skipper > str
Definition: Grammar.h:96
Gaudi::Parsers::FileGrammar::FileGrammar
FileGrammar()
Definition: Grammar.h:147
Gaudi::Parsers::FileGrammar::print_options
qi::rule< Iterator, Node(), Skipper > print_options
Definition: Grammar.h:191
Gaudi::Parsers::IdentifierGrammar
Definition: Grammar.h:83
Gaudi::Parsers::Node::kPair
@ kPair
Definition: Node.h:48
Gaudi::Parsers::FileGrammar::gstring
StringGrammar< Iterator, Skipper > gstring
Definition: Grammar.h:198
Gaudi::Parsers::Node::kIfndef
@ kIfndef
Definition: Node.h:57
Gaudi::Parsers::Node::kMap
@ kMap
Definition: Node.h:47
Gaudi::Parsers::Node::kReal
@ kReal
Definition: Node.h:51
Gaudi::Parsers::UnitsGrammar::op
ph::function< NodeOperations > op
Definition: Grammar.h:142
Gaudi::Parsers::FileGrammar::pragma_print
qi::rule< Iterator, Node(), Skipper > pragma_print
Definition: Grammar.h:191
Gaudi::Parsers::FileGrammar::pair_value
qi::rule< Iterator, Node(), Skipper > pair_value
Definition: Grammar.h:190
Gaudi::Parsers::RealGrammar::ResultT
bool ResultT
Definition: Grammar.h:116
Gaudi::Parsers::FileGrammar::gbool
BoolGrammar< Iterator, Skipper > gbool
Definition: Grammar.h:199
Gaudi::Parsers::IdentifierGrammar::ident
qi::rule< Iterator, Node(), Skipper > ident
Definition: Grammar.h:95
Gaudi::Parsers::IdentifierGrammar::ResultT
std::string ResultT
Definition: Grammar.h:85
Gaudi::Parsers::FileGrammar::pragma
qi::rule< Iterator, Node(), Skipper > pragma
Definition: Grammar.h:191
Gaudi::Parsers::FileGrammar::shell
qi::rule< Iterator, Node(), qi::locals< std::string > > shell
Definition: Grammar.h:192
Gaudi::Parsers::RealGrammar
Definition: Grammar.h:114
Iterator
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:28
Gaudi::Parsers::Node::kPrintOff
@ kPrintOff
Definition: Node.h:61
Gaudi::Parsers::StringGrammar::str
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
Definition: Grammar.h:76
Gaudi::Parsers::FileGrammar::value
qi::rule< Iterator, Node(), qi::locals< Iterator >, Skipper > value
Definition: Grammar.h:193