#ifndef __PLASP__PDDL__EXPRESSIONS__NOT_H #define __PLASP__PDDL__EXPRESSIONS__NOT_H #include #include namespace plasp { namespace pddl { namespace expressions { //////////////////////////////////////////////////////////////////////////////////////////////////// // // Not // //////////////////////////////////////////////////////////////////////////////////////////////////// class Not: public ExpressionCRTP { public: static const Expression::Type ExpressionType = Expression::Type::Not; template static NotPointer parse(Context &context, ExpressionContext &expressionContext, ExpressionParser parseExpression); public: Not(); const Expression *argument() const; private: void setArgument(const Expression *argument); void setArgument(ExpressionPointer &&argument); const Expression *m_argument; ExpressionPointer m_argumentStorage; }; //////////////////////////////////////////////////////////////////////////////////////////////////// template NotPointer Not::parse(Context &context, ExpressionContext &expressionContext, ExpressionParser parseExpression) { auto &parser = context.parser; const auto position = parser.position(); if (!parser.testAndSkip("(") || !parser.testIdentifierAndSkip("not")) { parser.seek(position); return nullptr; } auto expression = std::make_unique(Not()); context.parser.skipWhiteSpace(); // Parse argument expression->setArgument(parseExpression(context, expressionContext)); parser.expect(")"); return expression; } //////////////////////////////////////////////////////////////////////////////////////////////////// } } } #endif