diff --git a/include/plasp/pddl/expressions/PrimitiveType.h b/include/plasp/pddl/expressions/PrimitiveType.h index 8fb7c4a..45a1706 100644 --- a/include/plasp/pddl/expressions/PrimitiveType.h +++ b/include/plasp/pddl/expressions/PrimitiveType.h @@ -25,7 +25,7 @@ class PrimitiveType: public Expression static void parseDeclaration(Context &context, Domain &domain); static void parseTypedDeclaration(Context &context, Domain &domain); - static PrimitiveType *parseAndFindOrCreate(Context &context, Domain &domain); + static PrimitiveType *parseAndFind(Context &context, Domain &domain); public: PrimitiveType(); diff --git a/src/plasp/pddl/expressions/Constant.cpp b/src/plasp/pddl/expressions/Constant.cpp index ac23a2a..be26c6b 100644 --- a/src/plasp/pddl/expressions/Constant.cpp +++ b/src/plasp/pddl/expressions/Constant.cpp @@ -84,7 +84,7 @@ void Constant::parseTypedDeclaration(Context &context, Domain &domain, Constants return; // If existing, parse and store parent type - auto *type = PrimitiveType::parseAndFindOrCreate(context, domain); + auto *type = PrimitiveType::parseAndFind(context, domain); // Assign parent type to all types that were previously flagged std::for_each(constants.begin(), constants.end(), diff --git a/src/plasp/pddl/expressions/PrimitiveType.cpp b/src/plasp/pddl/expressions/PrimitiveType.cpp index 11a7bd7..86c8141 100644 --- a/src/plasp/pddl/expressions/PrimitiveType.cpp +++ b/src/plasp/pddl/expressions/PrimitiveType.cpp @@ -85,7 +85,7 @@ void PrimitiveType::parseTypedDeclaration(Context &context, Domain &domain) throw utils::ParserException(context.parser, "Typing used but not declared as a requirement"); // If existing, parse and store parent type - auto *parentType = parseAndFindOrCreate(context, domain); + auto *parentType = parseAndFind(context, domain); parentType->setDirty(false); @@ -103,7 +103,7 @@ void PrimitiveType::parseTypedDeclaration(Context &context, Domain &domain) //////////////////////////////////////////////////////////////////////////////////////////////////// -PrimitiveType *PrimitiveType::parseAndFindOrCreate(Context &context, Domain &domain) +PrimitiveType *PrimitiveType::parseAndFind(Context &context, Domain &domain) { auto &types = domain.types(); @@ -122,8 +122,11 @@ PrimitiveType *PrimitiveType::parseAndFindOrCreate(Context &context, Domain &dom if (match == types.cend()) { - // If necessary, insert new primitive type but don't declare it - types.emplace_back(std::make_unique(typeName)); + // Only "object" is allowed as an implicit type + if (typeName == "object") + types.emplace_back(std::make_unique(typeName)); + else + throw utils::ParserException(context.parser, "Type \"" + typeName + "\" used but never declared"); return types.back().get(); } diff --git a/src/plasp/pddl/expressions/Type.cpp b/src/plasp/pddl/expressions/Type.cpp index b65c6ca..18ededa 100644 --- a/src/plasp/pddl/expressions/Type.cpp +++ b/src/plasp/pddl/expressions/Type.cpp @@ -20,7 +20,7 @@ namespace expressions ExpressionPointer parseExistingPrimitiveType(Context &context, ExpressionContext &expressionContext) { - auto *primitiveType = PrimitiveType::parseAndFindOrCreate(context, expressionContext.domain); + auto *primitiveType = PrimitiveType::parseAndFind(context, expressionContext.domain); return std::make_unique>(primitiveType); } diff --git a/src/plasp/pddl/expressions/Variable.cpp b/src/plasp/pddl/expressions/Variable.cpp index e5da42e..4a6b0f6 100644 --- a/src/plasp/pddl/expressions/Variable.cpp +++ b/src/plasp/pddl/expressions/Variable.cpp @@ -100,7 +100,7 @@ void Variable::parseTypedDeclaration(Context &context, ExpressionContext &expres } // Parse primitive type - const auto *type = PrimitiveType::parseAndFindOrCreate(context, expressionContext.domain); + const auto *type = PrimitiveType::parseAndFind(context, expressionContext.domain); setType(type); }