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
22 #include "iter_pos.hpp"
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>
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)]
117 [op(qi::_val, Node::kReal)]
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)]
136 [
op(qi::_val, Node::kUnit)];;
137 val = qi::raw[qi::double_]
138 [
op(qi::_val, qi::_1)][
op(qi::_val, Node::kReal)];
144 ph::function<NodeOperations>
op;
147 template<
typename Iterator,
typename Skipper>
152 [
op(qi::_val, Node::kRoot)];
153 shell = rep::confix(
"#!", qi::eol)[*(qi::char_[qi::_a += qi::_1]
154 - qi::eol)][
op(qi::_val,Node::kShell)]
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)];
159 condition = (qi::lit(
"#ifdef")[
op(qi::_a,Node::kIfdef)]
160 | qi::lit(
"#ifndef")[
op(qi::_a,Node::kIfndef)])
162 >> (*statement[
op(qi::_a,qi::_1)])[
op(qi::_val, qi::_a)]
163 >> -(qi::lit(
"#else")[
op(qi::_b,Node::kElse)]
164 >> *statement[
op(qi::_b,qi::_1)])[
op(qi::_val,qi::_b)]
165 >> qi::lit(
"#endif")[
op(qi::_val, Node::kCondition)];
168 [
op(qi::_val, Node::kInclude)];
169 units = qi::lit(
"#units")
171 [
op(qi::_val, Node::kUnits)];
173 [
op(qi::_val, Node::kPrintOptions)];
177 qi::lit(
"on")[
op(qi::_val, Node::kPrintOn)]
178 | qi::lit(
"off")[
op(qi::_val, Node::kPrintOff)]
181 qi::lit(
"printtree")[
op(qi::_val, Node::kPrintTree)]
184 [
op(qi::_val, Node::kDumpFile)];
185 assign =
property[
op(qi::_val, qi::_1)]
186 [
op(qi::_val, Node::kAssign)]
187 >>
oper[
op(qi::_val, qi::_1)]
190 property = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
192 [
op(qi::_val, Node::kProperty)];
194 property[
op(qi::_val, Node::kPropertyRef)];
195 oper = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
196 >> (qi::lit(
"=")[
op(qi::_val, Node::kEqual)]
198 qi::lit(
"+=")[
op(qi::_val, Node::kPlusEqual)]
200 qi::lit(
"-=")[
op(qi::_val, Node::kMinusEqual)]);
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)] %
',')
216 )[
op(qi::_val,Node::kVector)];
218 >> -(
pair[
op(qi::_val, qi::_1)] %
',')
220 [
op(qi::_val, Node::kMap)];
222 >> value[
op(qi::_val,qi::_1)]
223 [
op(qi::_val,Node::kPair)];
225 (
gstring[
op(qi::_val, qi::_1)][
op(qi::_val, Node::kString)])
227 (
gbool[
op(qi::_val, qi::_1)][
op(qi::_val, Node::kBool)])
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_