Finished basic support for action parsing.
This commit is contained in:
parent
fb5a5a71a5
commit
fcde9c9b6b
58
include/plasp/pddl/expressions/NotExpression.h
Normal file
58
include/plasp/pddl/expressions/NotExpression.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef __PLASP__PDDL__EXPRESSION__NOT_EXPRESSION_H
|
||||||
|
#define __PLASP__PDDL__EXPRESSION__NOT_EXPRESSION_H
|
||||||
|
|
||||||
|
#include <plasp/pddl/Expression.h>
|
||||||
|
#include <plasp/pddl/Predicate.h>
|
||||||
|
|
||||||
|
namespace plasp
|
||||||
|
{
|
||||||
|
namespace pddl
|
||||||
|
{
|
||||||
|
namespace expressions
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// NotExpression
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class NotExpression: public Expression
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename ExpressionParser>
|
||||||
|
static std::unique_ptr<NotExpression> parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void accept(ExpressionVisitor &expressionVisitor) const override;
|
||||||
|
|
||||||
|
const Expression &argument();
|
||||||
|
|
||||||
|
private:
|
||||||
|
NotExpression() = default;
|
||||||
|
|
||||||
|
std::unique_ptr<Expression> m_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template<typename ExpressionParser>
|
||||||
|
std::unique_ptr<NotExpression> NotExpression::parse(utils::Parser &parser, Context &context, const Variables ¶meters, ExpressionParser parseExpression)
|
||||||
|
{
|
||||||
|
auto expression = std::make_unique<NotExpression>(NotExpression());
|
||||||
|
|
||||||
|
parser.skipWhiteSpace();
|
||||||
|
|
||||||
|
// Parse argument
|
||||||
|
expression->m_argument = parseExpression(parser, context, parameters);
|
||||||
|
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -57,8 +57,6 @@ Action &Action::parseDeclaration(utils::Parser &parser, Context &context)
|
|||||||
action->m_effect = parseEffectExpression(parser, context, action->m_parameters);
|
action->m_effect = parseEffectExpression(parser, context, action->m_parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.expect<std::string>(")");
|
|
||||||
|
|
||||||
// Store new action
|
// Store new action
|
||||||
context.actions.emplace_back(std::move(action));
|
context.actions.emplace_back(std::move(action));
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <plasp/pddl/Context.h>
|
#include <plasp/pddl/Context.h>
|
||||||
#include <plasp/pddl/Identifier.h>
|
#include <plasp/pddl/Identifier.h>
|
||||||
#include <plasp/pddl/expressions/AndExpression.h>
|
#include <plasp/pddl/expressions/AndExpression.h>
|
||||||
|
#include <plasp/pddl/expressions/NotExpression.h>
|
||||||
#include <plasp/pddl/expressions/OrExpression.h>
|
#include <plasp/pddl/expressions/OrExpression.h>
|
||||||
#include <plasp/pddl/expressions/PredicateExpression.h>
|
#include <plasp/pddl/expressions/PredicateExpression.h>
|
||||||
#include <plasp/utils/ParserException.h>
|
#include <plasp/utils/ParserException.h>
|
||||||
@ -20,6 +21,7 @@ namespace pddl
|
|||||||
|
|
||||||
std::unique_ptr<Expression> parseExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters);
|
std::unique_ptr<Expression> parseExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters);
|
||||||
std::unique_ptr<Expression> parseEffectBodyExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters);
|
std::unique_ptr<Expression> parseEffectBodyExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters);
|
||||||
|
std::unique_ptr<Expression> parsePredicateExpression(utils::Parser &parser, Context &context, const Variables ¶meters);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -32,8 +34,6 @@ void throwUnsupported(const utils::Parser &parser, const std::string &expression
|
|||||||
|
|
||||||
std::unique_ptr<Expression> parsePreconditionExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
std::unique_ptr<Expression> parsePreconditionExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
||||||
{
|
{
|
||||||
parser.skipWhiteSpace();
|
|
||||||
|
|
||||||
parser.expect<std::string>("(");
|
parser.expect<std::string>("(");
|
||||||
|
|
||||||
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
||||||
@ -59,8 +59,6 @@ std::unique_ptr<Expression> parsePreconditionExpression(utils::Parser &parser, C
|
|||||||
|
|
||||||
std::unique_ptr<Expression> parseExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
std::unique_ptr<Expression> parseExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
||||||
{
|
{
|
||||||
parser.skipWhiteSpace();
|
|
||||||
|
|
||||||
parser.expect<std::string>("(");
|
parser.expect<std::string>("(");
|
||||||
|
|
||||||
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
||||||
@ -84,8 +82,9 @@ std::unique_ptr<Expression> parseExpressionContent(const std::string &expression
|
|||||||
expression = expressions::AndExpression::parse(parser, context, parameters, parseExpression);
|
expression = expressions::AndExpression::parse(parser, context, parameters, parseExpression);
|
||||||
else if (expressionIdentifier == "or")
|
else if (expressionIdentifier == "or")
|
||||||
expression = expressions::OrExpression::parse(parser, context, parameters, parseExpression);
|
expression = expressions::OrExpression::parse(parser, context, parameters, parseExpression);
|
||||||
else if (expressionIdentifier == "not"
|
else if (expressionIdentifier == "not")
|
||||||
|| expressionIdentifier == "imply"
|
expression = expressions::NotExpression::parse(parser, context, parameters, parseExpression);
|
||||||
|
else if (expressionIdentifier == "imply"
|
||||||
|| expressionIdentifier == "exists"
|
|| expressionIdentifier == "exists"
|
||||||
|| expressionIdentifier == "forall"
|
|| expressionIdentifier == "forall"
|
||||||
|| expressionIdentifier == "-"
|
|| expressionIdentifier == "-"
|
||||||
@ -125,14 +124,10 @@ std::unique_ptr<Expression> parseExpressionContent(const std::string &expression
|
|||||||
|
|
||||||
std::unique_ptr<Expression> parseEffectExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
std::unique_ptr<Expression> parseEffectExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
||||||
{
|
{
|
||||||
parser.skipWhiteSpace();
|
|
||||||
|
|
||||||
parser.expect<std::string>("(");
|
parser.expect<std::string>("(");
|
||||||
|
|
||||||
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
const auto expressionIdentifier = parser.parseIdentifier(isIdentifier);
|
||||||
|
|
||||||
std::cout << "Parsing effect expression " << expressionIdentifier << std::endl;
|
|
||||||
|
|
||||||
std::unique_ptr<Expression> expression;
|
std::unique_ptr<Expression> expression;
|
||||||
|
|
||||||
if (expressionIdentifier == "and")
|
if (expressionIdentifier == "and")
|
||||||
@ -154,12 +149,11 @@ std::unique_ptr<Expression> parseEffectExpression(utils::Parser &parser, Context
|
|||||||
|
|
||||||
std::unique_ptr<Expression> parseEffectBodyExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters)
|
std::unique_ptr<Expression> parseEffectBodyExpressionContent(const std::string &expressionIdentifier, utils::Parser &parser, Context &context, const Variables ¶meters)
|
||||||
{
|
{
|
||||||
parser.skipWhiteSpace();
|
|
||||||
|
|
||||||
std::unique_ptr<Expression> expression;
|
std::unique_ptr<Expression> expression;
|
||||||
|
|
||||||
if (expressionIdentifier == "not"
|
if (expressionIdentifier == "not")
|
||||||
|| expressionIdentifier == "="
|
expression = expressions::NotExpression::parse(parser, context, parameters, parsePredicateExpression);
|
||||||
|
else if (expressionIdentifier == "="
|
||||||
|| expressionIdentifier == "assign"
|
|| expressionIdentifier == "assign"
|
||||||
|| expressionIdentifier == "scale-up"
|
|| expressionIdentifier == "scale-up"
|
||||||
|| expressionIdentifier == "scale-down"
|
|| expressionIdentifier == "scale-down"
|
||||||
@ -189,5 +183,33 @@ std::unique_ptr<Expression> parseEffectBodyExpressionContent(const std::string &
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::unique_ptr<Expression> parsePredicateExpression(utils::Parser &parser, Context &context, const Variables ¶meters)
|
||||||
|
{
|
||||||
|
parser.expect<std::string>("(");
|
||||||
|
|
||||||
|
const auto predicateName = parser.parseIdentifier(isIdentifier);
|
||||||
|
|
||||||
|
std::unique_ptr<Expression> expression;
|
||||||
|
|
||||||
|
// Check if predicate with that name exists
|
||||||
|
const auto match = std::find_if(context.predicates.cbegin(), context.predicates.cend(),
|
||||||
|
[&](const auto &predicate)
|
||||||
|
{
|
||||||
|
return predicate->name() == predicateName;
|
||||||
|
});
|
||||||
|
|
||||||
|
// If predicate exists, parse it
|
||||||
|
if (match == context.predicates.cend())
|
||||||
|
throw utils::ParserException(parser.row(), parser.column(), "Unknown predicate \"" + predicateName + "\"");
|
||||||
|
|
||||||
|
expression = expressions::PredicateExpression::parse(predicateName, parser, context, parameters);
|
||||||
|
|
||||||
|
parser.expect<std::string>(")");
|
||||||
|
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
src/plasp/pddl/expressions/NotExpression.cpp
Normal file
27
src/plasp/pddl/expressions/NotExpression.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include <plasp/pddl/expressions/NotExpression.h>
|
||||||
|
|
||||||
|
#include <plasp/pddl/ExpressionVisitor.h>
|
||||||
|
|
||||||
|
namespace plasp
|
||||||
|
{
|
||||||
|
namespace pddl
|
||||||
|
{
|
||||||
|
namespace expressions
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// NotExpression
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void NotExpression::accept(plasp::pddl::ExpressionVisitor &expressionVisitor) const
|
||||||
|
{
|
||||||
|
expressionVisitor.visit(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user