23 #ifndef PLUGINS_PDDL_GRAMMAR_H_
24 #define PLUGINS_PDDL_GRAMMAR_H_
28 namespace pddl_parser {
34 template <
typename Iterator>
35 struct pddl_skipper :
public qi::grammar<Iterator>
37 pddl_skipper() : pddl_skipper::base_type(
skip,
"PDDL")
39 skip = ascii::space | (
';' >> *(qi::char_ - qi::eol));
42 qi::rule<Iterator>
skip;
48 template <
typename Iterator,
typename Skipper = pddl_skipper<Iterator>>
49 struct domain_parser : qi::grammar<Iterator, Domain(), Skipper>
58 name_type = lexeme[alnum >> *(alnum | char_(
'-') | char_(
'_'))];
60 domain_name = lit(
"define") >>
'(' >> lit(
"domain") >> +(char_ -
')') >>
')';
62 requirements =
'(' >> lit(
":requirements") >> *(
':' >> lexeme[*qi::alnum]) >>
')';
76 atom = +(graph -
'(' -
')');
83 duration = lit(
":duration") >>
'(' >>
'=' >> lit(
"?duration") >> uint_ >>
')';
95 qi::rule<Iterator, std::string(), Skipper>
name_type;
98 qi::rule<Iterator, std::string(), Skipper>
domain_name;
101 qi::rule<Iterator, std::vector<std::string>(), Skipper>
requirements;
104 qi::rule<Iterator, pairs_type(), Skipper>
types;
106 qi::rule<Iterator, pair_type(), Skipper>
type_pair;
115 qi::rule<Iterator, pairs_multi_consts(), Skipper>
constants;
120 qi::rule<Iterator, string_pairs_type(), Skipper>
param_pairs;
122 qi::rule<Iterator, predicate_type(), Skipper>
pred;
124 qi::rule<Iterator, std::vector<predicate_type>(), Skipper>
predicates;
127 qi::rule<Iterator, Atom()>
atom;
131 qi::rule<Iterator, Expression(), Skipper>
expression;
135 qi::rule<Iterator, Expression(), Skipper>
effects;
147 qi::rule<Iterator, std::vector<Action>(), Skipper>
actions;
156 template <
typename Iterator,
typename Skipper = pddl_skipper<Iterator>>
166 name_type = lexeme[alnum >> *(alnum | char_(
'-') | char_(
'_'))];
168 problem_name =
'(' >> lit(
"define") >>
'(' >> lit(
"problem") >>
name_type >>
')';
176 atom = +(graph -
'(' -
')');
179 init =
'(' >> lit(
":init") >> +
expression >>
')';
181 goal =
'(' >> lit(
":goal") >> +
expression >>
')';
183 problem = problem_name >>
domain_name >> objects >> init >> goal;
187 qi::rule<Iterator, std::string(), Skipper>
name_type;
190 qi::rule<Iterator, std::string(), Skipper> problem_name;
192 qi::rule<Iterator, std::string(), Skipper>
domain_name;
201 qi::rule<Iterator, pairs_multi_consts(), Skipper> objects;
204 qi::rule<Iterator, Atom()>
atom;
208 qi::rule<Iterator, Expression(), Skipper>
expression;
210 qi::rule<Iterator, Expression(), Skipper> goal;
212 qi::rule<Iterator, std::vector<Expression>(), Skipper> init;
215 qi::rule<Iterator,
Problem(), Skipper> problem;