1 #ifndef JOBOPTIONSVC_GRAMMAR_H_ 2 #define JOBOPTIONSVC_GRAMMAR_H_ 14 #include <boost/spirit/include/qi.hpp> 15 #include <boost/spirit/include/phoenix_core.hpp> 16 #include <boost/spirit/include/phoenix_fusion.hpp> 17 #include <boost/spirit/include/phoenix_operator.hpp> 18 #include <boost/spirit/include/phoenix_stl.hpp> 19 #include <boost/spirit/repository/include/qi_confix.hpp> 21 #if BOOST_VERSION <= 104400 24 #include <boost/spirit/repository/include/qi_iter_pos.hpp> 32 namespace Gaudi {
namespace Parsers {
37 namespace ph = boost::phoenix;
38 namespace qi = sp::qi;
39 namespace enc = sp::ascii;
40 namespace rep = sp::repository;
44 template<
typename Iterator>
48 | rep::confix(
"/*",
"*/")[*(qi::char_ -
"*/")]
49 | rep::confix(
"//", (sp::eol | sp::eoi))[*(qi::char_ - (sp::eol | sp::eoi))];
54 template<
typename Iterator,
typename Skipper>
55 struct StringGrammar: qi::grammar<Iterator, std::string(), qi::locals<char>,
61 begin_quote = enc::char_(
"\"'");
62 quote = enc::char_(qi::_r1);
64 str = qi::lexeme[begin_quote[qi::_a = qi::_1] >> *((enc::char_(
'\\')
65 >> quote(qi::_a))[qi::_val += qi::_a]
66 | (enc::char_[qi::_val += qi::_1] - quote(qi::_a)))
70 qi::rule<Iterator, std::string(), qi::locals<char>,
Skipper>
str;
72 qi::rule<Iterator, void(char)>
quote;
76 template<
typename Iterator,
typename Skipper>
82 ident = rep::qi::iter_pos[op(qi::_val, qi::_1)] >> str[op(qi::_val, qi::_1)][op(qi::_val,
Node::kIdentifier)];
83 str = -qi::lit(
"::")[qi::_val +=
"::"] >> inner[qi::_val += qi::_1]
84 >> *(qi::lit(
"::") >> inner[qi::_val += (
"::"+qi::_1)]);
85 inner = qi::alpha >> *(qi::alnum | qi::char_(
'_'));
88 qi::rule<Iterator, Node(), Skipper>
ident;
89 qi::rule<Iterator, std::string(), Skipper>
str;
90 qi::rule<Iterator, std::string()>
inner;
91 ph::function<NodeOperations>
op;
94 template<
typename Iterator,
typename Skipper>
100 boolean = enc::no_case[
101 qi::lit(
"true")[qi::_val=
true]
103 qi::lit(
"false")[qi::_val=
false]
110 template<
typename Iterator,
typename Skipper>
116 real = qi::raw[qi::double_][op(qi::_val, qi::_1)]
118 >> -qi::char_(
'L') >> -(-qi::char_(
'*') >> gunit[op(qi::_val,qi::_1)]);
122 qi::rule<Iterator, Node(), Skipper>
real;
124 ph::function<NodeOperations>
op;
127 template<
typename Iterator,
typename Skipper>
131 units = *unit[op(qi::_val, qi::_1)];
132 unit = rep::qi::iter_pos[op(qi::_val, qi::_1)] >>
133 val[op(qi::_val, qi::_1)]
134 >> -qi::lit(
'*') >> gunit[op(qi::_val, qi::_1)]
135 >> qi::lit(
'=') >> val[op(qi::_val, qi::_1)]
137 val = qi::raw[qi::double_]
142 qi::rule<Iterator, Node(), Skipper> units, unit,
val;
144 ph::function<NodeOperations>
op;
147 template<
typename Iterator,
typename Skipper>
150 file = -shell[op(qi::_val,qi::_1)] >>
151 *(statement[op(qi::_val, qi::_1)])
153 shell = rep::confix(
"#!", qi::eol)[*(qi::char_[qi::_a += qi::_1]
155 [op(qi::_val,qi::_a)];
156 statement = rep::qi::iter_pos[qi::_a = qi::_1]
157 >> (include | assign | units | print_options | pragma
158 | condition)[qi::_val = qi::_1][op(qi::_val,qi::_a)];
162 >> (*statement[op(qi::_a,qi::_1)])[op(qi::_val, qi::_a)]
164 >> *statement[op(qi::_b,qi::_1)])[op(qi::_val,qi::_b)]
166 include = qi::lit(
"#include")
167 >> gstring[op(qi::_val, qi::_1)]
169 units = qi::lit(
"#units")
170 >> gstring[op(qi::_val, qi::_1)]
172 print_options = qi::lit(
"#printOptions") >> qi::lit(
"full")
174 pragma = qi::lit(
"#pragma") >> (pragma_print | pragma_tree |
176 pragma_print = qi::lit(
"print") >> enc::no_case[
180 pragma_tree = enc::no_case[
183 pragma_dump_file = qi::lit(
"dumpfile") >> gstring[op(qi::_val, qi::_1)]
185 assign =
property[op(qi::_val, qi::_1)]
187 >> oper[op(qi::_val, qi::_1)]
188 >> value[op(qi::_val, qi::_1)]
190 property = rep::qi::iter_pos[op(qi::_val, qi::_1)]
191 >> (gidentifier[op(qi::_val, qi::_1)] %
'.')
193 property_ref %= -qi::lit(
'@') >>
195 oper = rep::qi::iter_pos[op(qi::_val, qi::_1)]
201 value = rep::qi::iter_pos[qi::_a = qi::_1]
203 (map_value | vector_value | simple_value |
property |
205 [qi::_val = qi::_1][op(qi::_val, qi::_a)]
207 begin_vector = enc::char_(
'(')[qi::_val=
')']
209 enc::char_(
'[')[qi::_val=
']']
211 enc::char_(
'{')[qi::_val=
'}'];
212 end_vector = qi::char_(qi::_r1);
213 vector_value = (begin_vector[qi::_a = qi::_1]
214 >> -(value[op(qi::_val,qi::_1)] %
',')
215 >> end_vector(qi::_a)
217 map_value = (enc::char_(
'{')
218 >> -(pair[op(qi::_val, qi::_1)] %
',')
221 pair = simple_value[op(qi::_val,qi::_1)] >>
':' 222 >> value[op(qi::_val,qi::_1)]
227 (gbool[op(qi::_val, qi::_1)][op(qi::_val,
Node::kBool)])
229 (greal[qi::_val = qi::_1]);
231 qi::rule<Iterator, Node(), Skipper> file, include, assign,
property,
232 property_ref, oper, map_value, pair_value, simple_value, pair,
units,
233 print_options, pragma, pragma_print, pragma_tree, pragma_dump_file;
234 qi::rule<Iterator, Node(),qi::locals<std::string> >
shell;
235 qi::rule<Iterator, Node(), qi::locals<Iterator>,
Skipper> statement,
value;
244 ph::function<NodeOperations>
op;
249 #endif // JOBOPTIONSVC_GRAMMAR_H_
qi::rule< Iterator, Node(), qi::locals< Node, Node >, Skipper > condition
qi::rule< Iterator, Node(), qi::locals< std::string > > shell
qi::rule< Iterator > comments
qi::rule< Iterator, std::string(), Skipper > str
IdentifierGrammar< Iterator, Skipper > gidentifier
IdentifierGrammar< Iterator, Skipper > gunit
Gaudi::Details::PropertyBase * property(const std::string &name) const
RealGrammar< Iterator, Skipper > greal
qi::rule< Iterator, void(char)> end_vector
qi::rule< Iterator, void(char)> quote
qi::rule< Iterator, Node(), qi::locals< Iterator >, Skipper > value
ph::function< NodeOperations > op
qi::rule< Iterator, Node(), Skipper > real
BoolGrammar< Iterator, Skipper > gbool
qi::rule< Iterator, Node(), Skipper > val
ph::function< NodeOperations > op
qi::rule< Iterator, char()> begin_vector
qi::rule< Iterator, Node(), qi::locals< char >, Skipper > vector_value
qi::rule< Iterator, Node(), Skipper > units
qi::rule< Iterator, Node(), Skipper > ident
qi::rule< Iterator, std::string()> inner
qi::rule< Iterator, bool(), Skipper > boolean
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
StringGrammar< Iterator, Skipper > gstring
ph::function< NodeOperations > op
ph::function< NodeOperations > op
IdentifierGrammar< Iterator, Skipper > gunit
Helper functions to set/get the application return code.
qi::rule< Iterator, char()> begin_quote