mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Цепочка вызовов функций
This commit is contained in:
parent
06fe09ce98
commit
5f71e9a9be
@ -159,7 +159,7 @@ public final class Parser {
|
|||||||
return new ExprStatement(match());
|
return new ExprStatement(match());
|
||||||
}
|
}
|
||||||
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LPAREN)) {
|
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LPAREN)) {
|
||||||
return new ExprStatement(function(qualifiedName()));
|
return new ExprStatement(functionChain(qualifiedName()));
|
||||||
}
|
}
|
||||||
return assignmentStatement();
|
return assignmentStatement();
|
||||||
}
|
}
|
||||||
@ -297,6 +297,23 @@ public final class Parser {
|
|||||||
return statementOrBlock();
|
return statementOrBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Expression functionChain(Expression qualifiedNameExpr) {
|
||||||
|
// f1().f2().f3() || f1().key
|
||||||
|
final Expression expr = function(qualifiedNameExpr);
|
||||||
|
if (lookMatch(0, TokenType.DOT)) {
|
||||||
|
final List<Expression> indices = variableSuffix();
|
||||||
|
if (indices == null | indices.isEmpty()) return expr;
|
||||||
|
|
||||||
|
if (lookMatch(0, TokenType.LPAREN)) {
|
||||||
|
// next function call
|
||||||
|
return functionChain(new ContainerAccessExpression(expr, indices));
|
||||||
|
}
|
||||||
|
// container access
|
||||||
|
return new ContainerAccessExpression(expr, indices);
|
||||||
|
}
|
||||||
|
return expr;
|
||||||
|
}
|
||||||
|
|
||||||
private FunctionalExpression function(Expression qualifiedNameExpr) {
|
private FunctionalExpression function(Expression qualifiedNameExpr) {
|
||||||
// function(arg1, arg2, ...)
|
// function(arg1, arg2, ...)
|
||||||
consume(TokenType.LPAREN);
|
consume(TokenType.LPAREN);
|
||||||
@ -688,14 +705,14 @@ public final class Parser {
|
|||||||
private Expression variable() {
|
private Expression variable() {
|
||||||
// function(...
|
// function(...
|
||||||
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LPAREN)) {
|
if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LPAREN)) {
|
||||||
return function(new ValueExpression(consume(TokenType.WORD).getText()));
|
return functionChain(new ValueExpression(consume(TokenType.WORD).getText()));
|
||||||
}
|
}
|
||||||
|
|
||||||
final Expression qualifiedNameExpr = qualifiedName();
|
final Expression qualifiedNameExpr = qualifiedName();
|
||||||
if (qualifiedNameExpr != null) {
|
if (qualifiedNameExpr != null) {
|
||||||
// variable(args) || arr["key"](args) || obj.key(args)
|
// variable(args) || arr["key"](args) || obj.key(args)
|
||||||
if (lookMatch(0, TokenType.LPAREN)) {
|
if (lookMatch(0, TokenType.LPAREN)) {
|
||||||
return function(qualifiedNameExpr);
|
return functionChain(qualifiedNameExpr);
|
||||||
}
|
}
|
||||||
// postfix increment/decrement
|
// postfix increment/decrement
|
||||||
if (match(TokenType.PLUSPLUS)) {
|
if (match(TokenType.PLUSPLUS)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user