diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-04-30 15:09:36 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-04-30 15:09:36 +0100 |
| commit | 784f3ecf7e427c1d948541f62253d6d2eab9e70d (patch) | |
| tree | dd1dba8ff48b3b31944773fc341de8832b0fd582 /src/parser.c | |
| parent | 54ea70df985546fa2d1fc95f55b5a83a41ee469c (diff) | |
Syntax change: cast(T)x => T(x); union_cast(T)x => x.(T); transmute(T)x => transmute(T, x); `y:=^x` => `y:=&x;`
Sorry for all the code breaking in this commit :(
Diffstat (limited to 'src/parser.c')
| -rw-r--r-- | src/parser.c | 97 |
1 files changed, 52 insertions, 45 deletions
diff --git a/src/parser.c b/src/parser.c index 3dab46644..ad1e2945f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -182,9 +182,9 @@ AST_NODE_KIND(_ExprBegin, "", i32) \ Token open; \ Token close; \ }) \ - AST_NODE_KIND(CastExpr, "cast expression", struct { Token token; AstNode *type, *expr; Token open, close; }) \ - AST_NODE_KIND(FieldValue, "field value", struct { Token eq; AstNode *field, *value; }) \ - AST_NODE_KIND(TernaryExpr, "ternary expression", struct { AstNode *cond, *x, *y; }) \ + AST_NODE_KIND(FieldValue, "field value", struct { Token eq; AstNode *field, *value; }) \ + AST_NODE_KIND(TernaryExpr, "ternary expression", struct { AstNode *cond, *x, *y; }) \ + AST_NODE_KIND(TypeAssertion, "type assertion", struct { AstNode *expr; Token dot; AstNode *type; }) \ AST_NODE_KIND(_ExprEnd, "", i32) \ AST_NODE_KIND(_StmtBegin, "", i32) \ AST_NODE_KIND(BadStmt, "bad statement", struct { Token begin, end; }) \ @@ -485,13 +485,13 @@ Token ast_node_token(AstNode *node) { return ast_node_token(node->SelectorExpr.selector); } return node->SelectorExpr.token; - case AstNode_IndexExpr: return node->IndexExpr.open; - case AstNode_SliceExpr: return node->SliceExpr.open; - case AstNode_Ellipsis: return node->Ellipsis.token; - case AstNode_CastExpr: return node->CastExpr.token; - case AstNode_FieldValue: return node->FieldValue.eq; - case AstNode_DerefExpr: return node->DerefExpr.op; - case AstNode_TernaryExpr: return ast_node_token(node->TernaryExpr.cond); + case AstNode_IndexExpr: return node->IndexExpr.open; + case AstNode_SliceExpr: return node->SliceExpr.open; + case AstNode_Ellipsis: return node->Ellipsis.token; + case AstNode_FieldValue: return node->FieldValue.eq; + case AstNode_DerefExpr: return node->DerefExpr.op; + case AstNode_TernaryExpr: return ast_node_token(node->TernaryExpr.cond); + case AstNode_TypeAssertion: return ast_node_token(node->TypeAssertion.expr); case AstNode_BadStmt: return node->BadStmt.begin; case AstNode_EmptyStmt: return node->EmptyStmt.token; @@ -773,16 +773,6 @@ AstNode *ast_field_value(AstFile *f, AstNode *field, AstNode *value, Token eq) { return result; } -AstNode *ast_cast_expr(AstFile *f, Token token, AstNode *type, AstNode *expr, Token open, Token close) { - AstNode *result = make_ast_node(f, AstNode_CastExpr); - result->CastExpr.token = token; - result->CastExpr.type = type; - result->CastExpr.expr = expr; - result->CastExpr.open = open; - result->CastExpr.close = close; - return result; -} - AstNode *ast_compound_lit(AstFile *f, AstNode *type, AstNodeArray elems, Token open, Token close) { AstNode *result = make_ast_node(f, AstNode_CompoundLit); result->CompoundLit.type = type; @@ -806,6 +796,14 @@ AstNode *ast_ternary_expr(AstFile *f, AstNode *cond, AstNode *x, AstNode *y) { result->TernaryExpr.y = y; return result; } +AstNode *ast_type_assertion(AstFile *f, AstNode *expr, Token dot, AstNode *type) { + AstNode *result = make_ast_node(f, AstNode_TypeAssertion); + result->TypeAssertion.expr = expr; + result->TypeAssertion.dot = dot; + result->TypeAssertion.type = type; + return result; +} + @@ -1977,6 +1975,13 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) { // case Token_Integer: // operand = ast_selector_expr(f, token, operand, parse_expr(f, lhs)); // break; + case Token_OpenParen: { + Token open = expect_token(f, Token_OpenParen); + AstNode *type = parse_type(f); + Token close = expect_token(f, Token_CloseParen); + operand = ast_type_assertion(f, operand, token, type); + } break; + default: syntax_error(f->curr_token, "Expected a selector"); next_token(f); @@ -2073,32 +2078,33 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) { AstNode *parse_unary_expr(AstFile *f, bool lhs) { switch (f->curr_token.kind) { - case Token_cast: - case Token_transmute: - case Token_union_cast: - { - Token token = f->curr_token; next_token(f); - Token open = expect_token(f, Token_OpenParen); - AstNode *type = parse_type(f); - Token close = expect_token(f, Token_CloseParen); - AstNode *expr = parse_unary_expr(f, lhs); - return ast_cast_expr(f, token, type, expr, open, close); - } break; + // case Token_cast: + // case Token_transmute: + // case Token_union_cast: + // { + // Token token = f->curr_token; next_token(f); + // Token open = expect_token(f, Token_OpenParen); + // AstNode *type = parse_type(f); + // Token close = expect_token(f, Token_CloseParen); + // AstNode *expr = parse_unary_expr(f, lhs); + // return ast_cast_expr(f, token, type, expr, open, close); + // } break; + + // case Token_Pointer: { + // Token op = f->curr_token; + // next_token(f); + // AstNode *expr = parse_unary_expr(f, lhs); + // if (is_ast_node_type(expr)) { + // return ast_pointer_type(f, op, expr); + // } + // return ast_unary_expr(f, op, expr); + // } break; - case Token_Pointer: { - Token op = f->curr_token; - next_token(f); - AstNode *expr = parse_unary_expr(f, lhs); - if (is_ast_node_type(expr)) { - return ast_pointer_type(f, op, expr); - } - return ast_unary_expr(f, op, expr); - } break; - // case Token_Maybe: case Token_Add: case Token_Sub: case Token_Not: - case Token_Xor: { + case Token_Xor: + case Token_And: { Token op = f->curr_token; next_token(f); return ast_unary_expr(f, op, parse_unary_expr(f, lhs)); @@ -2663,10 +2669,11 @@ AstNode *parse_type_or_ident(AstFile *f) { AstNode *sel = parse_ident(f); e = ast_selector_expr(f, token, e, sel); } - if (f->curr_token.kind == Token_OpenParen) { + // TODO(bill): Merge type_or_ident into the general parsing for expressions + // if (f->curr_token.kind == Token_OpenParen) { // HACK NOTE(bill): For type_of_val(expr) et al. - e = parse_call_expr(f, e); - } + // e = parse_call_expr(f, e); + // } return e; } |