Made conditional effect variant more concise.
This commit is contained in:
parent
0eff8e5dcf
commit
4622f31fa4
@ -150,6 +150,24 @@ class AtomicFormula : public detail::AtomicFormulaT
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
using LiteralT = Variant<
|
||||||
|
AtomicFormula,
|
||||||
|
NotPointer<AtomicFormula>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Literal : public detail::LiteralT
|
||||||
|
{
|
||||||
|
Literal() = delete;
|
||||||
|
|
||||||
|
using detail::LiteralT::LiteralT;
|
||||||
|
};
|
||||||
|
|
||||||
|
using Literals = std::vector<Literal>;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class Precondition;
|
class Precondition;
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
@ -182,9 +200,8 @@ namespace detail
|
|||||||
{
|
{
|
||||||
// TODO: add missing types
|
// TODO: add missing types
|
||||||
using ConditionalEffectT = Variant<
|
using ConditionalEffectT = Variant<
|
||||||
AtomicFormula,
|
Literal,
|
||||||
AndPointer<ConditionalEffect>,
|
AndPointer<Literal>>;
|
||||||
NotPointer<ConditionalEffect>>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConditionalEffect : public detail::ConditionalEffectT
|
class ConditionalEffect : public detail::ConditionalEffectT
|
||||||
@ -234,24 +251,6 @@ class Type : public detail::TypeT
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
using LiteralT = Variant<
|
|
||||||
AtomicFormula,
|
|
||||||
NotPointer<AtomicFormula>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Literal : public detail::LiteralT
|
|
||||||
{
|
|
||||||
Literal() = delete;
|
|
||||||
|
|
||||||
using detail::LiteralT::LiteralT;
|
|
||||||
};
|
|
||||||
|
|
||||||
using Literals = std::vector<Literal>;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class Fact;
|
class Fact;
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
|
@ -20,7 +20,7 @@ namespace detail
|
|||||||
|
|
||||||
std::experimental::optional<ast::Effect> parseEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
std::experimental::optional<ast::Effect> parseEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
||||||
std::experimental::optional<ast::ConditionalEffect> parseConditionalEffect(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
std::experimental::optional<ast::ConditionalEffect> parseConditionalEffect(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
||||||
std::experimental::optional<ast::ConditionalEffect> parseConditionalEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
std::experimental::optional<ast::Literal> parseConditionalEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ std::experimental::optional<ast::ConditionalEffect> parseConditionalEffect(Conte
|
|||||||
|
|
||||||
std::experimental::optional<ast::ConditionalEffect> conditionalEffect;
|
std::experimental::optional<ast::ConditionalEffect> conditionalEffect;
|
||||||
|
|
||||||
if ((conditionalEffect = parseAnd<ast::ConditionalEffect>(context, astContext, variableStack, parseConditionalEffectBody)))
|
if ((conditionalEffect = parseAnd<ast::Literal>(context, astContext, variableStack, parseConditionalEffectBody)))
|
||||||
return std::move(conditionalEffect.value());
|
return std::move(conditionalEffect.value());
|
||||||
|
|
||||||
return parseConditionalEffectBody(context, astContext, variableStack);
|
return parseConditionalEffectBody(context, astContext, variableStack);
|
||||||
@ -103,7 +103,7 @@ std::experimental::optional<ast::ConditionalEffect> parseConditionalEffect(Conte
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
std::experimental::optional<ast::ConditionalEffect> parseConditionalEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack)
|
std::experimental::optional<ast::Literal> parseConditionalEffectBody(Context &context, ASTContext &astContext, VariableStack &variableStack)
|
||||||
{
|
{
|
||||||
auto &tokenizer = context.tokenizer;
|
auto &tokenizer = context.tokenizer;
|
||||||
|
|
||||||
@ -130,12 +130,12 @@ std::experimental::optional<ast::ConditionalEffect> parseConditionalEffectBody(C
|
|||||||
tokenizer.seek(position);
|
tokenizer.seek(position);
|
||||||
|
|
||||||
// Now, test supported expressions
|
// Now, test supported expressions
|
||||||
std::experimental::optional<ast::ConditionalEffect> conditionalEffect;
|
std::experimental::optional<ast::Literal> literal;
|
||||||
|
|
||||||
if ((conditionalEffect = parseNot<ast::ConditionalEffect>(context, astContext, variableStack, parseAtomicFormula))
|
if ((literal = parseNot<ast::AtomicFormula>(context, astContext, variableStack, parseAtomicFormula))
|
||||||
|| (conditionalEffect = parseAtomicFormula(context, astContext, variableStack)))
|
|| (literal = parseAtomicFormula(context, astContext, variableStack)))
|
||||||
{
|
{
|
||||||
return std::move(conditionalEffect.value());
|
return std::move(literal.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenizer.seek(expressionIdentifierPosition);
|
tokenizer.seek(expressionIdentifierPosition);
|
||||||
|
@ -358,7 +358,7 @@ TEST_CASE("[PDDL instances] The official PDDL instances are parsed correctly", "
|
|||||||
const auto &effectWhen4 = effectAnd->arguments[4].get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
const auto &effectWhen4 = effectAnd->arguments[4].get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
||||||
// TODO: check name of declaration
|
// TODO: check name of declaration
|
||||||
CHECK(effectWhen4->argumentLeft.get<pddl::ast::NotPointer<pddl::ast::Precondition>>()->argument.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectWhen4->argumentLeft.get<pddl::ast::NotPointer<pddl::ast::Precondition>>()->argument.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
||||||
CHECK(effectWhen4->argumentRight.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectWhen4->argumentRight.get<pddl::ast::Literal>().get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
||||||
const auto &effectForAll5 = effectAnd->arguments[5].get<pddl::ast::ForAllPointer<pddl::ast::Effect>>();
|
const auto &effectForAll5 = effectAnd->arguments[5].get<pddl::ast::ForAllPointer<pddl::ast::Effect>>();
|
||||||
REQUIRE(effectForAll5->parameters.size() == 1);
|
REQUIRE(effectForAll5->parameters.size() == 1);
|
||||||
CHECK(effectForAll5->parameters[0]->name == "oldsurface");
|
CHECK(effectForAll5->parameters[0]->name == "oldsurface");
|
||||||
@ -366,7 +366,7 @@ TEST_CASE("[PDDL instances] The official PDDL instances are parsed correctly", "
|
|||||||
const auto &effectForAll5When = effectForAll5->argument.get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
const auto &effectForAll5When = effectForAll5->argument.get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
||||||
// TODO: check name of declaration
|
// TODO: check name of declaration
|
||||||
CHECK(effectForAll5When->argumentLeft.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectForAll5When->argumentLeft.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
||||||
CHECK(effectForAll5When->argumentRight.get<pddl::ast::NotPointer<pddl::ast::ConditionalEffect>>()->argument.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectForAll5When->argumentRight.get<pddl::ast::Literal>().get<pddl::ast::NotPointer<pddl::ast::AtomicFormula>>()->argument.is<pddl::ast::PredicatePointer>());
|
||||||
const auto &effectForAll6 = effectAnd->arguments[6].get<pddl::ast::ForAllPointer<pddl::ast::Effect>>();
|
const auto &effectForAll6 = effectAnd->arguments[6].get<pddl::ast::ForAllPointer<pddl::ast::Effect>>();
|
||||||
REQUIRE(effectForAll6->parameters.size() == 1);
|
REQUIRE(effectForAll6->parameters.size() == 1);
|
||||||
CHECK(effectForAll6->parameters[0]->name == "oldpaint");
|
CHECK(effectForAll6->parameters[0]->name == "oldpaint");
|
||||||
@ -378,6 +378,6 @@ TEST_CASE("[PDDL instances] The official PDDL instances are parsed correctly", "
|
|||||||
const auto &effectForAll9When = effectForAll9->argument.get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
const auto &effectForAll9When = effectForAll9->argument.get<pddl::ast::WhenPointer<pddl::ast::Precondition, pddl::ast::ConditionalEffect>>();
|
||||||
// TODO: check name of declaration
|
// TODO: check name of declaration
|
||||||
CHECK(effectForAll9When->argumentLeft.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectForAll9When->argumentLeft.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
||||||
CHECK(effectForAll9When->argumentRight.get<pddl::ast::NotPointer<pddl::ast::ConditionalEffect>>()->argument.get<pddl::ast::AtomicFormula>().is<pddl::ast::PredicatePointer>());
|
CHECK(effectForAll9When->argumentRight.get<pddl::ast::Literal>().get<pddl::ast::NotPointer<pddl::ast::AtomicFormula>>()->argument.is<pddl::ast::PredicatePointer>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user