authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2019-03-19 10:36:37+01:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2019-03-19 10:36:37+01:00
loge508b85746391b724e2a3b8e166cea06d75fdae0
treedfac829b684ddbdb55f292c28b190bbc1b7c9f21
parent567175f833b13d7c4f9363504616d17b1a3efa2c

Updated parser to newest grammar


1 files changed, 22 insertions(+), 29 deletions(-)

src/parser.cpp+22-29
......@@ -61,7 +61,6 @@ static AstNode *ast_parse_multiply_expr(ParseContext *pc);
6161static AstNode *ast_parse_prefix_expr(ParseContext *pc);
6262static AstNode *ast_parse_primary_expr(ParseContext *pc);
6363static AstNode *ast_parse_if_expr(ParseContext *pc);
64static AstNode *ast_parse_labeled_expr(ParseContext *pc);
6564static AstNode *ast_parse_block(ParseContext *pc);
6665static AstNode *ast_parse_loop_expr(ParseContext *pc);
6766static AstNode *ast_parse_for_expr(ParseContext *pc);
......@@ -1263,7 +1262,8 @@ static AstNode *ast_parse_prefix_expr(ParseContext *pc) {
12631262// / KEYWORD_continue BreakLabel?
12641263// / KEYWORD_resume Expr
12651264// / KEYWORD_return Expr?
1266// / LabeledExpr
1265// / BlockLabel? LoopExpr
1266// / Block
12671267// / CurlySuffixExpr
12681268static AstNode *ast_parse_primary_expr(ParseContext *pc) {
12691269 AstNode *asm_expr = ast_parse_asm_expr(pc);
......@@ -1325,32 +1325,7 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc) {
13251325 return res;
13261326 }
13271327
1328 AstNode *labeled_expr = ast_parse_labeled_expr(pc);
1329 if (labeled_expr != nullptr)
1330 return labeled_expr;
1331
1332 AstNode *curly_suffix = ast_parse_curly_suffix_expr(pc);
1333 if (curly_suffix != nullptr)
1334 return curly_suffix;
1335
1336 return nullptr;
1337}
1338
1339// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
1340static AstNode *ast_parse_if_expr(ParseContext *pc) {
1341 return ast_parse_if_expr_helper(pc, ast_parse_expr);
1342}
1343
1344// LabeledExpr <- BlockLabel? (Block / LoopExpr)
1345static AstNode *ast_parse_labeled_expr(ParseContext *pc) {
13461328 Token *label = ast_parse_block_label(pc);
1347 AstNode *block = ast_parse_block(pc);
1348 if (block != nullptr) {
1349 assert(block->type == NodeTypeBlock);
1350 block->data.block.name = token_buf(label);
1351 return block;
1352 }
1353
13541329 AstNode *loop = ast_parse_loop_expr(pc);
13551330 if (loop != nullptr) {
13561331 switch (loop->type) {
......@@ -1364,13 +1339,31 @@ static AstNode *ast_parse_labeled_expr(ParseContext *pc) {
13641339 zig_unreachable();
13651340 }
13661341 return loop;
1342 } else if (label != nullptr) {
1343 // Restore the tokens that we eaten by ast_parse_block_label.
1344 put_back_token(pc);
1345 put_back_token(pc);
13671346 }
13681347
1369 if (label != nullptr)
1370 ast_invalid_token_error(pc, peek_token(pc));
1348 AstNode *block = ast_parse_block(pc);
1349 if (block != nullptr) {
1350 assert(block->type == NodeTypeBlock);
1351 block->data.block.name = token_buf(label);
1352 return block;
1353 }
1354
1355 AstNode *curly_suffix = ast_parse_curly_suffix_expr(pc);
1356 if (curly_suffix != nullptr)
1357 return curly_suffix;
1358
13711359 return nullptr;
13721360}
13731361
1362// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
1363static AstNode *ast_parse_if_expr(ParseContext *pc) {
1364 return ast_parse_if_expr_helper(pc, ast_parse_expr);
1365}
1366
13741367// Block <- LBRACE Statement* RBRACE
13751368static AstNode *ast_parse_block(ParseContext *pc) {
13761369 Token *lbrace = eat_token_if(pc, TokenIdLBrace);