Refactored parsing variable lists to reuse it with quantified expressions.

This commit is contained in:
2016-09-06 16:28:38 +02:00
parent 6f3769f364
commit ca6664feb2
6 changed files with 13 additions and 12 deletions

View File

@@ -32,7 +32,7 @@ void Action::parseDeclaration(Context &context, Domain &domain)
ExpressionContext expressionContext(domain, action->m_parameters);
// Read parameters
expressions::Variable::parseTypedDeclarations(context, expressionContext);
expressions::Variable::parseTypedDeclarations(context, expressionContext, action->m_parameters);
parser.expect<std::string>(")");

View File

@@ -42,7 +42,7 @@ void PredicateDeclaration::parse(Context &context, Domain &domain)
ExpressionContext expressionContext(domain, predicate->m_parameters);
// Parse arguments
expressions::Variable::parseTypedDeclarations(context, expressionContext);
expressions::Variable::parseTypedDeclarations(context, expressionContext, predicate->m_parameters);
context.parser.expect<std::string>(")");

View File

@@ -63,10 +63,10 @@ void Variable::parseDeclaration(Context &context, Variables &parameters)
////////////////////////////////////////////////////////////////////////////////////////////////////
void Variable::parseTypedDeclaration(Context &context, ExpressionContext &expressionContext)
void Variable::parseTypedDeclaration(Context &context, ExpressionContext &expressionContext,
Variables &variables)
{
auto &parser = context.parser;
auto &variables = expressionContext.parameters;
// Parse and store variable itself
parseDeclaration(context, variables);
@@ -108,22 +108,23 @@ void Variable::parseTypedDeclaration(Context &context, ExpressionContext &expres
////////////////////////////////////////////////////////////////////////////////////////////////////
void Variable::parseTypedDeclarations(Context &context, ExpressionContext &expressionContext)
void Variable::parseTypedDeclarations(Context &context, ExpressionContext &expressionContext,
Variables &variables)
{
auto &parser = context.parser;
while (parser.currentCharacter() != ')')
{
parseTypedDeclaration(context, expressionContext);
parseTypedDeclaration(context, expressionContext, variables);
parser.skipWhiteSpace();
}
if (expressionContext.parameters.empty())
if (variables.empty())
return;
// Check correct use of typing requirement
const auto typingUsed = (expressionContext.parameters.back()->type() != nullptr);
const auto typingUsed = (variables.back()->type() != nullptr);
// If types are given, check that typing is a requirement
if (typingUsed)