patrick
/
plasp
Archived
1
0
Fork 0
This repository has been archived on 2023-07-19. You can view files and clone it, but cannot push or open issues or pull requests.
plasp/include/plasp/pddl/expressions/At.h

113 lines
2.6 KiB
C
Raw Normal View History

2016-06-13 19:02:15 +02:00
#ifndef __PLASP__PDDL__EXPRESSIONS__AT_H
#define __PLASP__PDDL__EXPRESSIONS__AT_H
#include <plasp/pddl/Context.h>
#include <plasp/pddl/Expression.h>
namespace plasp
{
namespace pddl
{
namespace expressions
{
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// At
//
////////////////////////////////////////////////////////////////////////////////////////////////////
class At: public ExpressionCRTP<At>
{
public:
static const Expression::Type ExpressionType = Expression::Type::At;
template<typename ExpressionParser>
static AtPointer parse(Context &context, ExpressionContext &expressionContext,
ExpressionParser parseExpression);
static const size_t TimePointStart = std::numeric_limits<size_t>::max();
static const size_t TimePointEnd = std::numeric_limits<size_t>::max() - 1;
public:
At();
2016-09-08 03:42:32 +02:00
ExpressionPointer copy() override;
2016-06-13 19:02:15 +02:00
size_t timePoint() const;
void setArgument(ExpressionPointer argument);
ExpressionPointer argument() const;
ExpressionPointer reduced() override;
ExpressionPointer existentiallyQuantified() override;
2016-09-07 00:34:26 +02:00
ExpressionPointer simplified() override;
void collectParameters(std::set<VariablePointer> &parameters) override;
2016-06-13 19:02:15 +02:00
void print(std::ostream &ostream) const override;
protected:
2016-06-13 19:02:15 +02:00
size_t m_timePoint;
ExpressionPointer m_argument;
2016-06-13 19:02:15 +02:00
};
////////////////////////////////////////////////////////////////////////////////////////////////////
template<typename ExpressionParser>
AtPointer At::parse(Context &context, ExpressionContext &expressionContext,
ExpressionParser parseExpression)
{
2017-05-12 14:17:57 +02:00
auto &tokenizer = context.tokenizer;
2016-06-13 19:02:15 +02:00
2017-05-12 14:17:57 +02:00
const auto position = tokenizer.position();
2016-06-13 19:02:15 +02:00
2017-05-12 14:17:57 +02:00
if (!tokenizer.testAndSkip<std::string>("(")
|| !tokenizer.testIdentifierAndSkip("at"))
2016-06-13 19:02:15 +02:00
{
2017-05-12 14:17:57 +02:00
tokenizer.seek(position);
2016-06-13 19:02:15 +02:00
return nullptr;
}
size_t timePoint;
2017-05-12 14:17:57 +02:00
const auto timePointPosition = tokenizer.position();
2016-06-13 19:02:15 +02:00
2017-05-12 14:17:57 +02:00
if (tokenizer.testIdentifierAndSkip("start"))
2016-06-13 19:02:15 +02:00
timePoint = TimePointStart;
2017-05-12 14:17:57 +02:00
else if (tokenizer.testIdentifierAndSkip("end"))
2016-06-13 19:02:15 +02:00
timePoint = TimePointEnd;
2017-05-12 14:17:57 +02:00
else if (tokenizer.probeNumber())
2016-06-13 19:02:15 +02:00
{
2017-05-12 14:17:57 +02:00
tokenizer.seek(timePointPosition);
timePoint = tokenizer.get<size_t>();
2016-06-13 19:02:15 +02:00
}
else
{
2017-05-12 14:17:57 +02:00
tokenizer.seek(position);
2016-06-13 19:02:15 +02:00
return nullptr;
}
auto expression = AtPointer(new At);
2016-06-13 19:02:15 +02:00
expression->m_timePoint = timePoint;
2017-05-12 14:17:57 +02:00
tokenizer.skipWhiteSpace();
2016-06-13 19:02:15 +02:00
// Parse argument
expression->setArgument(parseExpression(context, expressionContext));
2017-05-12 14:17:57 +02:00
tokenizer.expect<std::string>(")");
2016-06-13 19:02:15 +02:00
return expression;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
}
#endif