1 #ifndef PDDL_PLANNER_REPRESENTATION_GRAMMAR_LISP_EXPRESSION_HPP 2 #define PDDL_PLANNER_REPRESENTATION_GRAMMAR_LISP_EXPRESSION_HPP 4 #include <boost/version.hpp> 5 #include <boost/spirit/include/qi.hpp> 6 #include <boost/spirit/include/phoenix_operator.hpp> 7 #include <boost/spirit/include/phoenix_fusion.hpp> 8 #include <boost/spirit/include/phoenix_stl.hpp> 9 #include <boost/fusion/include/adapt_struct.hpp> 12 #ifdef BOOST_SPIRIT_DEBUG 14 #include <pddl_planner/representation/grammar/Debug.hpp> 15 #warning "SPIRIT DEBUGGING ENABLED" 17 #define GRAMMAR_DEBUG_RULE(X) { using boost::spirit::qi::debug; X.name(#X); debug(X); } 19 #define GRAMMAR_DEBUG_RULE(X) 22 #include <boost/fusion/include/adapt_struct.hpp> 25 #if BOOST_VERSION < 104500 26 #warning "BOOST_VERSION < 104500" 27 #include <boost/fusion/include/adapt_class.hpp> 29 #include <boost/fusion/adapted/adt/adapt_adt.hpp> 30 #include <boost/fusion/include/adapt_adt.hpp> 33 #if BOOST_VERSION < 104500 34 #define PDDL_ACL_FUSION_ADAPT BOOST_FUSION_ADAPT_CLASS 36 #define PDDL_FUSION_ADAPT BOOST_FUSION_ADAPT_ADT 39 #include <pddl_planner/representation/Problem.hpp> 40 #include <base-logging/Logging.hpp> 42 BOOST_FUSION_ADAPT_STRUCT(
49 BOOST_FUSION_ADAPT_STRUCT(
55 namespace qi = boost::spirit::qi;
56 namespace label = qi::labels;
57 namespace fusion = boost::fusion;
58 namespace phoenix = boost::phoenix;
59 namespace spirit = boost::spirit;
60 namespace encoding = boost::spirit::ascii;
63 namespace representation {
78 template <
typename E,
typename P>
83 template<
typename E,
typename P>
86 expression.addParameter(parameter);
92 template<
typename Iterator>
97 quantifier_rule = encoding::string(
"forall") | encoding::string(
"exists");
104 template<
typename Iterator>
109 multi_operator_rule = encoding::char_(
"*+");
116 template<
typename Iterator>
121 binary_operator_rule = encoding::char_(
"-/") | multi_operator;
129 template<
typename Iterator>
134 binary_comparison_rule = encoding::char_(
"><=")
135 | encoding::string(
">=")
136 | encoding::string(
"<=");
145 template<
typename Iterator>
146 struct Label : qi::grammar<Iterator, std::string()>
148 Label() : Label::base_type(label_rule,
"Label-lisp_grammar")
150 label_rule = (qi::alnum >> +(qi::alnum | encoding::char_(
"+-_[]"))) | binary_operator | binary_comparison;
161 template<
typename Iterator>
162 struct Variable : qi::grammar<Iterator, std::string()>
166 variable_rule = encoding::string(
"?") >> +qi::alnum;
173 template<
typename Iterator,
typename Skipper = qi::space_type>
174 struct TypedItem : qi::grammar<Iterator, pddl_planner::representation::TypedItem(), Skipper>
176 TypedItem() : TypedItem::base_type(typed_item_rule,
"TypedItem-lisp_grammar")
178 typed_item_rule = (label | variable) [ phoenix::at_c<0>(label::_val) = label::_1 ]
179 >> *( spirit::lit(
"-")
180 >> label [ phoenix::at_c<1>(label::_val) = label::_1 ]
187 qi::rule<Iterator, pddl_planner::representation::TypedItem(), Skipper>
typed_item_rule;
193 template<
typename Iterator,
typename Skipper = qi::space_type>
194 struct Expression : qi::grammar<Iterator, pddl_planner::representation::Expression(), Skipper>
198 expression_rule = quantifier_expression | general_expression;
199 general_expression =
"(" 200 >> label [ phoenix::at_c<0>(label::_val) = label::_1 ]
204 simple_expression = (
"(" 205 >> label [ phoenix::at_c<0>(label::_val) = label::_1 ]
208 ) | ( variable | label) [ phoenix::at_c<0>(label::_val) = label::_1 ]
211 quantifier_expression = spirit::lit(
"(")
212 >> quantifier [ phoenix::at_c<0>(label::_val) = label::_1 ]
214 >> typedItem [ label::_a = label::_1 ]
217 >> spirit::lit(
")") [ phoenix::at_c<2>(label::_val) = label::_a];
220 expression = general_expression.alias();
229 qi::rule<Iterator, pddl_planner::representation::Expression(), Skipper>
expression_rule;
236 qi::rule<Iterator, pddl_planner::representation::Expression(), Skipper>
expression;
238 qi::rule<Iterator, pddl_planner::representation::Expression(), qi::locals< pddl_planner::representation::TypedItem>, Skipper >
quantifier_expression;
241 template<
typename Iterator,
typename Skipper = qi::space_type>
242 struct ExpressionList : qi::grammar<Iterator, pddl_planner::representation::ExpressionList(), Skipper>
246 expression_list_rule = +expression [ phoenix::push_back(label::_val, label::_1) ];
258 #endif // PDDL_PLANNER_REPRESENTATION_GRAMMAR_LISP_EXPRESSION_HPP BinaryComparison< Iterator > binary_comparison
Definition: Expression.hpp:156
qi::rule< Iterator, std::string()> multi_operator_rule
Definition: Expression.hpp:113
BinaryComparison()
Definition: Expression.hpp:132
Definition: Expression.hpp:174
Variable< Iterator > variable
Definition: Expression.hpp:231
Quantifier()
Definition: Expression.hpp:95
Expression()
Definition: Expression.hpp:196
Definition: Expression.hpp:79
Representation of (LISP) expressions.
Definition: Domain.hpp:274
qi::rule< Iterator, std::string()> label_rule
Definition: Expression.hpp:154
Quantifier< Iterator > quantifier
Definition: Expression.hpp:233
qi::rule< Iterator, pddl_planner::representation::Expression(), Skipper > expression
Definition: Expression.hpp:236
qi::rule< Iterator, ExpressionList(), Skipper > expression_list_rule
Definition: Expression.hpp:250
A tuple representation providing a name/label and a type.
Definition: Domain.hpp:28
std::string Type
Definition: Domain.hpp:18
Variable()
Definition: Expression.hpp:164
std::vector< Expression * > ExpressionPtrList
Definition: Domain.hpp:267
Label< Iterator > label
Definition: Expression.hpp:230
Definition: Expression.hpp:146
qi::rule< Iterator, pddl_planner::representation::Expression(), qi::locals< pddl_planner::representation::TypedItem >, Skipper > quantifier_expression
Definition: Expression.hpp:238
MultiOperator< Iterator > multi_operator
Definition: Expression.hpp:126
Label< Iterator > label
Definition: Expression.hpp:189
qi::rule< Iterator, pddl_planner::representation::Expression(), Skipper > expression_rule
Definition: Expression.hpp:229
Definition: Expression.hpp:105
Definition: PDDLPlannerInterface.cpp:18
MultiOperator()
Definition: Expression.hpp:107
#define GRAMMAR_DEBUG_RULE(X)
Definition: Expression.hpp:19
qi::rule< Iterator, pddl_planner::representation::TypedItem(), Skipper > typed_item_rule
Definition: Expression.hpp:187
void operator()(E &expression, P parameter) const
Definition: Expression.hpp:84
qi::rule< Iterator, std::string()> quantifier_rule
Definition: Expression.hpp:101
Definition: Expression.hpp:242
phoenix::function< addExpressionParameterImpl > addExpressionParameter
Definition: Expression.cpp:8
qi::rule< Iterator, pddl_planner::representation::Expression(), Skipper > simple_expression
Definition: Expression.hpp:237
ExpressionList()
Definition: Expression.hpp:244
Definition: Expression.hpp:130
Label()
Definition: Expression.hpp:148
TypedItem< Iterator, Skipper > typedItem
Definition: Expression.hpp:232
void type
Definition: Expression.hpp:81
BinaryOperator()
Definition: Expression.hpp:119
qi::rule< Iterator, std::string()> binary_operator_rule
Definition: Expression.hpp:125
qi::rule< Iterator, std::string()> binary_comparison_rule
Definition: Expression.hpp:141
Definition: Expression.hpp:162
Definition: Expression.hpp:76
Expression< Iterator, Skipper > expression
Definition: Expression.hpp:251
BinaryOperator< Iterator > binary_operator
Definition: Expression.hpp:155
qi::rule< Iterator, pddl_planner::representation::Expression(), Skipper > general_expression
Definition: Expression.hpp:235
std::string Label
Definition: Domain.hpp:16
Definition: Expression.hpp:117
qi::rule< Iterator, std::string()> variable_rule
Definition: Expression.hpp:170
TypedItem()
Definition: Expression.hpp:176
Definition: Expression.hpp:194
Variable< Iterator > variable
Definition: Expression.hpp:188
Definition: Expression.hpp:93