diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-10-16 21:31:06 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-10-16 21:31:06 +0100 |
| commit | a675d3f94d2c10ce6e50b88c6c39b36c746a4d2a (patch) | |
| tree | 5ef34075438257fea6ef161e90ac403fd95663fd /src/parser.cpp | |
| parent | b9719df0ad97eea1ba67525a9ab1d3c89e95ee8c (diff) | |
union_cast
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 1cff4b573..6e6d44484 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -122,6 +122,7 @@ AstNodeArray make_ast_node_array(AstFile *f) { AST_NODE_KIND(_ExprBegin, "", struct{}) \ AST_NODE_KIND(BadExpr, "bad expression", struct { Token begin, end; }) \ AST_NODE_KIND(TagExpr, "tag expression", struct { Token token, name; AstNode *expr; }) \ + AST_NODE_KIND(RunExpr, "run expression", struct { Token token, name; AstNode *expr; }) \ AST_NODE_KIND(UnaryExpr, "unary expression", struct { Token op; AstNode *expr; }) \ AST_NODE_KIND(BinaryExpr, "binary expression", struct { Token op; AstNode *left, *right; } ) \ AST_NODE_KIND(ParenExpr, "parentheses expression", struct { AstNode *expr; Token open, close; }) \ @@ -376,6 +377,8 @@ Token ast_node_token(AstNode *node) { return node->CompoundLit.open; case AstNode_TagExpr: return node->TagExpr.token; + case AstNode_RunExpr: + return node->RunExpr.token; case AstNode_BadExpr: return node->BadExpr.begin; case AstNode_UnaryExpr: @@ -512,6 +515,15 @@ AstNode *make_tag_expr(AstFile *f, Token token, Token name, AstNode *expr) { return result; } +AstNode *make_run_expr(AstFile *f, Token token, Token name, AstNode *expr) { + AstNode *result = make_node(f, AstNode_RunExpr); + result->RunExpr.token = token; + result->RunExpr.name = name; + result->RunExpr.expr = expr; + return result; +} + + AstNode *make_tag_stmt(AstFile *f, Token token, Token name, AstNode *stmt) { AstNode *result = make_node(f, AstNode_TagStmt); result->TagStmt.token = token; @@ -1352,9 +1364,9 @@ AstNode *parse_operand(AstFile *f, b32 lhs) { } case Token_Hash: { - operand = parse_tag_expr(f, NULL); - String name = operand->TagExpr.name.string; - if (name == "rune") { + Token token = expect_token(f, Token_Hash); + Token name = expect_token(f, Token_Identifier); + if (name.string == "rune") { if (f->curr_token.kind == Token_String) { Token *s = &f->curr_token; @@ -1366,20 +1378,28 @@ AstNode *parse_operand(AstFile *f, b32 lhs) { expect_token(f, Token_String); } operand = parse_operand(f, lhs); - } else if (name == "file") { - Token token = operand->TagExpr.name; + } else if (name.string == "file") { + Token token = name; token.kind = Token_String; token.string = token.pos.file; return make_basic_lit(f, token); - } else if (name == "line") { - Token token = operand->TagExpr.name; + } else if (name.string == "line") { + Token token = name; token.kind = Token_Integer; char *str = gb_alloc_array(gb_arena_allocator(&f->arena), char, 20); gb_i64_to_str(token.pos.line, str, 10); token.string = make_string(str); return make_basic_lit(f, token); + } else if (name.string == "run") { + AstNode *expr = parse_expr(f, false); + operand = make_run_expr(f, token, name, expr); + if (unparen_expr(expr)->kind != AstNode_CallExpr) { + error(ast_node_token(expr), "#run can only be applied to procedure calls"); + operand = make_bad_expr(f, token, f->curr_token); + } + warning(token, "#run is not yet implemented"); } else { - operand->TagExpr.expr = parse_expr(f, false); + operand = make_tag_expr(f, token, name, parse_expr(f, false)); } return operand; } @@ -1658,6 +1678,7 @@ i32 token_precedence(Token t) { case Token_as: case Token_transmute: case Token_down_cast: + case Token_union_cast: return 7; } @@ -1705,6 +1726,7 @@ AstNode *parse_binary_expr(AstFile *f, b32 lhs, i32 prec_in) { case Token_as: case Token_transmute: case Token_down_cast: + case Token_union_cast: right = parse_type(f); break; |