From 4ae37603f4db9b5992b111db546dd29d05a965b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Sat, 4 Jun 2016 17:20:25 +0200 Subject: [PATCH] Added support for Imply expression. --- include/plasp/pddl/Expression.h | 3 ++ include/plasp/pddl/expressions/Binary.h | 54 +++++++++++++++++++++++++ include/plasp/pddl/expressions/Imply.h | 52 ++++++++++++++++++++++++ src/plasp/pddl/Expression.cpp | 6 ++- src/plasp/pddl/expressions/Binary.cpp | 38 +++++++++++++++++ src/plasp/pddl/expressions/Imply.cpp | 27 +++++++++++++ 6 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 include/plasp/pddl/expressions/Binary.h create mode 100644 include/plasp/pddl/expressions/Imply.h create mode 100644 src/plasp/pddl/expressions/Binary.cpp create mode 100644 src/plasp/pddl/expressions/Imply.cpp diff --git a/include/plasp/pddl/Expression.h b/include/plasp/pddl/Expression.h index 1b7a49e..565ba1c 100644 --- a/include/plasp/pddl/Expression.h +++ b/include/plasp/pddl/Expression.h @@ -37,6 +37,9 @@ using Constants = std::vector; class Either; using EitherPointer = std::unique_ptr; +class Imply; +using ImplyPointer = std::unique_ptr; + class Not; using NotPointer = std::unique_ptr; diff --git a/include/plasp/pddl/expressions/Binary.h b/include/plasp/pddl/expressions/Binary.h new file mode 100644 index 0000000..135ce06 --- /dev/null +++ b/include/plasp/pddl/expressions/Binary.h @@ -0,0 +1,54 @@ +#ifndef __PLASP__PDDL__EXPRESSIONS__BINARY_H +#define __PLASP__PDDL__EXPRESSIONS__BINARY_H + +#include +#include +#include +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Binary +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class Binary: public Expression +{ + public: + const Expression *leftArgument() const; + const Expression *rightArgument() const; + + protected: + template + void parse(Context &context, const Variables ¶meters, ExpressionParser parseExpression); + + private: + ExpressionPointer m_leftArgument; + ExpressionPointer m_rightArgument; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +void Binary::parse(Context &context, const Variables ¶meters, ExpressionParser parseExpression) +{ + // Assume that expression identifier (imply, exists, etc.) is already parsed + // Parse arguments of the expression + m_leftArgument = parseExpression(context, parameters); + m_rightArgument = parseExpression(context, parameters); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} + +#endif diff --git a/include/plasp/pddl/expressions/Imply.h b/include/plasp/pddl/expressions/Imply.h new file mode 100644 index 0000000..029bfee --- /dev/null +++ b/include/plasp/pddl/expressions/Imply.h @@ -0,0 +1,52 @@ +#ifndef __PLASP__PDDL__EXPRESSIONS__IMPLY_H +#define __PLASP__PDDL__EXPRESSIONS__IMPLY_H + +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Imply +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class Imply: public Binary +{ + public: + template + static ImplyPointer parse(Context &context, const Variables ¶meters, + ExpressionParser parseExpression); + + public: + void accept(ExpressionVisitor &expressionVisitor) const override; + + private: + Imply() = default; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +ImplyPointer Imply::parse(Context &context, const Variables ¶meters, + ExpressionParser parseExpression) +{ + auto expression = std::make_unique(Imply()); + + expression->Binary::parse(context, parameters, parseExpression); + + return expression; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} + +#endif diff --git a/src/plasp/pddl/Expression.cpp b/src/plasp/pddl/Expression.cpp index 1a8e90c..eb4cba6 100644 --- a/src/plasp/pddl/Expression.cpp +++ b/src/plasp/pddl/Expression.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -93,8 +94,9 @@ ExpressionPointer parseExpressionContent(const std::string &expressionIdentifier expression = expressions::Or::parse(context, parameters, parseExpression); else if (expressionIdentifier == "not") expression = expressions::Not::parse(context, parameters, parseExpression); - else if (expressionIdentifier == "imply" - || expressionIdentifier == "exists" + else if (expressionIdentifier == "imply") + expression = expressions::Imply::parse(context, parameters, parseExpression); + else if (expressionIdentifier == "exists" || expressionIdentifier == "forall" || expressionIdentifier == "-" || expressionIdentifier == "=" diff --git a/src/plasp/pddl/expressions/Binary.cpp b/src/plasp/pddl/expressions/Binary.cpp new file mode 100644 index 0000000..9dcf4c0 --- /dev/null +++ b/src/plasp/pddl/expressions/Binary.cpp @@ -0,0 +1,38 @@ +#include + +#include + +#include +#include +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Binary +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const Expression *Binary::leftArgument() const +{ + return m_leftArgument.get(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const Expression *Binary::rightArgument() const +{ + return m_rightArgument.get(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +} diff --git a/src/plasp/pddl/expressions/Imply.cpp b/src/plasp/pddl/expressions/Imply.cpp new file mode 100644 index 0000000..c2c91fb --- /dev/null +++ b/src/plasp/pddl/expressions/Imply.cpp @@ -0,0 +1,27 @@ +#include + +#include + +namespace plasp +{ +namespace pddl +{ +namespace expressions +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Imply +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +void Imply::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const +{ + expressionVisitor.visit(*this); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} +}