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 {
36 namespace sp = boost::spirit;
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>,
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>
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_(
'*') >>
gunit[
op(qi::_val,qi::_1)]);
122 qi::rule<Iterator, Node(), Skipper>
real;
124 ph::function<NodeOperations>
op;
127 template<
typename Iterator,
typename Skipper>
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_]
144 ph::function<NodeOperations>
op;
147 template<
typename Iterator,
typename Skipper>
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]
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)]
169 units = qi::lit(
"#units")
185 assign =
property[
op(qi::_val, qi::_1)]
187 >>
oper[
op(qi::_val, qi::_1)]
190 property = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
195 oper = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
201 value = rep::qi::iter_pos[qi::_a = qi::_1]
205 [qi::_val = qi::_1][
op(qi::_val, qi::_a)]
209 enc::char_(
'[')[qi::_val=
']']
211 enc::char_(
'{')[qi::_val=
'}'];
214 >> -(value[
op(qi::_val,qi::_1)] %
',')
218 >> -(
pair[
op(qi::_val, qi::_1)] %
',')
222 >> value[
op(qi::_val,qi::_1)]
229 (
greal[qi::_val = qi::_1]);
234 qi::rule<Iterator, Node(),qi::locals<std::string> >
shell;
244 ph::function<NodeOperations>
op;
249 #endif // JOBOPTIONSVC_GRAMMAR_H_
qi::rule< Iterator, Node(), Skipper > unit
The valid represenation of boolean values are:
qi::rule< Iterator, Node(), Skipper > units
qi::rule< Iterator, Node(), Skipper > file
qi::rule< Iterator, Node(), Skipper > oper
qi::rule< Iterator, Node(), Skipper > simple_value
The valid represenation of real values are:
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, Node(), Skipper > print_options
qi::rule< Iterator, std::string(), Skipper > str
qi::rule< Iterator, Node(), Skipper > include
IdentifierGrammar< Iterator, Skipper > gidentifier
IdentifierGrammar< Iterator, Skipper > gunit
qi::rule< Iterator, Node(), Skipper > pair
RealGrammar< Iterator, Skipper > greal
The valid represenation of string values are:
qi::rule< Iterator, void(char)> end_vector
qi::rule< Iterator, Node(), Skipper > pair_value
qi::rule< Iterator, void(char)> quote
qi::rule< Iterator, Node(), Skipper > assign
qi::rule< Iterator, Node(), qi::locals< Iterator >, Skipper > statement
qi::rule< Iterator, Node(), qi::locals< Iterator >, Skipper > value
ph::function< NodeOperations > op
qi::rule< Iterator, Node(), Skipper > real
qi::rule< Iterator, Node(), Skipper > pragma_tree
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
Skipping spaces and comments.
qi::rule< Iterator, std::string()> inner
qi::rule< Iterator, Node(), Skipper > property
qi::rule< Iterator, Node(), Skipper > property_ref
qi::rule< Iterator, bool(), Skipper > boolean
qi::rule< Iterator, std::string(), qi::locals< char >, Skipper > str
StringGrammar< Iterator, Skipper > gstring
ph::function< NodeOperations > op
qi::rule< Iterator, Node(), Skipper > map_value
ph::function< NodeOperations > op
IdentifierGrammar< Iterator, Skipper > gunit
This is a number of static methods for bootstrapping the Gaudi framework.
qi::rule< Iterator, Node(), Skipper > pragma_print
qi::rule< Iterator, char()> begin_quote
qi::rule< Iterator, Node(), Skipper > pragma
qi::rule< Iterator, Node(), Skipper > pragma_dump_file