From 7baf15d9f03862a12f021baa8c2afd37d915abd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Thu, 2 Jun 2016 17:35:01 +0200 Subject: [PATCH] Implemented And expressions. --- include/plasp/pddl/Expression.h | 3 +- include/plasp/pddl/ExpressionVisitor.h | 2 +- .../plasp/pddl/expressions/AndExpression.h | 53 ++++++++++++++++ .../plasp/pddl/expressions/NAryExpression.h | 63 +++++++++++++++++++ src/CMakeLists.txt | 6 ++ src/plasp/pddl/Action.cpp | 2 +- src/plasp/pddl/Expression.cpp | 26 ++++++-- src/plasp/pddl/expressions/AndExpression.cpp | 29 +++++++++ src/plasp/pddl/expressions/NAryExpression.cpp | 31 +++++++++ 9 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 include/plasp/pddl/expressions/AndExpression.h create mode 100644 include/plasp/pddl/expressions/NAryExpression.h create mode 100644 src/plasp/pddl/expressions/AndExpression.cpp create mode 100644 src/plasp/pddl/expressions/NAryExpression.cpp diff --git a/include/plasp/pddl/Expression.h b/include/plasp/pddl/Expression.h index df8a5b8..481093b 100644 --- a/include/plasp/pddl/Expression.h +++ b/include/plasp/pddl/Expression.h @@ -5,6 +5,7 @@ #include +#include #include namespace plasp @@ -31,7 +32,7 @@ class Expression //////////////////////////////////////////////////////////////////////////////////////////////////// -std::unique_ptr parsePreconditionExpression(utils::Parser &parser, Context &context); +std::unique_ptr parsePreconditionExpression(utils::Parser &parser, Context &context, const Variables ¶meters); //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/ExpressionVisitor.h b/include/plasp/pddl/ExpressionVisitor.h index e6063cb..d5530b4 100644 --- a/include/plasp/pddl/ExpressionVisitor.h +++ b/include/plasp/pddl/ExpressionVisitor.h @@ -21,7 +21,7 @@ class Expression; class ExpressionVisitor { public: - virtual void apply(const Expression &expression) + virtual void visit(const Expression &expression) { expression.accept(*this); } diff --git a/include/plasp/pddl/expressions/AndExpression.h b/include/plasp/pddl/expressions/AndExpression.h new file mode 100644 index 0000000..924d96e --- /dev/null +++ b/include/plasp/pddl/expressions/AndExpression.h @@ -0,0 +1,53 @@ +#ifndef __PLASP__PDDL__EXPRESSION__AND_EXPRESSION_H +#define __PLASP__PDDL__EXPRESSION__AND_EXPRESSION_H + +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// AndExpression +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class AndExpression: public NAryExpression +{ + public: + template + static std::unique_ptr parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression); + + public: + void accept(ExpressionVisitor &expressionVisitor) const override; + + private: + AndExpression() = default; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +std::unique_ptr AndExpression::parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression) +{ + auto expression = std::make_unique(AndExpression()); + + expression->NAryExpression::parse(parser, context, parameters, parseExpression); + + if (expression->arguments().empty()) + throw ConsistencyException("Expressions should not be empty"); + + return expression; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} + +#endif diff --git a/include/plasp/pddl/expressions/NAryExpression.h b/include/plasp/pddl/expressions/NAryExpression.h new file mode 100644 index 0000000..377daef --- /dev/null +++ b/include/plasp/pddl/expressions/NAryExpression.h @@ -0,0 +1,63 @@ +#ifndef __PLASP__PDDL__EXPRESSION__N_ARY_EXPRESSION_H +#define __PLASP__PDDL__EXPRESSION__N_ARY_EXPRESSION_H + +#include +#include +#include + +#include +#include +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// NAryExpression +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class NAryExpression: public Expression +{ + public: + const std::vector> &arguments() const; + + protected: + template + void parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression); + + private: + std::vector> m_arguments; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +void NAryExpression::parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression) +{ + std::cout << "Parsing n-ary predicate" << std::endl; + + parser.skipWhiteSpace(); + + // Assume that expression identifier (and, or, etc.) is already parsed + // Parse arguments of the expression + while (parser.currentCharacter() != ')') + { + m_arguments.emplace_back(parseExpression(parser, context, parameters)); + + parser.skipWhiteSpace(); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} + +#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7aea3d2..c1e765b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,9 @@ file(GLOB core_headers "../include/plasp/*.h") file(GLOB pddl_sources "plasp/pddl/*.cpp") file(GLOB pddl_headers "../include/plasp/pddl/*.h") +file(GLOB pddl_expressions_sources "plasp/pddl/expressions/*.cpp") +file(GLOB pddl_expressions_headers "../include/plasp/pddl/expressions/*.h") + file(GLOB sas_sources "plasp/sas/*.cpp") file(GLOB sas_headers "../include/plasp/sas/*.h") @@ -27,6 +30,9 @@ set(sources ${pddl_sources} ${pddl_headers} + ${pddl_expressions_sources} + ${pddl_expressions_headers} + ${sas_sources} ${sas_headers} diff --git a/src/plasp/pddl/Action.cpp b/src/plasp/pddl/Action.cpp index 6141f48..24113c9 100644 --- a/src/plasp/pddl/Action.cpp +++ b/src/plasp/pddl/Action.cpp @@ -51,7 +51,7 @@ Action &Action::parseDeclaration(utils::Parser &parser, Context &context) const auto sectionIdentifier = parser.parseIdentifier(isIdentifier); if (sectionIdentifier == "precondition") - action->m_precondition = parsePreconditionExpression(parser, context); + action->m_precondition = parsePreconditionExpression(parser, context, action->m_parameters); //else if (sectionIdentifier == "effect") // action->m_effect = parseEffectExpression(parser, context); } diff --git a/src/plasp/pddl/Expression.cpp b/src/plasp/pddl/Expression.cpp index cd1fefe..0bf0b90 100644 --- a/src/plasp/pddl/Expression.cpp +++ b/src/plasp/pddl/Expression.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include namespace plasp @@ -16,7 +16,7 @@ namespace pddl // //////////////////////////////////////////////////////////////////////////////////////////////////// -std::unique_ptr parsePreconditionExpression(utils::Parser &parser, Context &context) +std::unique_ptr parsePreconditionExpression(utils::Parser &parser, Context &context, const Variables ¶meters) { parser.skipWhiteSpace(); @@ -24,16 +24,30 @@ std::unique_ptr parsePreconditionExpression(utils::Parser &parser, C const auto expressionIdentifier = parser.parseIdentifier(isIdentifier); + std::cout << "Parsing identifier " << expressionIdentifier << std::endl; + std::unique_ptr expression; - throw utils::ParserException(parser.row(), parser.column(), "Expression of type \"" + expressionIdentifier + "\" not allowed in preference declaration"); + const auto throwNotAllowed = + [&]() + { + throw utils::ParserException(parser.row(), parser.column(), "Expression of type \"" + expressionIdentifier + "\" not allowed in preference declaration"); + }; - //if (expressionIdentifier == "and") - // expression = NAry + if (expressionIdentifier == "and") + expression = expressions::AndExpression::parse(parser, context, parameters, parsePreconditionExpression); + else if (expressionIdentifier == "or") + throwNotAllowed(); + else if (expressionIdentifier == "not") + throwNotAllowed(); + else if (expressionIdentifier == "exists") + throwNotAllowed(); + else + throw utils::ParserException(parser.row(), parser.column(), "Undeclared expression \"" + expressionIdentifier + "\""); parser.expect(")"); - return std::move(expression); + return expression; } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plasp/pddl/expressions/AndExpression.cpp b/src/plasp/pddl/expressions/AndExpression.cpp new file mode 100644 index 0000000..5dddbac --- /dev/null +++ b/src/plasp/pddl/expressions/AndExpression.cpp @@ -0,0 +1,29 @@ +#include + +#include +#include +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// AndExpression +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +void AndExpression::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const +{ + expressionVisitor.visit(*this); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} diff --git a/src/plasp/pddl/expressions/NAryExpression.cpp b/src/plasp/pddl/expressions/NAryExpression.cpp new file mode 100644 index 0000000..10000d1 --- /dev/null +++ b/src/plasp/pddl/expressions/NAryExpression.cpp @@ -0,0 +1,31 @@ +#include + +#include + +#include +#include +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// NAryExpression +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const std::vector> &NAryExpression::arguments() const +{ + return m_arguments; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +}