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