diff options
| author | gingerBill <bill@gingerbill.org> | 2020-05-22 14:54:30 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-05-22 14:54:30 +0100 |
| commit | 7bd1039a49e5fd771569cd1b5bca5b076d464a5f (patch) | |
| tree | 06382e3a2cf5bb813981faac87086d4c736b1664 /src/parser.cpp | |
| parent | 76a230372f59e873b09ce333fd466b433697b936 (diff) | |
Selector Call Expressions: `x->y(123) == x.y(x, 123)`
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 664aeb56d..8bde4a403 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -24,6 +24,11 @@ Token ast_token(Ast *node) { return ast_token(node->SelectorExpr.selector); } return node->SelectorExpr.token; + case Ast_SelectorCallExpr: + if (node->SelectorCallExpr.expr != nullptr) { + return ast_token(node->SelectorCallExpr.expr); + } + return node->SelectorCallExpr.token; case Ast_ImplicitSelectorExpr: if (node->ImplicitSelectorExpr.selector != nullptr) { return ast_token(node->ImplicitSelectorExpr.selector); @@ -174,6 +179,10 @@ Ast *clone_ast(Ast *node) { case Ast_ImplicitSelectorExpr: n->ImplicitSelectorExpr.selector = clone_ast(n->ImplicitSelectorExpr.selector); break; + case Ast_SelectorCallExpr: + n->SelectorCallExpr.expr = clone_ast(n->SelectorCallExpr.expr); + n->SelectorCallExpr.call = clone_ast(n->SelectorCallExpr.call); + break; case Ast_IndexExpr: n->IndexExpr.expr = clone_ast(n->IndexExpr.expr); n->IndexExpr.index = clone_ast(n->IndexExpr.index); @@ -546,6 +555,14 @@ Ast *ast_implicit_selector_expr(AstFile *f, Token token, Ast *selector) { return result; } +Ast *ast_selector_call_expr(AstFile *f, Token token, Ast *expr, Ast *call) { + Ast *result = alloc_ast_node(f, Ast_SelectorCallExpr); + result->SelectorCallExpr.token = token; + result->SelectorCallExpr.expr = expr; + result->SelectorCallExpr.call = call; + return result; +} + Ast *ast_index_expr(AstFile *f, Ast *expr, Ast *index, Token open, Token close) { Ast *result = alloc_ast_node(f, Ast_IndexExpr); @@ -2417,8 +2434,11 @@ Ast *parse_atom_expr(AstFile *f, Ast *operand, bool lhs) { case Token_ArrowRight: { Token token = advance_token(f); - syntax_error(token, "Selector expressions use '.' rather than '->'"); - operand = ast_selector_expr(f, token, operand, parse_ident(f)); + // syntax_error(token, "Selector expressions use '.' rather than '->'"); + + Ast *sel = ast_selector_expr(f, token, operand, parse_ident(f)); + Ast *call = parse_call_expr(f, sel); + operand = ast_selector_call_expr(f, token, sel, call); break; } |