diff --git a/include/plasp/pddl/Expression.h b/include/plasp/pddl/Expression.h index 29b1215..8f54597 100644 --- a/include/plasp/pddl/Expression.h +++ b/include/plasp/pddl/Expression.h @@ -74,7 +74,38 @@ using Variables = std::vector; class Expression { public: - virtual void accept(ExpressionVisitor &expressionVisitor) const = 0; + enum class Type + { + And, + Binary, + Constant, + Either, + Imply, + Not, + Or, + PredicateDeclaration, + Predicate, + PrimitiveType, + Reference, + Variable + }; + + public: + virtual ~Expression() = default; + + virtual Type expressionType() const = 0; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template +class ExpressionCRTP: public Expression +{ + public: + Type expressionType() const override final + { + return Derived::ExpressionType; + } }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/ExpressionVisitor.h b/include/plasp/pddl/ExpressionVisitor.h deleted file mode 100644 index d5530b4..0000000 --- a/include/plasp/pddl/ExpressionVisitor.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __PLASP__PDDL__EXPRESSION_VISITOR_H -#define __PLASP__PDDL__EXPRESSION_VISITOR_H - -#include - -namespace plasp -{ -namespace pddl -{ - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// -// ExpressionVisitor -// -//////////////////////////////////////////////////////////////////////////////////////////////////// - -class Expression; - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -class ExpressionVisitor -{ - public: - virtual void visit(const Expression &expression) - { - expression.accept(*this); - } -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -} -} - -#endif diff --git a/include/plasp/pddl/expressions/And.h b/include/plasp/pddl/expressions/And.h index 37e14ca..358e80c 100644 --- a/include/plasp/pddl/expressions/And.h +++ b/include/plasp/pddl/expressions/And.h @@ -19,10 +19,9 @@ namespace expressions class And: public NAry { public: - static const std::string Identifier; + static const Expression::Type ExpressionType = Expression::Type::And; - public: - void accept(ExpressionVisitor &expressionVisitor) const override; + static const std::string Identifier; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/expressions/Binary.h b/include/plasp/pddl/expressions/Binary.h index da3455f..e265a93 100644 --- a/include/plasp/pddl/expressions/Binary.h +++ b/include/plasp/pddl/expressions/Binary.h @@ -21,7 +21,7 @@ namespace expressions //////////////////////////////////////////////////////////////////////////////////////////////////// template -class Binary: public Expression +class Binary: public ExpressionCRTP { public: template diff --git a/include/plasp/pddl/expressions/Constant.h b/include/plasp/pddl/expressions/Constant.h index bd642cc..d45ac0b 100644 --- a/include/plasp/pddl/expressions/Constant.h +++ b/include/plasp/pddl/expressions/Constant.h @@ -19,9 +19,11 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class Constant: public Expression +class Constant: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::Constant; + static void parseTypedDeclaration(Context &context, Domain &domain); static void parseTypedDeclarations(Context &context, Domain &domain); static void parseTypedDeclaration(Context &context, Problem &problem); @@ -31,8 +33,6 @@ class Constant: public Expression static Constant *parseAndFind(Context &context, const Problem &problem); public: - void accept(ExpressionVisitor &expressionVisitor) const override; - const std::string &name() const; const PrimitiveType *type() const; diff --git a/include/plasp/pddl/expressions/Either.h b/include/plasp/pddl/expressions/Either.h index dd5ac55..8e49e76 100644 --- a/include/plasp/pddl/expressions/Either.h +++ b/include/plasp/pddl/expressions/Either.h @@ -19,10 +19,9 @@ namespace expressions class Either: public NAry { public: - static const std::string Identifier; + static const Expression::Type ExpressionType = Expression::Type::Either; - public: - void accept(ExpressionVisitor &expressionVisitor) const override; + static const std::string Identifier; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/expressions/Imply.h b/include/plasp/pddl/expressions/Imply.h index 584a4ee..56234a2 100644 --- a/include/plasp/pddl/expressions/Imply.h +++ b/include/plasp/pddl/expressions/Imply.h @@ -19,10 +19,9 @@ namespace expressions class Imply: public Binary { public: - static const std::string Identifier; + static const Expression::Type ExpressionType = Expression::Type::Imply; - public: - void accept(ExpressionVisitor &expressionVisitor) const override; + static const std::string Identifier; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/expressions/NAry.h b/include/plasp/pddl/expressions/NAry.h index 8d1ca6c..d970ed3 100644 --- a/include/plasp/pddl/expressions/NAry.h +++ b/include/plasp/pddl/expressions/NAry.h @@ -21,7 +21,7 @@ namespace expressions //////////////////////////////////////////////////////////////////////////////////////////////////// template -class NAry: public Expression +class NAry: public ExpressionCRTP { public: template diff --git a/include/plasp/pddl/expressions/Not.h b/include/plasp/pddl/expressions/Not.h index c008bf0..ee60814 100644 --- a/include/plasp/pddl/expressions/Not.h +++ b/include/plasp/pddl/expressions/Not.h @@ -18,16 +18,16 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class Not: public Expression +class Not: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::Not; + template static NotPointer parse(Context &context, ExpressionContext &expressionContext, ExpressionParser parseExpression); public: - void accept(ExpressionVisitor &expressionVisitor) const override; - const Expression &argument() const; private: diff --git a/include/plasp/pddl/expressions/Or.h b/include/plasp/pddl/expressions/Or.h index 14a3510..ac75c2e 100644 --- a/include/plasp/pddl/expressions/Or.h +++ b/include/plasp/pddl/expressions/Or.h @@ -19,10 +19,9 @@ namespace expressions class Or: public NAry { public: - static const std::string Identifier; + static const Expression::Type ExpressionType = Expression::Type::Or; - public: - void accept(ExpressionVisitor &expressionVisitor) const override; + static const std::string Identifier; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/expressions/Predicate.h b/include/plasp/pddl/expressions/Predicate.h index deafb51..fca134f 100644 --- a/include/plasp/pddl/expressions/Predicate.h +++ b/include/plasp/pddl/expressions/Predicate.h @@ -16,15 +16,15 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class Predicate: public Expression +class Predicate: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::Predicate; + static PredicatePointer parse(Context &context, ExpressionContext &expressionContext); static PredicatePointer parse(Context &context, const Problem &problem); public: - void accept(ExpressionVisitor &expressionVisitor) const override; - const std::string &name() const; const Expressions &arguments() const; diff --git a/include/plasp/pddl/expressions/PredicateDeclaration.h b/include/plasp/pddl/expressions/PredicateDeclaration.h index 684057f..210f2da 100644 --- a/include/plasp/pddl/expressions/PredicateDeclaration.h +++ b/include/plasp/pddl/expressions/PredicateDeclaration.h @@ -16,14 +16,14 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class PredicateDeclaration: public Expression +class PredicateDeclaration: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::PredicateDeclaration; + static void parse(Context &context, Domain &domain); public: - void accept(ExpressionVisitor &expressionVisitor) const override; - const std::string &name() const; const Variables &arguments() const; diff --git a/include/plasp/pddl/expressions/PrimitiveType.h b/include/plasp/pddl/expressions/PrimitiveType.h index 45a1706..5bd1de1 100644 --- a/include/plasp/pddl/expressions/PrimitiveType.h +++ b/include/plasp/pddl/expressions/PrimitiveType.h @@ -19,9 +19,11 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class PrimitiveType: public Expression +class PrimitiveType: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::PrimitiveType; + static void parseDeclaration(Context &context, Domain &domain); static void parseTypedDeclaration(Context &context, Domain &domain); @@ -31,8 +33,6 @@ class PrimitiveType: public Expression PrimitiveType(); PrimitiveType(std::string name); - void accept(ExpressionVisitor &expressionVisitor) const override; - const std::string &name() const; const std::vector &parentTypes() const; diff --git a/include/plasp/pddl/expressions/Reference.h b/include/plasp/pddl/expressions/Reference.h index 2fe26e2..aedf017 100644 --- a/include/plasp/pddl/expressions/Reference.h +++ b/include/plasp/pddl/expressions/Reference.h @@ -4,7 +4,6 @@ #include #include -#include #include namespace plasp @@ -21,12 +20,12 @@ namespace expressions //////////////////////////////////////////////////////////////////////////////////////////////////// template -class Reference: public Expression +class Reference: public ExpressionCRTP> { public: - Reference(const Type *value); + static const Expression::Type ExpressionType = Expression::Type::Reference; - void accept(ExpressionVisitor &expressionVisitor) const override; + Reference(const Type *value); const Type *value() const; @@ -55,14 +54,6 @@ Reference::Reference(const Type *value) //////////////////////////////////////////////////////////////////////////////////////////////////// -template -void Reference::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*m_value); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - template const Type *Reference::value() const { diff --git a/include/plasp/pddl/expressions/Variable.h b/include/plasp/pddl/expressions/Variable.h index 15439af..16c10e4 100644 --- a/include/plasp/pddl/expressions/Variable.h +++ b/include/plasp/pddl/expressions/Variable.h @@ -16,9 +16,11 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -class Variable: public Expression +class Variable: public ExpressionCRTP { public: + static const Expression::Type ExpressionType = Expression::Type::Variable; + static void parseTypedDeclaration(Context &context, ExpressionContext &expressionContext); static void parseTypedDeclarations(Context &context, ExpressionContext &expressionContext); @@ -26,8 +28,6 @@ class Variable: public Expression const ExpressionContext &expressionContext); public: - void accept(ExpressionVisitor &expressionVisitor) const override; - const std::string &name() const; const Expression *type() const; diff --git a/src/plasp/pddl/expressions/And.cpp b/src/plasp/pddl/expressions/And.cpp index 98e293c..a017773 100644 --- a/src/plasp/pddl/expressions/And.cpp +++ b/src/plasp/pddl/expressions/And.cpp @@ -1,7 +1,5 @@ #include -#include - namespace plasp { namespace pddl @@ -19,13 +17,6 @@ const std::string And::Identifier = "and"; //////////////////////////////////////////////////////////////////////////////////////////////////// -void And::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - } } } diff --git a/src/plasp/pddl/expressions/Constant.cpp b/src/plasp/pddl/expressions/Constant.cpp index 9b5a5dc..78b6fca 100644 --- a/src/plasp/pddl/expressions/Constant.cpp +++ b/src/plasp/pddl/expressions/Constant.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -201,13 +200,6 @@ Constant *Constant::parseAndFind(const std::string &constantName, const Constant //////////////////////////////////////////////////////////////////////////////////////////////////// -void Constant::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - void Constant::setDirty(bool isDirty) { m_isDirty = isDirty; diff --git a/src/plasp/pddl/expressions/Either.cpp b/src/plasp/pddl/expressions/Either.cpp index 97d9663..8f795ec 100644 --- a/src/plasp/pddl/expressions/Either.cpp +++ b/src/plasp/pddl/expressions/Either.cpp @@ -1,7 +1,5 @@ #include -#include - namespace plasp { namespace pddl @@ -19,13 +17,6 @@ const std::string Either::Identifier = "either"; //////////////////////////////////////////////////////////////////////////////////////////////////// -void Either::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - } } } diff --git a/src/plasp/pddl/expressions/Imply.cpp b/src/plasp/pddl/expressions/Imply.cpp index b650d1d..b425c0c 100644 --- a/src/plasp/pddl/expressions/Imply.cpp +++ b/src/plasp/pddl/expressions/Imply.cpp @@ -1,7 +1,5 @@ #include -#include - namespace plasp { namespace pddl @@ -19,13 +17,6 @@ const std::string Imply::Identifier = "imply"; //////////////////////////////////////////////////////////////////////////////////////////////////// -void Imply::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - } } } diff --git a/src/plasp/pddl/expressions/Not.cpp b/src/plasp/pddl/expressions/Not.cpp index 0733b8f..5d54747 100644 --- a/src/plasp/pddl/expressions/Not.cpp +++ b/src/plasp/pddl/expressions/Not.cpp @@ -1,7 +1,5 @@ #include -#include - namespace plasp { namespace pddl @@ -15,13 +13,6 @@ namespace expressions // //////////////////////////////////////////////////////////////////////////////////////////////////// -void Not::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - const Expression &Not::argument() const { return *m_argument; diff --git a/src/plasp/pddl/expressions/Or.cpp b/src/plasp/pddl/expressions/Or.cpp index a1a6f31..67d027b 100644 --- a/src/plasp/pddl/expressions/Or.cpp +++ b/src/plasp/pddl/expressions/Or.cpp @@ -1,7 +1,5 @@ #include -#include - namespace plasp { namespace pddl @@ -19,13 +17,6 @@ const std::string Or::Identifier = "or"; //////////////////////////////////////////////////////////////////////////////////////////////////// -void Or::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - } } } diff --git a/src/plasp/pddl/expressions/Predicate.cpp b/src/plasp/pddl/expressions/Predicate.cpp index 255a051..b17cf1e 100644 --- a/src/plasp/pddl/expressions/Predicate.cpp +++ b/src/plasp/pddl/expressions/Predicate.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -148,13 +147,6 @@ PredicatePointer Predicate::parse(Context &context, const Problem &problem) //////////////////////////////////////////////////////////////////////////////////////////////////// -void Predicate::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - void Predicate::setDeclared() { m_isDeclared = true; diff --git a/src/plasp/pddl/expressions/PredicateDeclaration.cpp b/src/plasp/pddl/expressions/PredicateDeclaration.cpp index e941577..b60de2a 100644 --- a/src/plasp/pddl/expressions/PredicateDeclaration.cpp +++ b/src/plasp/pddl/expressions/PredicateDeclaration.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -54,13 +53,6 @@ void PredicateDeclaration::parse(Context &context, Domain &domain) //////////////////////////////////////////////////////////////////////////////////////////////////// -void PredicateDeclaration::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - void PredicateDeclaration::setDeclared() { m_isDeclared = true; diff --git a/src/plasp/pddl/expressions/PrimitiveType.cpp b/src/plasp/pddl/expressions/PrimitiveType.cpp index b6845e7..525ac70 100644 --- a/src/plasp/pddl/expressions/PrimitiveType.cpp +++ b/src/plasp/pddl/expressions/PrimitiveType.cpp @@ -7,7 +7,6 @@ #include #include #include -#include namespace plasp { @@ -140,13 +139,6 @@ PrimitiveType *PrimitiveType::parseAndFind(Context &context, Domain &domain) //////////////////////////////////////////////////////////////////////////////////////////////////// -void PrimitiveType::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - void PrimitiveType::setDirty(bool isDirty) { m_isDirty = isDirty; diff --git a/src/plasp/pddl/expressions/Variable.cpp b/src/plasp/pddl/expressions/Variable.cpp index a31257d..33bf631 100644 --- a/src/plasp/pddl/expressions/Variable.cpp +++ b/src/plasp/pddl/expressions/Variable.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -162,13 +161,6 @@ const Variable *Variable::parseAndFind(Context &context, const ExpressionContext //////////////////////////////////////////////////////////////////////////////////////////////////// -void Variable::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const -{ - expressionVisitor.visit(*this); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - const std::string &Variable::name() const { return m_name;