Implemented term parser.

This commit is contained in:
2017-08-31 18:34:34 +02:00
parent 716b4801aa
commit 89f3eb0306
4 changed files with 84 additions and 13 deletions

View File

@@ -1,8 +1,9 @@
#include <pddl/detail/parsing/AtomicFormula.h>
#include <pddl/AST.h>
#include <pddl/detail/parsing/Expressions.h>
#include <pddl/detail/parsing/Predicate.h>
#include <pddl/detail/parsing/Unsupported.h>
#include <pddl/detail/parsing/Term.h>
namespace pddl
{
@@ -17,20 +18,11 @@ namespace detail
std::experimental::optional<ast::AtomicFormula> parseAtomicFormula(Context &context, ASTContext &astContext, VariableStack &variableStack)
{
auto &tokenizer = context.tokenizer;
std::experimental::optional<ast::AtomicFormula> atomicFormula;
// Test unsupported expressions first
const auto position = tokenizer.position();
if ((atomicFormula = parseEquals<ast::Term, ast::Term>(context, astContext, variableStack, parseTerm, parseTerm)))
return std::move(atomicFormula.value());
tokenizer.expect<std::string>("(");
tokenizer.skipWhiteSpace();
if (tokenizer.testIdentifierAndReturn("="))
throw exceptUnsupportedExpression(position, context);
tokenizer.seek(position);
// Now, test supported expressions
return parsePredicate(context, astContext, variableStack);
}

View File

@@ -0,0 +1,42 @@
#include <pddl/detail/parsing/Term.h>
#include <pddl/Exception.h>
#include <pddl/detail/parsing/Constant.h>
#include <pddl/detail/parsing/Variable.h>
namespace pddl
{
namespace detail
{
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Term
//
////////////////////////////////////////////////////////////////////////////////////////////////////
std::experimental::optional<ast::Term> 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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
}
}