From 5c37026ec7bf20e042dc2bb50969b4a7e342cbb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Mon, 30 May 2016 15:06:04 +0200 Subject: [PATCH] Parsing PDDL requirements. --- include/plasp/pddl/Domain.h | 8 +++++++ include/plasp/pddl/Requirement.h | 3 +++ src/plasp/pddl/Domain.cpp | 36 +++++++++++++++++++++++++++++++- src/plasp/pddl/Requirement.cpp | 6 +++--- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/include/plasp/pddl/Domain.h b/include/plasp/pddl/Domain.h index e260463..6659d2b 100644 --- a/include/plasp/pddl/Domain.h +++ b/include/plasp/pddl/Domain.h @@ -1,6 +1,7 @@ #ifndef __PLASP__PDDL__DOMAIN_H #define __PLASP__PDDL__DOMAIN_H +#include #include namespace plasp @@ -19,12 +20,19 @@ class Domain public: static Domain fromPDDL(utils::Parser &parser); + public: + const std::string &name() const; + const Requirement::Types &requirements() const; + private: Domain() = default; void parseSection(utils::Parser &parser); + void parseRequirementsSection(utils::Parser &parser); + std::string m_name; + Requirement::Types m_requirements; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/plasp/pddl/Requirement.h b/include/plasp/pddl/Requirement.h index 159c1ae..4b16ad7 100644 --- a/include/plasp/pddl/Requirement.h +++ b/include/plasp/pddl/Requirement.h @@ -2,6 +2,7 @@ #define __PLASP__PDDL__REQUIREMENT_H #include +#include namespace plasp { @@ -40,6 +41,8 @@ struct Requirement ActionCosts }; + using Types = std::vector; + static Requirement::Type fromPDDL(utils::Parser &parser); static void toPDDL(std::ostream &ostream, Requirement::Type requirementType); diff --git a/src/plasp/pddl/Domain.cpp b/src/plasp/pddl/Domain.cpp index ad08ad9..2ce294e 100644 --- a/src/plasp/pddl/Domain.cpp +++ b/src/plasp/pddl/Domain.cpp @@ -38,6 +38,20 @@ Domain Domain::fromPDDL(utils::Parser &parser) //////////////////////////////////////////////////////////////////////////////////////////////////// +const std::string &Domain::name() const +{ + return m_name; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const Requirement::Types &Domain::requirements() const +{ + return m_requirements; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + void Domain::parseSection(utils::Parser &parser) { parser.expect("(:"); @@ -69,7 +83,7 @@ void Domain::parseSection(utils::Parser &parser) }; if (sectionIdentifier == "requirements") - skipSection(); + parseRequirementsSection(parser); else if (sectionIdentifier == "types") skipSection(); else if (sectionIdentifier == "constants") @@ -86,5 +100,25 @@ void Domain::parseSection(utils::Parser &parser) //////////////////////////////////////////////////////////////////////////////////////////////////// +void Domain::parseRequirementsSection(utils::Parser &parser) +{ + while (true) + { + parser.skipWhiteSpace(); + + if (parser.currentCharacter() == ')') + break; + + if (parser.currentCharacter() == ':') + parser.advance(); + + m_requirements.emplace_back(Requirement::fromPDDL(parser)); + } + + parser.expect(")"); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + } } diff --git a/src/plasp/pddl/Requirement.cpp b/src/plasp/pddl/Requirement.cpp index ec8c168..3b1b574 100644 --- a/src/plasp/pddl/Requirement.cpp +++ b/src/plasp/pddl/Requirement.cpp @@ -18,7 +18,7 @@ namespace pddl // //////////////////////////////////////////////////////////////////////////////////////////////////// -using RequirementTypeNames = boost::bimap; +using RequirementTypeNames = boost::bimap; //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -74,10 +74,10 @@ Requirement::Type Requirement::fromPDDL(utils::Parser &parser) { const auto requirementName = parser.parseIdentifier(isIdentifier); - const auto match = requirementTypesToPDDL.right.find(requirementName.c_str()); + const auto match = requirementTypesToPDDL.right.find(requirementName); if (match == requirementTypesToPDDL.right.end()) - throw utils::ParserException(parser.row(), parser.column(), "Could not parse requirement"); + throw utils::ParserException(parser.row(), parser.column(), "Unknown PDDL requirement \"" + requirementName + "\""); return match->second; }