authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-12-06 23:49:20-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-12-06 23:49:20-07:00
log94e61287e708f61d2a9d814bfe7910d13e067ada
treede3ef329d7dcc726263cf9dd7cfb61acac4a0500
parent66e3aa09104781f460da1ea721b083d18eec351b

let is now a statement, not an expression


3 files changed, 22 insertions(+), 16 deletions(-)

README.md+4-4
...@@ -150,13 +150,15 @@ PointerType : token(Star) token(Const) Type | token(Star) token(Mut) Type...@@ -150,13 +150,15 @@ PointerType : token(Star) token(Const) Type | token(Star) token(Mut) Type
150150
151Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)151Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)
152152
153Statement : Label | NonBlockExpression token(Semicolon) | BlockExpression153Statement : Label | VariableDeclaration token(Semicolon) | NonBlockExpression token(Semicolon) | BlockExpression
154154
155Label: token(Symbol) token(Colon)155Label: token(Symbol) token(Colon)
156156
157VariableDeclaration : token(Let) option(token(Mut)) token(Symbol) (token(Eq) Expression | token(Colon) Type option(token(Eq) Expression))
158
157Expression : BlockExpression | NonBlockExpression159Expression : BlockExpression | NonBlockExpression
158160
159NonBlockExpression : ReturnExpression | VariableDeclaration | AssignmentExpression161NonBlockExpression : ReturnExpression | AssignmentExpression
160162
161AssignmentExpression : BoolOrExpression token(Equal) BoolOrExpression | BoolOrExpression163AssignmentExpression : BoolOrExpression token(Equal) BoolOrExpression | BoolOrExpression
162164
...@@ -166,8 +168,6 @@ BoolOrExpression : BoolAndExpression token(BoolOr) BoolAndExpression | BoolAndEx...@@ -166,8 +168,6 @@ BoolOrExpression : BoolAndExpression token(BoolOr) BoolAndExpression | BoolAndEx
166168
167ReturnExpression : token(Return) option(Expression)169ReturnExpression : token(Return) option(Expression)
168170
169VariableDeclaration : token(Let) option(token(Mut)) token(Symbol) (token(Eq) Expression | token(Colon) Type option(token(Eq) Expression))
170
171IfExpression : token(If) Expression Block option(Else | ElseIf)171IfExpression : token(If) Expression Block option(Else | ElseIf)
172172
173ElseIf : token(Else) IfExpression173ElseIf : token(Else) IfExpression
src/parser.cpp+12-12
...@@ -1214,7 +1214,7 @@ static AstNode *ast_parse_ass_expr(ParseContext *pc, int *token_index, bool mand...@@ -1214,7 +1214,7 @@ static AstNode *ast_parse_ass_expr(ParseContext *pc, int *token_index, bool mand
1214}1214}
12151215
1216/*1216/*
1217NonBlockExpression : ReturnExpression | VariableDeclaration | AssignmentExpression1217NonBlockExpression : ReturnExpression | AssignmentExpression
1218*/1218*/
1219static AstNode *ast_parse_non_block_expr(ParseContext *pc, int *token_index, bool mandatory) {1219static AstNode *ast_parse_non_block_expr(ParseContext *pc, int *token_index, bool mandatory) {
1220 Token *token = &pc->tokens->at(*token_index);1220 Token *token = &pc->tokens->at(*token_index);
...@@ -1223,11 +1223,6 @@ static AstNode *ast_parse_non_block_expr(ParseContext *pc, int *token_index, boo...@@ -1223,11 +1223,6 @@ static AstNode *ast_parse_non_block_expr(ParseContext *pc, int *token_index, boo
1223 if (return_expr)1223 if (return_expr)
1224 return return_expr;1224 return return_expr;
12251225
1226 AstNode *variable_declaration_expr = ast_parse_variable_declaration_expr(pc, token_index, false);
1227 if (variable_declaration_expr)
1228 return variable_declaration_expr;
1229
1230
1231 AstNode *ass_expr = ast_parse_ass_expr(pc, token_index, false);1226 AstNode *ass_expr = ast_parse_ass_expr(pc, token_index, false);
1232 if (ass_expr)1227 if (ass_expr)
1233 return ass_expr;1228 return ass_expr;
...@@ -1288,8 +1283,8 @@ static AstNode *ast_parse_label(ParseContext *pc, int *token_index, bool mandato...@@ -1288,8 +1283,8 @@ static AstNode *ast_parse_label(ParseContext *pc, int *token_index, bool mandato
1288}1283}
12891284
1290/*1285/*
1291Statement : Label | NonBlockExpression token(Semicolon) | BlockExpression
1292Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)1286Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)
1287Statement : Label | VariableDeclaration token(Semicolon) | NonBlockExpression token(Semicolon) | BlockExpression
1293*/1288*/
1294static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandatory) {1289static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandatory) {
1295 Token *last_token = &pc->tokens->at(*token_index);1290 Token *last_token = &pc->tokens->at(*token_index);
...@@ -1316,12 +1311,17 @@ static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandato...@@ -1316,12 +1311,17 @@ static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandato
1316 if (statement_node) {1311 if (statement_node) {
1317 semicolon_expected = false;1312 semicolon_expected = false;
1318 } else {1313 } else {
1319 statement_node = ast_parse_block_expr(pc, token_index, false);1314 statement_node = ast_parse_variable_declaration_expr(pc, token_index, false);
1320 semicolon_expected = !statement_node;1315 if (statement_node) {
1321 if (!statement_node) {1316 semicolon_expected = true;
1322 statement_node = ast_parse_non_block_expr(pc, token_index, false);1317 } else {
1318 statement_node = ast_parse_block_expr(pc, token_index, false);
1319 semicolon_expected = !statement_node;
1323 if (!statement_node) {1320 if (!statement_node) {
1324 statement_node = ast_create_node(pc, NodeTypeVoid, last_token);1321 statement_node = ast_parse_non_block_expr(pc, token_index, false);
1322 if (!statement_node) {
1323 statement_node = ast_create_node(pc, NodeTypeVoid, last_token);
1324 }
1325 }1325 }
1326 }1326 }
1327 }1327 }
test/run_tests.cpp+6
...@@ -514,6 +514,12 @@ fn f() {...@@ -514,6 +514,12 @@ fn f() {
514 b = 3;514 b = 3;
515}515}
516 )SOURCE", 1, ".tmp_source.zig:3:5: error: use of undeclared identifier 'b'");516 )SOURCE", 1, ".tmp_source.zig:3:5: error: use of undeclared identifier 'b'");
517
518 add_compile_fail_case("let is a statement, not an expression", R"SOURCE(
519fn f() {
520 (let a = 0);
521}
522 )SOURCE", 1, ".tmp_source.zig:3:6: error: invalid token: 'let'");
517}523}
518524
519static void print_compiler_invocation(TestCase *test_case, Buf *zig_stderr) {525static void print_compiler_invocation(TestCase *test_case, Buf *zig_stderr) {