From 89f3eb0306f71495fcce6a4a486335026e985f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Thu, 31 Aug 2017 18:34:34 +0200 Subject: [PATCH] Implemented term parser. --- .../include/pddl/detail/parsing/Expressions.h | 10 +++++ lib/pddl/include/pddl/detail/parsing/Term.h | 27 ++++++++++++ .../src/pddl/detail/parsing/AtomicFormula.cpp | 18 +++----- lib/pddl/src/pddl/detail/parsing/Term.cpp | 42 +++++++++++++++++++ 4 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 lib/pddl/include/pddl/detail/parsing/Term.h create mode 100644 lib/pddl/src/pddl/detail/parsing/Term.cpp diff --git a/lib/pddl/include/pddl/detail/parsing/Expressions.h b/lib/pddl/include/pddl/detail/parsing/Expressions.h index cfb676e..970aad2 100644 --- a/lib/pddl/include/pddl/detail/parsing/Expressions.h +++ b/lib/pddl/include/pddl/detail/parsing/Expressions.h @@ -25,6 +25,8 @@ template std::experimental::optional> parseAt(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentParser parseArgument); template std::experimental::optional> parseEither(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentParser parseArgument); +template +std::experimental::optional> parseEquals(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentLeftParser parseArgumentLeft, ArgumentRightParser parseArgumentRight); template std::experimental::optional> parseExists(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentParser parseArgument); template @@ -177,6 +179,14 @@ std::experimental::optional> parseEither(Context &c //////////////////////////////////////////////////////////////////////////////////////////////////// +template +std::experimental::optional> parseEquals(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentLeftParser parseArgumentLeft, ArgumentRightParser parseArgumentRight) +{ + return parseBinary, ArgumentLeftParser, ArgumentRightParser>(context, astContext, variableStack, parseArgumentLeft, parseArgumentRight); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + template std::experimental::optional> parseExists(Context &context, ASTContext &astContext, VariableStack &variableStack, ArgumentParser parseArgument) { diff --git a/lib/pddl/include/pddl/detail/parsing/Term.h b/lib/pddl/include/pddl/detail/parsing/Term.h new file mode 100644 index 0000000..6304e9e --- /dev/null +++ b/lib/pddl/include/pddl/detail/parsing/Term.h @@ -0,0 +1,27 @@ +#ifndef __PDDL__DETAIL__PARSING__TERM_H +#define __PDDL__DETAIL__PARSING__TERM_H + +#include +#include +#include +#include + +namespace pddl +{ +namespace detail +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Type +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +std::experimental::optional parseTerm(Context &context, ASTContext &astContext, VariableStack &variableStack); + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} + +#endif diff --git a/lib/pddl/src/pddl/detail/parsing/AtomicFormula.cpp b/lib/pddl/src/pddl/detail/parsing/AtomicFormula.cpp index 98e7a80..3bd7117 100644 --- a/lib/pddl/src/pddl/detail/parsing/AtomicFormula.cpp +++ b/lib/pddl/src/pddl/detail/parsing/AtomicFormula.cpp @@ -1,8 +1,9 @@ #include #include +#include #include -#include +#include namespace pddl { @@ -17,20 +18,11 @@ namespace detail std::experimental::optional parseAtomicFormula(Context &context, ASTContext &astContext, VariableStack &variableStack) { - auto &tokenizer = context.tokenizer; + std::experimental::optional atomicFormula; - // Test unsupported expressions first - const auto position = tokenizer.position(); + if ((atomicFormula = parseEquals(context, astContext, variableStack, parseTerm, parseTerm))) + return std::move(atomicFormula.value()); - tokenizer.expect("("); - tokenizer.skipWhiteSpace(); - - if (tokenizer.testIdentifierAndReturn("=")) - throw exceptUnsupportedExpression(position, context); - - tokenizer.seek(position); - - // Now, test supported expressions return parsePredicate(context, astContext, variableStack); } diff --git a/lib/pddl/src/pddl/detail/parsing/Term.cpp b/lib/pddl/src/pddl/detail/parsing/Term.cpp new file mode 100644 index 0000000..d0d9e66 --- /dev/null +++ b/lib/pddl/src/pddl/detail/parsing/Term.cpp @@ -0,0 +1,42 @@ +#include + +#include +#include +#include + +namespace pddl +{ +namespace detail +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Term +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +std::experimental::optional parseTerm(Context &context, ASTContext &astContext, VariableStack &variableStack) +{ + auto &tokenizer = context.tokenizer; + + tokenizer.skipWhiteSpace(); + + // TODO: refactor + auto variable = testParsingVariable(context, variableStack); + + if (variable) + return std::move(variable.value()); + + // Parse argument if it is a constant + auto constant = testParsingConstant(context, astContext); + + if (constant) + return std::move(constant.value()); + + return std::experimental::nullopt; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +}