diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-09-07 19:23:00 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-09-07 19:23:00 +0100 |
| commit | 7ba13a18a33d8f852eb41b58da662ddb4649d04f (patch) | |
| tree | 89663aff3ad0c5e5f62a3432d269dcee050a71ed /src/parser.cpp | |
| parent | 2c4193a24226b084797af61e29c8355835c179a8 (diff) | |
Basic variadic `print` procedure
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index ec95e2926..3dd92d096 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -106,6 +106,7 @@ AST_NODE_KIND(_ExprBegin, "", struct{}) \ AstNode *proc, *arg_list; \ isize arg_list_count; \ Token open, close; \ + Token ellipsis; \ CallExprKind kind; \ }) \ AST_NODE_KIND(SliceExpr, "slice expression", struct { \ @@ -511,13 +512,14 @@ gb_inline AstNode *make_paren_expr(AstFile *f, AstNode *expr, Token open, Token return result; } -gb_inline AstNode *make_call_expr(AstFile *f, AstNode *proc, AstNode *arg_list, isize arg_list_count, Token open, Token close) { +gb_inline AstNode *make_call_expr(AstFile *f, AstNode *proc, AstNode *arg_list, isize arg_list_count, Token open, Token close, Token ellipsis) { AstNode *result = make_node(f, AstNode_CallExpr); result->CallExpr.proc = proc; result->CallExpr.arg_list = arg_list; result->CallExpr.arg_list_count = arg_list_count; - result->CallExpr.open = open; - result->CallExpr.close = close; + result->CallExpr.open = open; + result->CallExpr.close = close; + result->CallExpr.ellipsis = ellipsis; return result; } @@ -1296,15 +1298,22 @@ AstNode *parse_call_expr(AstFile *f, AstNode *operand) { AstNode *arg_list_curr = NULL; isize arg_list_count = 0; Token open_paren, close_paren; + Token ellipsis = {}; f->expr_level++; open_paren = expect_token(f, Token_OpenParen); while (f->cursor[0].kind != Token_CloseParen && - f->cursor[0].kind != Token_EOF) { + f->cursor[0].kind != Token_EOF && + ellipsis.pos.line == 0) { if (f->cursor[0].kind == Token_Comma) ast_file_err(f, f->cursor[0], "Expected an expression not a ,"); + if (f->cursor[0].kind == Token_Ellipsis) { + ellipsis = f->cursor[0]; + next_token(f); + } + DLIST_APPEND(arg_list, arg_list_curr, parse_expr(f, false)); arg_list_count++; @@ -1319,7 +1328,7 @@ AstNode *parse_call_expr(AstFile *f, AstNode *operand) { f->expr_level--; close_paren = expect_token(f, Token_CloseParen); - return make_call_expr(f, operand, arg_list, arg_list_count, open_paren, close_paren); + return make_call_expr(f, operand, arg_list, arg_list_count, open_paren, close_paren, ellipsis); } AstNode *parse_atom_expr(AstFile *f, b32 lhs) { @@ -1335,7 +1344,7 @@ AstNode *parse_atom_expr(AstFile *f, b32 lhs) { // TODO(bill): Handle this } AstNode *proc = parse_identifier(f); - operand = make_call_expr(f, proc, operand, 1, ast_node_token(operand), op); + operand = make_call_expr(f, proc, operand, 1, ast_node_token(operand), op, empty_token); } break; case Token_OpenParen: { @@ -1473,7 +1482,7 @@ AstNode *parse_binary_expr(AstFile *f, b32 lhs, i32 prec_in) { AstNode *proc = parse_identifier(f); AstNode *right = parse_binary_expr(f, false, prec+1); expression->next = right; - expression = make_call_expr(f, proc, expression, 2, op, ast_node_token(right)); + expression = make_call_expr(f, proc, expression, 2, op, ast_node_token(right), empty_token); continue; } break; |