Commit e508b85746

Jimmi Holst Christensen <jhc@liab.dk>
2019-03-19 10:36:37
Updated parser to newest grammar
1 parent 567175f
Changed files (1)
src/parser.cpp
@@ -61,7 +61,6 @@ static AstNode *ast_parse_multiply_expr(ParseContext *pc);
 static AstNode *ast_parse_prefix_expr(ParseContext *pc);
 static AstNode *ast_parse_primary_expr(ParseContext *pc);
 static AstNode *ast_parse_if_expr(ParseContext *pc);
-static AstNode *ast_parse_labeled_expr(ParseContext *pc);
 static AstNode *ast_parse_block(ParseContext *pc);
 static AstNode *ast_parse_loop_expr(ParseContext *pc);
 static AstNode *ast_parse_for_expr(ParseContext *pc);
@@ -1263,7 +1262,8 @@ static AstNode *ast_parse_prefix_expr(ParseContext *pc) {
 //      / KEYWORD_continue BreakLabel?
 //      / KEYWORD_resume Expr
 //      / KEYWORD_return Expr?
-//      / LabeledExpr
+//      / BlockLabel? LoopExpr
+//      / Block
 //      / CurlySuffixExpr
 static AstNode *ast_parse_primary_expr(ParseContext *pc) {
     AstNode *asm_expr = ast_parse_asm_expr(pc);
@@ -1325,32 +1325,7 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc) {
         return res;
     }
 
-    AstNode *labeled_expr = ast_parse_labeled_expr(pc);
-    if (labeled_expr != nullptr)
-        return labeled_expr;
-
-    AstNode *curly_suffix = ast_parse_curly_suffix_expr(pc);
-    if (curly_suffix != nullptr)
-        return curly_suffix;
-
-    return nullptr;
-}
-
-// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
-static AstNode *ast_parse_if_expr(ParseContext *pc) {
-    return ast_parse_if_expr_helper(pc, ast_parse_expr);
-}
-
-// LabeledExpr <- BlockLabel? (Block / LoopExpr)
-static AstNode *ast_parse_labeled_expr(ParseContext *pc) {
     Token *label = ast_parse_block_label(pc);
-    AstNode *block = ast_parse_block(pc);
-    if (block != nullptr) {
-        assert(block->type == NodeTypeBlock);
-        block->data.block.name = token_buf(label);
-        return block;
-    }
-
     AstNode *loop = ast_parse_loop_expr(pc);
     if (loop != nullptr) {
         switch (loop->type) {
@@ -1364,13 +1339,31 @@ static AstNode *ast_parse_labeled_expr(ParseContext *pc) {
                 zig_unreachable();
         }
         return loop;
+    } else if (label != nullptr) {
+        // Restore the tokens that we eaten by ast_parse_block_label.
+        put_back_token(pc);
+        put_back_token(pc);
     }
 
-    if (label != nullptr)
-        ast_invalid_token_error(pc, peek_token(pc));
+    AstNode *block = ast_parse_block(pc);
+    if (block != nullptr) {
+        assert(block->type == NodeTypeBlock);
+        block->data.block.name = token_buf(label);
+        return block;
+    }
+
+    AstNode *curly_suffix = ast_parse_curly_suffix_expr(pc);
+    if (curly_suffix != nullptr)
+        return curly_suffix;
+
     return nullptr;
 }
 
+// IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
+static AstNode *ast_parse_if_expr(ParseContext *pc) {
+    return ast_parse_if_expr_helper(pc, ast_parse_expr);
+}
+
 // Block <- LBRACE Statement* RBRACE
 static AstNode *ast_parse_block(ParseContext *pc) {
     Token *lbrace = eat_token_if(pc, TokenIdLBrace);