#ifndef __PLASP__PDDL__EXPRESSIONS__AT_H #define __PLASP__PDDL__EXPRESSIONS__AT_H #include #include namespace plasp { namespace pddl { namespace expressions { //////////////////////////////////////////////////////////////////////////////////////////////////// // // At // //////////////////////////////////////////////////////////////////////////////////////////////////// class At: public ExpressionCRTP { public: static const Expression::Type ExpressionType = Expression::Type::At; template static AtPointer parse(Context &context, ExpressionContext &expressionContext, ExpressionParser parseExpression); static const size_t TimePointStart = std::numeric_limits::max(); static const size_t TimePointEnd = std::numeric_limits::max() - 1; public: At(); ExpressionPointer copy() override; size_t timePoint() const; void setArgument(ExpressionPointer argument); ExpressionPointer argument() const; ExpressionPointer reduced() override; ExpressionPointer existentiallyQuantified() override; ExpressionPointer simplified() override; void collectParameters(std::set ¶meters) override; void print(std::ostream &ostream) const override; protected: size_t m_timePoint; ExpressionPointer m_argument; }; //////////////////////////////////////////////////////////////////////////////////////////////////// template AtPointer At::parse(Context &context, ExpressionContext &expressionContext, ExpressionParser parseExpression) { auto &tokenizer = context.tokenizer; const auto position = tokenizer.position(); if (!tokenizer.testAndSkip("(") || !tokenizer.testIdentifierAndSkip("at")) { tokenizer.seek(position); return nullptr; } size_t timePoint; const auto timePointPosition = tokenizer.position(); if (tokenizer.testIdentifierAndSkip("start")) timePoint = TimePointStart; else if (tokenizer.testIdentifierAndSkip("end")) timePoint = TimePointEnd; else if (tokenizer.probeNumber()) { tokenizer.seek(timePointPosition); timePoint = tokenizer.get(); } else { tokenizer.seek(position); return nullptr; } auto expression = AtPointer(new At); expression->m_timePoint = timePoint; tokenizer.skipWhiteSpace(); // Parse argument expression->setArgument(parseExpression(context, expressionContext)); tokenizer.expect(")"); return expression; } //////////////////////////////////////////////////////////////////////////////////////////////////// } } } #endif