From efdde7c9880a23b20c6ecc4013dcd91302a6f01e Mon Sep 17 00:00:00 2001 From: Hackerpilot Date: Tue, 4 Mar 2014 22:49:20 -0800 Subject: [PATCH] Fix #138. Parser should now support opCall correctly --- stdx/d/ast.d | 3 ++- stdx/d/parser.d | 35 +++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/stdx/d/ast.d b/stdx/d/ast.d index db4920f..636b516 100644 --- a/stdx/d/ast.d +++ b/stdx/d/ast.d @@ -1359,8 +1359,9 @@ final class FunctionCallExpression : ExpressionNode public: override void accept(ASTVisitor visitor) const { - mixin (visitIfNotNull!(unaryExpression, arguments, templateArguments)); + mixin (visitIfNotNull!(type, unaryExpression, templateArguments, arguments)); } + /** */ Type type; /** */ UnaryExpression unaryExpression; /** */ TemplateArguments templateArguments; /** */ Arguments arguments; diff --git a/stdx/d/parser.d b/stdx/d/parser.d index e5e8e10..add8e20 100644 --- a/stdx/d/parser.d +++ b/stdx/d/parser.d @@ -2558,18 +2558,32 @@ body {} // six * Parses a FunctionCallExpression * * $(GRAMMAR $(RULEDEF functionCallExpression): - * $(RULE unaryExpression) $(RULE templateArguments)? $(RULE arguments) + * $(RULE unaryExpression) $(RULE templateArguments)? $(RULE arguments) + * | $(RULE type) $(RULE arguments) * ;) */ FunctionCallExpression parseFunctionCallExpression(UnaryExpression unary = null) { mixin(traceEnterAndExit!(__FUNCTION__)); auto node = allocate!FunctionCallExpression; - node.unaryExpression = unary is null ? parseUnaryExpression() : unary; - if (currentIs(tok!"!")) - node.templateArguments = parseTemplateArguments(); + switch (current.type) + { + case tok!"const": + case tok!"immutable": + case tok!"inout": + case tok!"shared": + case tok!"scope": + case tok!"pure": + case tok!"nothrow": + node.type = parseType(); + break; + default: + node.unaryExpression = unary is null ? parseUnaryExpression() : unary; + if (currentIs(tok!"!")) + node.templateArguments = parseTemplateArguments(); + } node.arguments = parseArguments(); - return node; + return node.arguments is null ? null : node; } /** @@ -5855,6 +5869,16 @@ q{(int a, ...) auto node = allocate!UnaryExpression; switch (current.type) { + case tok!"const": + case tok!"immutable": + case tok!"inout": + case tok!"shared": + case tok!"scope": + case tok!"pure": + case tok!"nothrow": + warn("parsing function call expression"); + node.functionCallExpression = parseFunctionCallExpression(); + break; case tok!"&": case tok!"!": case tok!"*": @@ -5923,7 +5947,6 @@ q{(int a, ...) goto case tok!"("; else break loop; - case tok!"(": auto newUnary = allocate!UnaryExpression(); newUnary.functionCallExpression = parseFunctionCallExpression(node);