From e364d01cf48d1f4184c2a510b3476b88882176d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Sun, 18 Jun 2017 04:15:05 +0200 Subject: [PATCH] Fixed issue in parsing typed objects in multiple iterations and added test case. --- .../detail/parsing/ConstantDeclaration.cpp | 2 +- .../parsing/PrimitiveTypeDeclaration.cpp | 6 ++++-- .../detail/parsing/VariableDeclaration.cpp | 2 +- .../tests/TestOfficialPDDLInstances.cpp | 18 +++++++++++++++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/pddlparse/src/pddlparse/detail/parsing/ConstantDeclaration.cpp b/lib/pddlparse/src/pddlparse/detail/parsing/ConstantDeclaration.cpp index fed54c9..1541362 100644 --- a/lib/pddlparse/src/pddlparse/detail/parsing/ConstantDeclaration.cpp +++ b/lib/pddlparse/src/pddlparse/detail/parsing/ConstantDeclaration.cpp @@ -34,7 +34,7 @@ void parseAndAddConstantDeclarations(Context &context, ast::Domain &domain, ast: tokenizer.skipWhiteSpace(); // Index on the first element of the current inheritance list - size_t inheritanceIndex = 0; + size_t inheritanceIndex = constantDeclarations.size(); while (tokenizer.currentCharacter() != ')') { diff --git a/lib/pddlparse/src/pddlparse/detail/parsing/PrimitiveTypeDeclaration.cpp b/lib/pddlparse/src/pddlparse/detail/parsing/PrimitiveTypeDeclaration.cpp index 56657b2..89226a0 100644 --- a/lib/pddlparse/src/pddlparse/detail/parsing/PrimitiveTypeDeclaration.cpp +++ b/lib/pddlparse/src/pddlparse/detail/parsing/PrimitiveTypeDeclaration.cpp @@ -45,6 +45,7 @@ void parseAndAddPrimitiveTypeDeclarations(Context &context, ast::Domain &domain) tokenizer.skipWhiteSpace(); const auto position = tokenizer.position(); + const auto typeStartIndex = domain.types.size(); // First pass: collect all primitive types while (tokenizer.currentCharacter() != ')') @@ -64,8 +65,9 @@ void parseAndAddPrimitiveTypeDeclarations(Context &context, ast::Domain &domain) // Second pass: link parent types correctly // Index on the first element of the current inheritance list - size_t inheritanceIndex = 0; - size_t i = 0; + // TODO: test correct implementation of offset if this function is called multiple times + size_t inheritanceIndex = typeStartIndex; + size_t i = typeStartIndex; while (tokenizer.currentCharacter() != ')') { diff --git a/lib/pddlparse/src/pddlparse/detail/parsing/VariableDeclaration.cpp b/lib/pddlparse/src/pddlparse/detail/parsing/VariableDeclaration.cpp index 0dcd90b..5f75f6e 100644 --- a/lib/pddlparse/src/pddlparse/detail/parsing/VariableDeclaration.cpp +++ b/lib/pddlparse/src/pddlparse/detail/parsing/VariableDeclaration.cpp @@ -35,7 +35,7 @@ void parseAndAddVariableDeclarations(Context &context, ast::Domain &domain, ast: tokenizer.skipWhiteSpace(); // Index on the first element of the current inheritance list - size_t inheritanceIndex = 0; + size_t inheritanceIndex = variableDeclarations.size(); while (tokenizer.currentCharacter() != ')') { diff --git a/lib/pddlparse/tests/TestOfficialPDDLInstances.cpp b/lib/pddlparse/tests/TestOfficialPDDLInstances.cpp index eb97659..cc0d2d9 100644 --- a/lib/pddlparse/tests/TestOfficialPDDLInstances.cpp +++ b/lib/pddlparse/tests/TestOfficialPDDLInstances.cpp @@ -279,7 +279,7 @@ TEST_CASE("[PDDL parser] The official PDDL instances are parsed correctly", "[PD REQUIRE(types[9]->parentTypes.empty()); } - SECTION("typed objects in mystery domain") + SECTION("typing in mystery domain") { context.mode = pddl::Mode::Compatibility; @@ -289,6 +289,22 @@ TEST_CASE("[PDDL parser] The official PDDL instances are parsed correctly", "[PD context.tokenizer.read(instanceFile); auto description = pddl::parseDescription(context); + const auto &actions = description.domain->actions; + + REQUIRE(actions.size() == 3); + // TODO: adjust if there are changes to handling :vars section + REQUIRE(actions[0]->parameters.size() == 5); + CHECK(actions[0]->parameters[0]->name == "c"); + CHECK(actions[0]->parameters[0]->type.value().get()->declaration->name == "pain"); + CHECK(actions[0]->parameters[1]->name == "v"); + CHECK(actions[0]->parameters[1]->type.value().get()->declaration->name == "pleasure"); + CHECK(actions[0]->parameters[2]->name == "n"); + CHECK(actions[0]->parameters[2]->type.value().get()->declaration->name == "food"); + CHECK(actions[0]->parameters[3]->name == "s1"); + CHECK(actions[0]->parameters[3]->type.value().get()->declaration->name == "planet"); + CHECK(actions[0]->parameters[4]->name == "s2"); + CHECK(actions[0]->parameters[4]->type.value().get()->declaration->name == "planet"); + REQUIRE(description.problem); const auto &problem = description.problem.value();