#ifndef __PLASP__PDDL__EXPRESSION_H #define __PLASP__PDDL__EXPRESSION_H #include #include namespace plasp { namespace pddl { //////////////////////////////////////////////////////////////////////////////////////////////////// // // Expression // //////////////////////////////////////////////////////////////////////////////////////////////////// class Context; class Domain; class ExpressionContext; class ExpressionVisitor; class Problem; class Expression; using ExpressionPointer = std::unique_ptr; using Expressions = std::vector; namespace expressions { class And; using AndPointer = std::unique_ptr; class At; using AtPointer = std::unique_ptr; class Constant; using ConstantPointer = std::unique_ptr; 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; class Or; using OrPointer = std::unique_ptr; class Predicate; using PredicatePointer = std::unique_ptr; using Predicates = std::vector; class PredicateDeclaration; using PredicateDeclarationPointer = std::unique_ptr; using PredicateDeclarations = std::vector; class PrimitiveType; using PrimitiveTypePointer = std::unique_ptr; using PrimitiveTypes = std::vector; class Unsupported; using UnsupportedPointer = std::unique_ptr; class Variable; using VariablePointer = std::unique_ptr; using Variables = std::vector; } //////////////////////////////////////////////////////////////////////////////////////////////////// class Expression { public: enum class Type { And, At, Binary, Constant, Either, Imply, Not, Or, PredicateDeclaration, Predicate, PrimitiveType, Unsupported, Variable }; public: virtual ~Expression() = default; virtual Type expressionType() const = 0; }; //////////////////////////////////////////////////////////////////////////////////////////////////// template class ExpressionCRTP: public Expression { public: Type expressionType() const override final { return Derived::ExpressionType; } }; //////////////////////////////////////////////////////////////////////////////////////////////////// ExpressionPointer parseLiteral(Context &context, ExpressionContext &expressionContext); ExpressionPointer parseAtomicFormula(Context &context, ExpressionContext &expressionContext); ExpressionPointer parsePreconditionExpression(Context &context, ExpressionContext &expressionContext); ExpressionPointer parseExpression(Context &context, ExpressionContext &expressionContext); ExpressionPointer parseEffectExpression(Context &context, ExpressionContext &expressionContext); //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif