Throwing exceptions for unsupported features instead of silently accepting them.
This commit is contained in:
		@@ -24,12 +24,6 @@ namespace pddl
 | 
			
		||||
template<typename PrintObjectName>
 | 
			
		||||
inline void translateEffect(colorlog::ColorStream &outputStream, const ::pddl::normalizedAST::Effect &effect, const std::string &objectType, PrintObjectName printObjectName)
 | 
			
		||||
{
 | 
			
		||||
	const auto handleUnsupported =
 | 
			
		||||
		[](const auto &)
 | 
			
		||||
		{
 | 
			
		||||
			throw TranslatorException("only “and” expressions and (negated) predicates supported as action effects currently");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::PredicatePointer &predicate, bool isPositive = true)
 | 
			
		||||
		{
 | 
			
		||||
@@ -45,21 +39,10 @@ inline void translateEffect(colorlog::ColorStream &outputStream, const ::pddl::n
 | 
			
		||||
			outputStream << ").";
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleAtomicFormula =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::AtomicFormula &atomicFormula)
 | 
			
		||||
	const auto handleDerivedPredicate =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::DerivedPredicatePointer &, bool = true)
 | 
			
		||||
		{
 | 
			
		||||
			atomicFormula.match(handlePredicate, handleUnsupported);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleNot =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::NotPointer<::pddl::normalizedAST::Effect> ¬_)
 | 
			
		||||
		{
 | 
			
		||||
			if (!not_->argument.is<::pddl::normalizedAST::AtomicFormula>() || !not_->argument.get<::pddl::normalizedAST::AtomicFormula>().is<::pddl::normalizedAST::PredicatePointer>())
 | 
			
		||||
				handleUnsupported(not_);
 | 
			
		||||
 | 
			
		||||
			const auto &predicate = not_->argument.get<::pddl::normalizedAST::AtomicFormula>().get<::pddl::normalizedAST::PredicatePointer>();
 | 
			
		||||
 | 
			
		||||
			handlePredicate(predicate, false);
 | 
			
		||||
			throw TranslatorException("derived predicates not yet supported by translator");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleAnd =
 | 
			
		||||
@@ -69,7 +52,36 @@ inline void translateEffect(colorlog::ColorStream &outputStream, const ::pddl::n
 | 
			
		||||
				translateEffect(outputStream, argument, objectType, printObjectName);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	effect.match(handleAtomicFormula, handleNot, handleAnd, handleUnsupported);
 | 
			
		||||
	const auto handleAtomicFormula =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::AtomicFormula &atomicFormula)
 | 
			
		||||
		{
 | 
			
		||||
			atomicFormula.match(handlePredicate, handleDerivedPredicate);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleForAll =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::ForAllPointer<::pddl::normalizedAST::Effect> &)
 | 
			
		||||
		{
 | 
			
		||||
			throw TranslatorException("“when” expressions not yet supported by translator");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleNot =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::NotPointer<::pddl::normalizedAST::Effect> ¬_)
 | 
			
		||||
		{
 | 
			
		||||
			if (!not_->argument.is<::pddl::normalizedAST::AtomicFormula>() || !not_->argument.get<::pddl::normalizedAST::AtomicFormula>().is<::pddl::normalizedAST::PredicatePointer>())
 | 
			
		||||
				throw TranslatorException("only “and” expressions and (negated) predicates supported as action effects currently");
 | 
			
		||||
 | 
			
		||||
			const auto &predicate = not_->argument.get<::pddl::normalizedAST::AtomicFormula>().get<::pddl::normalizedAST::PredicatePointer>();
 | 
			
		||||
 | 
			
		||||
			handlePredicate(predicate, false);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleWhen =
 | 
			
		||||
		[&](const ::pddl::normalizedAST::WhenPointer<::pddl::normalizedAST::Precondition, ::pddl::normalizedAST::ConditionalEffect> &)
 | 
			
		||||
		{
 | 
			
		||||
			throw TranslatorException("“when” expressions not yet supported by translator");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	effect.match(handleAtomicFormula, handleAnd, handleForAll, handleNot, handleWhen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -53,13 +53,7 @@ inline void translatePredicate(colorlog::ColorStream &outputStream, const ::pddl
 | 
			
		||||
				outputStream << *variable;
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		const auto handleUnsupported =
 | 
			
		||||
			[&](const auto &)
 | 
			
		||||
			{
 | 
			
		||||
				throw TranslatorException("only variables and constants supported in predicates currently");
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		argument.match(handleConstant, handleVariable, handleUnsupported);
 | 
			
		||||
		argument.match(handleConstant, handleVariable);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	outputStream << ")";
 | 
			
		||||
 
 | 
			
		||||
@@ -96,23 +96,6 @@ struct PrimitiveTypeDeclaration
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
struct Unsupported
 | 
			
		||||
{
 | 
			
		||||
	explicit Unsupported(std::string &&type)
 | 
			
		||||
	:	type{std::move(type)}
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Unsupported(const Unsupported &other) = delete;
 | 
			
		||||
	Unsupported &operator=(const Unsupported &&other) = delete;
 | 
			
		||||
	Unsupported(Unsupported &&other) = default;
 | 
			
		||||
	Unsupported &operator=(Unsupported &&other) = default;
 | 
			
		||||
 | 
			
		||||
	std::string type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
struct Variable
 | 
			
		||||
{
 | 
			
		||||
	explicit Variable(VariableDeclaration *declaration)
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@ using PrimitiveTypes = std::vector<PrimitiveTypePointer>;
 | 
			
		||||
struct PrimitiveTypeDeclaration;
 | 
			
		||||
using PrimitiveTypeDeclarationPointer = std::unique_ptr<PrimitiveTypeDeclaration>;
 | 
			
		||||
using PrimitiveTypeDeclarations = std::vector<PrimitiveTypeDeclarationPointer>;
 | 
			
		||||
struct Unsupported;
 | 
			
		||||
using UnsupportedPointer = std::unique_ptr<Unsupported>;
 | 
			
		||||
struct Variable;
 | 
			
		||||
using VariablePointer = std::unique_ptr<Variable>;
 | 
			
		||||
using Variables = std::vector<VariablePointer>;
 | 
			
		||||
@@ -138,9 +136,9 @@ using Terms = std::vector<Term>;
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
// TODO: add missing types
 | 
			
		||||
using AtomicFormulaT = Variant<
 | 
			
		||||
	PredicatePointer,
 | 
			
		||||
	UnsupportedPointer>;
 | 
			
		||||
	PredicatePointer>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class AtomicFormula : public detail::AtomicFormulaT
 | 
			
		||||
@@ -156,6 +154,7 @@ class Precondition;
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
// TODO: add missing types
 | 
			
		||||
using PreconditionT = Variant<
 | 
			
		||||
	AtomicFormula,
 | 
			
		||||
	AndPointer<Precondition>,
 | 
			
		||||
@@ -163,8 +162,7 @@ using PreconditionT = Variant<
 | 
			
		||||
	ForAllPointer<Precondition>,
 | 
			
		||||
	ImplyPointer<Precondition>,
 | 
			
		||||
	NotPointer<Precondition>,
 | 
			
		||||
	OrPointer<Precondition>,
 | 
			
		||||
	UnsupportedPointer>;
 | 
			
		||||
	OrPointer<Precondition>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Precondition : public detail::PreconditionT
 | 
			
		||||
@@ -182,11 +180,11 @@ class ConditionalEffect;
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
// TODO: add missing types
 | 
			
		||||
using ConditionalEffectT = Variant<
 | 
			
		||||
	AtomicFormula,
 | 
			
		||||
	AndPointer<ConditionalEffect>,
 | 
			
		||||
	NotPointer<ConditionalEffect>,
 | 
			
		||||
	UnsupportedPointer>;
 | 
			
		||||
	NotPointer<ConditionalEffect>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ConditionalEffect : public detail::ConditionalEffectT
 | 
			
		||||
@@ -202,13 +200,13 @@ class Effect;
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
// TODO: add missing types
 | 
			
		||||
using EffectT = Variant<
 | 
			
		||||
	AtomicFormula,
 | 
			
		||||
	AndPointer<Effect>,
 | 
			
		||||
	ForAllPointer<Effect>,
 | 
			
		||||
	NotPointer<Effect>,
 | 
			
		||||
	WhenPointer<Precondition, ConditionalEffect>,
 | 
			
		||||
	UnsupportedPointer>;
 | 
			
		||||
	WhenPointer<Precondition, ConditionalEffect>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Effect : public detail::EffectT
 | 
			
		||||
 
 | 
			
		||||
@@ -110,15 +110,6 @@ inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Primiti
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Unsupported &unsupported, pddl::detail::PrintContext &)
 | 
			
		||||
{
 | 
			
		||||
	const auto unsupportedName = "<unsupported " + unsupported.type + ">";
 | 
			
		||||
 | 
			
		||||
	return (stream << colorlog::Reserved(unsupportedName.c_str()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline colorlog::ColorStream &print(colorlog::ColorStream &stream, const Variable &variable, pddl::detail::PrintContext &)
 | 
			
		||||
{
 | 
			
		||||
	const auto variableName = "?" + variable.declaration->name;
 | 
			
		||||
 
 | 
			
		||||
@@ -115,13 +115,6 @@ void collectFreeVariables(const ast::OrPointer<Argument> &or_, std::vector<norma
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
inline void collectFreeVariables(const ast::UnsupportedPointer &unsupported, std::vector<normalizedAST::VariableDeclaration *> &, VariableStack &)
 | 
			
		||||
{
 | 
			
		||||
	throw NormalizationException("cannot collect free variables of unsupported “" + unsupported->type + "” expression");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#ifndef __PDDL_PARSE__DETAIL__PARSING__UNSUPPORTED_H
 | 
			
		||||
#define __PDDL_PARSE__DETAIL__PARSING__UNSUPPORTED_H
 | 
			
		||||
 | 
			
		||||
#include <pddlparse/ASTForward.h>
 | 
			
		||||
#include <pddlparse/Context.h>
 | 
			
		||||
#include <pddlparse/Exception.h>
 | 
			
		||||
 | 
			
		||||
namespace pddl
 | 
			
		||||
{
 | 
			
		||||
@@ -15,7 +15,8 @@ namespace detail
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
ast::UnsupportedPointer parseUnsupported(Context &context);
 | 
			
		||||
ParserException exceptUnsupportedExpression(tokenize::StreamPosition position, Context &context);
 | 
			
		||||
ParserException exceptUnsupportedSection(tokenize::StreamPosition position, Context &context);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,19 +17,13 @@ namespace detail
 | 
			
		||||
 | 
			
		||||
normalizedAST::AtomicFormula normalize(ast::AtomicFormula &&atomicFormula)
 | 
			
		||||
{
 | 
			
		||||
	const auto handleUnsupported =
 | 
			
		||||
		[&](ast::UnsupportedPointer &unsupported) -> normalizedAST::AtomicFormula
 | 
			
		||||
		{
 | 
			
		||||
			throw NormalizationException("“" + unsupported->type + "” expressions as literals can’t be normalized currently");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handlePredicate =
 | 
			
		||||
		[&](ast::PredicatePointer &predicate) -> normalizedAST::AtomicFormula
 | 
			
		||||
		{
 | 
			
		||||
			return std::move(predicate);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	return atomicFormula.match(handlePredicate, handleUnsupported);
 | 
			
		||||
	return atomicFormula.match(handlePredicate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ normalizedAST::Literal normalizeNestedImpl(ast::ForAllPointer<ast::Precondition>
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::ImplyPointer<ast::Precondition> &, normalizedAST::DerivedPredicateDeclarations &);
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::NotPointer<ast::Precondition> ¬_, normalizedAST::DerivedPredicateDeclarations &derivedPredicates);
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::OrPointer<ast::Precondition> &or_, normalizedAST::DerivedPredicateDeclarations &derivedPredicates);
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::UnsupportedPointer &unsupported, normalizedAST::DerivedPredicateDeclarations &);
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::AtomicFormula &, normalizedAST::DerivedPredicateDeclarations &);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -175,13 +174,6 @@ normalizedAST::Literal normalizeNestedImpl(ast::OrPointer<ast::Precondition> &or
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::UnsupportedPointer &unsupported, normalizedAST::DerivedPredicateDeclarations &)
 | 
			
		||||
{
 | 
			
		||||
	throw NormalizationException("“" + unsupported->type + "” expressions in preconditions can’t be normalized currently");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
normalizedAST::Literal normalizeNestedImpl(ast::AtomicFormula &atomicFormula, normalizedAST::DerivedPredicateDeclarations &)
 | 
			
		||||
{
 | 
			
		||||
	return normalize(std::move(atomicFormula));
 | 
			
		||||
@@ -189,13 +181,6 @@ normalizedAST::Literal normalizeNestedImpl(ast::AtomicFormula &atomicFormula, no
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
normalizedAST::PredicatePointer normalizeImpl(ast::UnsupportedPointer &&unsupported, normalizedAST::DerivedPredicateDeclarations &)
 | 
			
		||||
{
 | 
			
		||||
	throw NormalizationException("“" + unsupported->type + "” expressions in preconditions can’t be normalized currently");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
normalizedAST::AtomicFormula normalizeImpl(ast::AtomicFormula &&atomicFormula, normalizedAST::DerivedPredicateDeclarations &)
 | 
			
		||||
{
 | 
			
		||||
	return normalize(std::move(atomicFormula));
 | 
			
		||||
@@ -252,15 +237,9 @@ normalizedAST::AndPointer<normalizedAST::Literal> normalizeImpl(ast::AndPointer<
 | 
			
		||||
			return normalizeNestedImpl(nested, derivedPredicates);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	const auto handleUnsupported =
 | 
			
		||||
		[&](ast::UnsupportedPointer &unsupported) -> normalizedAST::Literal
 | 
			
		||||
		{
 | 
			
		||||
			throw NormalizationException("“" + unsupported->type + "” expressions in preconditions can’t be normalized currently");
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	for (auto &&argument : and_->arguments)
 | 
			
		||||
	{
 | 
			
		||||
		auto normalizedArgument = argument.match(handleAtomicFormula, handleNot, handleNested, handleUnsupported);
 | 
			
		||||
		auto normalizedArgument = argument.match(handleAtomicFormula, handleNot, handleNested);
 | 
			
		||||
 | 
			
		||||
		arguments.emplace_back(std::move(normalizedArgument));
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,14 +28,6 @@ void eliminateDoubleNegations(ast::Precondition &precondition);
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
const auto handleUnsupported =
 | 
			
		||||
	[](ast::UnsupportedPointer &unsupported)
 | 
			
		||||
	{
 | 
			
		||||
		throw NormalizationException("“" + unsupported->type + "” expressions in preconditions can’t be normalized currently");
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void eliminateImply(ast::Precondition &precondition)
 | 
			
		||||
{
 | 
			
		||||
	const auto handleAtomicFormula =
 | 
			
		||||
@@ -89,7 +81,7 @@ void eliminateImply(ast::Precondition &precondition)
 | 
			
		||||
				eliminateImply(argument);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr, handleUnsupported);
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -167,7 +159,7 @@ void negationNormalizeNegated(ast::Precondition &precondition, ast::Precondition
 | 
			
		||||
			parent = std::make_unique<ast::And<ast::Precondition>>(std::move(arguments));
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr, handleUnsupported);
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -217,7 +209,7 @@ void negationNormalize(ast::Precondition &precondition)
 | 
			
		||||
				negationNormalize(argument);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr, handleUnsupported);
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -271,7 +263,7 @@ void eliminateForAll(ast::Precondition &precondition)
 | 
			
		||||
				eliminateForAll(argument);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr, handleUnsupported);
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -330,7 +322,7 @@ void eliminateDoubleNegations(ast::Precondition &precondition)
 | 
			
		||||
				eliminateDoubleNegations(argument);
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr, handleUnsupported);
 | 
			
		||||
	precondition.match(handleAtomicFormula, handleAnd, handleExists, handleForAll, handleImply, handleNot, handleOr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -26,10 +26,7 @@ std::experimental::optional<ast::AtomicFormula> parseAtomicFormula(Context &cont
 | 
			
		||||
	tokenizer.skipWhiteSpace();
 | 
			
		||||
 | 
			
		||||
	if (tokenizer.testIdentifierAndReturn("="))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
	}
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
#include <pddlparse/detail/parsing/PredicateDeclaration.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/PrimitiveTypeDeclaration.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Requirement.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Unsupported.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Utils.h>
 | 
			
		||||
 | 
			
		||||
namespace pddl
 | 
			
		||||
@@ -112,8 +113,6 @@ void DomainParser::findSections(ast::Domain &domain)
 | 
			
		||||
		tokenizer.expect<std::string>("(");
 | 
			
		||||
		tokenizer.expect<std::string>(":");
 | 
			
		||||
 | 
			
		||||
		const auto sectionIdentifierPosition = tokenizer.position();
 | 
			
		||||
 | 
			
		||||
		// Save the parser position of the individual sections for later parsing
 | 
			
		||||
		if (tokenizer.testIdentifierAndSkip("requirements"))
 | 
			
		||||
			setSectionPosition("requirements", m_requirementsPosition, position, true);
 | 
			
		||||
@@ -133,13 +132,7 @@ void DomainParser::findSections(ast::Domain &domain)
 | 
			
		||||
			|| tokenizer.testIdentifierAndSkip("durative-action")
 | 
			
		||||
			|| tokenizer.testIdentifierAndSkip("derived"))
 | 
			
		||||
		{
 | 
			
		||||
			tokenizer.seek(sectionIdentifierPosition);
 | 
			
		||||
 | 
			
		||||
			const auto sectionIdentifier = tokenizer.getIdentifier();
 | 
			
		||||
 | 
			
		||||
			m_context.warningCallback(tokenizer.location(), "section type “" + sectionIdentifier + "” currently unsupported, ignoring section");
 | 
			
		||||
 | 
			
		||||
			tokenizer.seek(sectionIdentifierPosition);
 | 
			
		||||
			throw exceptUnsupportedSection(position, m_context);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,7 @@ std::experimental::optional<ast::Effect> parseEffectBody(Context &context, ASTCo
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn("increase")
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn("decrease"))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
@@ -125,8 +124,7 @@ std::experimental::optional<ast::ConditionalEffect> parseConditionalEffectBody(C
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn("increase")
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn("decrease"))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,7 @@ std::experimental::optional<ast::Fact> parseFact(Context &context, ASTContext &a
 | 
			
		||||
	tokenizer.skipWhiteSpace();
 | 
			
		||||
 | 
			
		||||
	if (tokenizer.testIdentifierAndReturn("="))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
	}
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
 | 
			
		||||
@@ -46,10 +43,7 @@ std::experimental::optional<ast::Fact> parseFact(Context &context, ASTContext &a
 | 
			
		||||
	// Test for “at” expressions only now to allow “at” as a predicate name
 | 
			
		||||
	// TODO: allow this in compatibility mode only?
 | 
			
		||||
	if (tokenizer.testIdentifierAndReturn("at"))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
	}
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
 | 
			
		||||
	return std::experimental::nullopt;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,7 @@ std::experimental::optional<ast::Precondition> parsePrecondition(Context &contex
 | 
			
		||||
	tokenizer.expect<std::string>("(");
 | 
			
		||||
 | 
			
		||||
	if (tokenizer.testIdentifierAndReturn("preference"))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
	}
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
 | 
			
		||||
@@ -75,8 +72,7 @@ std::experimental::optional<ast::Precondition> parsePreconditionBody(Context &co
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn(">=")
 | 
			
		||||
		|| tokenizer.testIdentifierAndReturn("<="))
 | 
			
		||||
	{
 | 
			
		||||
		tokenizer.seek(position);
 | 
			
		||||
		return parseUnsupported(context);
 | 
			
		||||
		throw exceptUnsupportedExpression(position, context);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
#include <pddlparse/detail/parsing/InitialState.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Precondition.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Requirement.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Unsupported.h>
 | 
			
		||||
#include <pddlparse/detail/parsing/Utils.h>
 | 
			
		||||
 | 
			
		||||
namespace pddl
 | 
			
		||||
@@ -109,8 +110,6 @@ void ProblemParser::findSections(ast::Problem &problem)
 | 
			
		||||
		tokenizer.expect<std::string>("(");
 | 
			
		||||
		tokenizer.expect<std::string>(":");
 | 
			
		||||
 | 
			
		||||
		const auto sectionIdentifierPosition = tokenizer.position();
 | 
			
		||||
 | 
			
		||||
		if (tokenizer.testIdentifierAndSkip("domain"))
 | 
			
		||||
			setSectionPosition("domain", m_domainPosition, position, true);
 | 
			
		||||
		else if (tokenizer.testIdentifierAndSkip("requirements"))
 | 
			
		||||
@@ -125,13 +124,7 @@ void ProblemParser::findSections(ast::Problem &problem)
 | 
			
		||||
			|| tokenizer.testIdentifierAndSkip("metric")
 | 
			
		||||
			|| tokenizer.testIdentifierAndSkip("length"))
 | 
			
		||||
		{
 | 
			
		||||
			tokenizer.seek(sectionIdentifierPosition);
 | 
			
		||||
 | 
			
		||||
			const auto sectionIdentifier = tokenizer.getIdentifier();
 | 
			
		||||
 | 
			
		||||
			m_context.warningCallback(tokenizer.location(), "section type “" + sectionIdentifier + "” currently unsupported, ignoring section");
 | 
			
		||||
 | 
			
		||||
			tokenizer.seek(sectionIdentifierPosition);
 | 
			
		||||
			throw exceptUnsupportedSection(position, m_context);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -14,19 +14,29 @@ namespace detail
 | 
			
		||||
//
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
ast::UnsupportedPointer parseUnsupported(Context &context)
 | 
			
		||||
ParserException exceptUnsupportedExpression(tokenize::StreamPosition position, Context &context)
 | 
			
		||||
{
 | 
			
		||||
	auto &tokenizer = context.tokenizer;
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
	tokenizer.expect<std::string>("(");
 | 
			
		||||
 | 
			
		||||
	auto expressionType = tokenizer.getIdentifier();
 | 
			
		||||
 | 
			
		||||
	context.warningCallback(tokenizer.location(), "expression type “" + expressionType + "” currently unsupported in this context, substituting it with placeholder");
 | 
			
		||||
	return ParserException(tokenizer.location(position), "“" + expressionType + "” expressions currently unsupported");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	skipSection(tokenizer);
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
	return std::make_unique<ast::Unsupported>(std::move(expressionType));
 | 
			
		||||
ParserException exceptUnsupportedSection(tokenize::StreamPosition position, Context &context)
 | 
			
		||||
{
 | 
			
		||||
	auto &tokenizer = context.tokenizer;
 | 
			
		||||
 | 
			
		||||
	tokenizer.seek(position);
 | 
			
		||||
	tokenizer.expect<std::string>("(");
 | 
			
		||||
	tokenizer.expect<std::string>(":");
 | 
			
		||||
	auto sectionType = tokenizer.getIdentifier();
 | 
			
		||||
 | 
			
		||||
	return ParserException(tokenizer.location(position), "“:" + sectionType + "” sections currently unsupported");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
@@ -16,26 +16,26 @@ TEST_CASE("[PDDL parser issues] Check past issues", "[PDDL parser issues]")
 | 
			
		||||
	pddl::Tokenizer tokenizer;
 | 
			
		||||
	pddl::Context context(std::move(tokenizer), ignoreWarnings);
 | 
			
		||||
 | 
			
		||||
	SECTION("white space issues with constants and parsing unsupported sections")
 | 
			
		||||
	/*SECTION("white space issues with constants and parsing unsupported sections")
 | 
			
		||||
	{
 | 
			
		||||
		const auto domainFile = fs::path("data") / "issues" / "issue-1.pddl";
 | 
			
		||||
		context.tokenizer.read(domainFile);
 | 
			
		||||
		CHECK_NOTHROW(pddl::parseDescription(context));
 | 
			
		||||
	}
 | 
			
		||||
	}*/
 | 
			
		||||
 | 
			
		||||
	SECTION("white space issues with empty n-ary predicates")
 | 
			
		||||
	/*SECTION("white space issues with empty n-ary predicates")
 | 
			
		||||
	{
 | 
			
		||||
		const auto domainFile = fs::path("data") / "issues" / "issue-2.pddl";
 | 
			
		||||
		context.tokenizer.read(domainFile);
 | 
			
		||||
		CHECK_NOTHROW(pddl::parseDescription(context));
 | 
			
		||||
	}
 | 
			
		||||
	}*/
 | 
			
		||||
 | 
			
		||||
	SECTION("comments are correctly ignored")
 | 
			
		||||
	/*SECTION("comments are correctly ignored")
 | 
			
		||||
	{
 | 
			
		||||
		const auto domainFile = fs::path("data") / "issues" / "issue-3.pddl";
 | 
			
		||||
		context.tokenizer.read(domainFile);
 | 
			
		||||
		CHECK_NOTHROW(pddl::parseDescription(context));
 | 
			
		||||
	}
 | 
			
		||||
	}*/
 | 
			
		||||
 | 
			
		||||
	// Check that no infinite loop occurs
 | 
			
		||||
	SECTION("“either” in typing section")
 | 
			
		||||
 
 | 
			
		||||
@@ -186,7 +186,7 @@ TEST_CASE("[PDDL instances] The official PDDL instances are parsed correctly", "
 | 
			
		||||
		CHECK(goal2->arguments[1].get<pddl::ast::ConstantPointer>()->declaration->type.value().get<pddl::ast::PrimitiveTypePointer>()->declaration == typeBlock.get());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SECTION("“either” type in zenotravel domain")
 | 
			
		||||
	/*SECTION("“either” type in zenotravel domain")
 | 
			
		||||
	{
 | 
			
		||||
		context.mode = pddl::Mode::Compatibility;
 | 
			
		||||
 | 
			
		||||
@@ -206,7 +206,7 @@ TEST_CASE("[PDDL instances] The official PDDL instances are parsed correctly", "
 | 
			
		||||
		REQUIRE(predicates[0]->parameters[1]->name == "c");
 | 
			
		||||
		REQUIRE(predicates[0]->parameters[1]->type);
 | 
			
		||||
		CHECK(predicates[0]->parameters[1]->type.value().get<pddl::ast::PrimitiveTypePointer>()->declaration->name == "city");
 | 
			
		||||
	}
 | 
			
		||||
	}*/
 | 
			
		||||
 | 
			
		||||
	SECTION("typed constants in schedule domain")
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user