Implemented compatibility mode to support old instances.

This commit is contained in:
2017-06-17 22:18:39 +02:00
parent dde277cc3e
commit 615167e7cd
9 changed files with 52 additions and 9 deletions

View File

@@ -2,6 +2,7 @@
#include <algorithm>
#include <pddlparse/Exception.h>
#include <pddlparse/detail/parsing/Requirement.h>
namespace pddl
@@ -59,7 +60,10 @@ void checkRequirement(ast::Domain &domain, ast::Requirement requirement, Context
if (hasRequirement(domain, requirement))
return;
context.warningCallback(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared, silently adding requirement");
if (context.mode == Mode::Compatibility)
context.warningCallback(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared, silently adding requirement");
else
throw ParserException(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared");
domain.requirements.push_back(requirement);
}
@@ -71,7 +75,10 @@ void checkRequirement(ast::Problem &problem, ast::Requirement requirement, Conte
if (hasRequirement(problem, requirement))
return;
context.warningCallback(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared, silently adding requirement");
if (context.mode == Mode::Compatibility)
context.warningCallback(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared, silently adding requirement");
else
throw ParserException(context.tokenizer.location(), "requirement “" + std::string(toString(requirement)) + "” used but never declared");
problem.requirements.push_back(requirement);
}

View File

@@ -107,7 +107,7 @@ void ActionParser::findSections(ast::Action &action)
setSectionPosition("precondition", m_preconditionPosition, position, true);
else if (tokenizer.testIdentifierAndSkip("effect"))
setSectionPosition("effect", m_effectPosition, position, true);
else if (tokenizer.testIdentifierAndSkip("vars"))
else if (m_context.mode == Mode::Compatibility && tokenizer.testIdentifierAndSkip("vars"))
setSectionPosition("vars", m_varsPosition, position, true);
else
{

View File

@@ -71,7 +71,7 @@ void DescriptionParser::findSections()
tokenizer.expect<std::string>("(");
if (tokenizer.testAndReturn<std::string>("in-package"))
if (m_context.mode == Mode::Compatibility && tokenizer.testAndReturn<std::string>("in-package"))
{
m_context.warningCallback(tokenizer.location(), "“in-package” section is not part of the PDDL 3.1 specification, ignoring section");

View File

@@ -35,6 +35,9 @@ ast::PrimitiveTypePointer parsePrimitiveType(Context &context, ast::Domain &doma
// If the type has not been declared yet, add it but issue a warning
if (matchingType == types.end())
{
if (context.mode != Mode::Compatibility)
throw ParserException(tokenizer.location(), "primitive type “" + typeName + "” used without or before declaration");
context.warningCallback(tokenizer.location(), "primitive type “" + typeName + "” used without or before declaration, silently adding declaration");
types.emplace_back(std::make_unique<ast::PrimitiveTypeDeclaration>(std::move(typeName)));

View File

@@ -66,7 +66,7 @@ std::experimental::optional<ast::Requirement> parseRequirement(Context &context)
if (matchingRequirement != requirementNameMap.cend())
return matchingRequirement->second;
if (requirementName == "goal-utilities" || requirementName == "domain-axioms")
if (context.mode == Mode::Compatibility && (requirementName == "goal-utilities" || requirementName == "domain-axioms"))
context.warningCallback(tokenizer.location(), "" + requirementName + "” requirement is not part of the PDDL 3.1 specification, ignoring requirement");
return std::experimental::nullopt;