diff options
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 69b77bf2f..ae54b1dd6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -882,9 +882,13 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) { void error(AstNode *node, char *fmt, ...) { + Token token = {}; + if (node != NULL) { + token = ast_node_token(node); + } va_list va; va_start(va, fmt); - error_va(ast_node_token(node), fmt, va); + error_va(token, fmt, va); va_end(va); } @@ -2266,6 +2270,26 @@ AstNode *parse_operand(AstFile *f, bool lhs) { f->curr_proc = curr_proc; return ast_proc_lit(f, type, body, tags, link_name); + } else if (allow_token(f, Token_do)) { + if ((tags & ProcTag_foreign) != 0) { + syntax_error(token, "A procedure tagged as `#foreign` cannot have a body"); + } + AstNode *curr_proc = f->curr_proc; + AstNode *body = NULL; + f->curr_proc = type; + body = parse_stmt(f); + if (body->kind == AstNode_BlockStmt) { + syntax_error(body, "Expected a normal statement rather than a block statement"); + } else { + Token open = ast_node_token(body); + Token close = ast_node_token(body); + Array<AstNode *> stmts = make_ast_node_array(f, 1); + array_add(&stmts, body); + body = ast_block_stmt(f, stmts, open, close); + } + f->curr_proc = curr_proc; + + return ast_proc_lit(f, type, body, tags, link_name); } if ((tags & ProcTag_foreign) != 0) { @@ -3787,7 +3811,7 @@ AstNode *parse_if_stmt(AstFile *f) { syntax_error(f->curr_token, "Expected condition for if statement"); } - if (allow_token(f, Token_ArrowRight)) { + if (allow_token(f, Token_do)) { body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -3804,8 +3828,8 @@ AstNode *parse_if_stmt(AstFile *f) { case Token_OpenBrace: else_stmt = parse_block_stmt(f, false); break; - case Token_ArrowRight: { - Token arrow = expect_token(f, Token_ArrowRight); + case Token_do: { + Token arrow = expect_token(f, Token_do); body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -3838,7 +3862,7 @@ AstNode *parse_when_stmt(AstFile *f) { syntax_error(f->curr_token, "Expected condition for when statement"); } - if (allow_token(f, Token_ArrowRight)) { + if (allow_token(f, Token_do)) { body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -3855,8 +3879,8 @@ AstNode *parse_when_stmt(AstFile *f) { case Token_OpenBrace: else_stmt = parse_block_stmt(f, true); break; - case Token_ArrowRight: { - Token arrow = expect_token(f, Token_ArrowRight); + case Token_do: { + Token arrow = expect_token(f, Token_do); body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -3958,7 +3982,7 @@ AstNode *parse_for_stmt(AstFile *f) { } if (!is_range && (f->curr_token.kind == Token_Semicolon || - f->curr_token.kind == Token_ArrowRight)) { + f->curr_token.kind == Token_do)) { next_token(f); init = cond; cond = NULL; @@ -3967,7 +3991,7 @@ AstNode *parse_for_stmt(AstFile *f) { } expect_semicolon(f, cond); if (f->curr_token.kind != Token_OpenBrace && - f->curr_token.kind != Token_ArrowRight) { + f->curr_token.kind != Token_do) { post = parse_simple_stmt(f, StmtAllowFlag_None); } } @@ -3975,7 +3999,7 @@ AstNode *parse_for_stmt(AstFile *f) { f->expr_level = prev_level; } - if (allow_token(f, Token_ArrowRight)) { + if (allow_token(f, Token_do)) { body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -4236,7 +4260,7 @@ AstNode *parse_stmt(AstFile *f) { AstNode *expr = parse_expr(f, false); f->expr_level = prev_level; - if (allow_token(f, Token_ArrowRight)) { + if (allow_token(f, Token_do)) { body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); @@ -4256,7 +4280,7 @@ AstNode *parse_stmt(AstFile *f) { AstNode *expr = parse_expr(f, false); f->expr_level = prev_level; - if (allow_token(f, Token_ArrowRight)) { + if (allow_token(f, Token_do)) { body = parse_stmt(f); if (body->kind == AstNode_BlockStmt) { syntax_error(body, "Expected a normal statement rather than a block statement"); |