aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-07-11 14:40:27 +0100
committerGinger Bill <bill@gingerbill.org>2017-07-11 14:40:27 +0100
commitc4c6975f1b36eb4848aacf81c7be3584c51f9ab6 (patch)
treea73b5401f45e8ffb47ebc3fe64281d7080ab7195 /src/parser.cpp
parent0be0fb2a57e997d4e7efd7b42f7fe1a1b35c80e5 (diff)
`cast(Type)expr`; Fix overloaded procedure determination on assignment
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 8a55a31ea..6836e901f 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -201,6 +201,7 @@ AST_NODE_KIND(_ExprBegin, "", i32) \
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(TypeCast, "type cast", struct { Token token; AstNode *type, *expr; }) \
AST_NODE_KIND(_ExprEnd, "", i32) \
AST_NODE_KIND(_StmtBegin, "", i32) \
AST_NODE_KIND(BadStmt, "bad statement", struct { Token begin, end; }) \
@@ -542,6 +543,7 @@ Token ast_node_token(AstNode *node) {
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_TypeCast: return node->TypeCast.token;
case AstNode_BadStmt: return node->BadStmt.begin;
case AstNode_EmptyStmt: return node->EmptyStmt.token;
@@ -1146,6 +1148,14 @@ AstNode *ast_type_assertion(AstFile *f, AstNode *expr, Token dot, AstNode *type)
result->TypeAssertion.type = type;
return result;
}
+AstNode *ast_type_cast(AstFile *f, Token token, AstNode *type, AstNode *expr) {
+ AstNode *result = make_ast_node(f, AstNode_TypeCast);
+ result->TypeCast.token = token;
+ result->TypeCast.type = type;
+ result->TypeCast.expr = expr;
+ return result;
+}
+
@@ -1875,12 +1885,8 @@ void expect_semicolon(AstFile *f, AstNode *s) {
if (is_semicolon_optional_for_node(f, s)) {
return;
}
- } else {
- if (s->kind == AstNode_ValueDecl) {
- if (f->curr_token.kind == Token_CloseBrace) {
- return;
- }
- }
+ } else if (f->curr_token.kind == Token_CloseBrace) {
+ return;
}
String node_string = ast_node_strings[s->kind];
if (s->kind == AstNode_GenDecl) {
@@ -2581,6 +2587,13 @@ AstNode *parse_unary_expr(AstFile *f, bool lhs) {
next_token(f);
return ast_unary_expr(f, op, parse_unary_expr(f, lhs));
} break;
+ case Token_cast: {
+ Token token = expect_token(f, Token_cast);
+ Token open = expect_token_after(f, Token_OpenParen, "cast");
+ AstNode *type = parse_type(f);
+ Token close = expect_token(f, Token_CloseParen);
+ return ast_type_cast(f, token, type, parse_unary_expr(f, lhs));
+ } break;
}
AstNode *operand = parse_operand(f, lhs);