From ad0a294ae23252ce5e1494a93e4d8b160b6cd4df Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Mon, 15 Jun 2026 18:24:09 +0200 Subject: [PATCH] grammar: revert redundant changes Commit 785fb1be111186525bf288fa3460945404f676eb made many redundant changes to the grammar due to insufficient understanding of PEG semantics. This commit reverts the most obviously redundant of those changes. The unbounded lookahead through e.g. !ExprSuffix still needs to be reverted, but I want to do that in a future commit since that change can't be reasoned about locally. --- doc/langref/grammar.peg | 22 ++-- lib/std/zig/parser_generated_oracle.zig | 129 +++--------------------- 2 files changed, 24 insertions(+), 127 deletions(-) diff --git a/doc/langref/grammar.peg b/doc/langref/grammar.peg index bc9ebb40cfbac6134664ed1b5080f9cd4d005311..a778dc7e60bb75695df06efe73f9608c222baf35 100644 --- a/doc/langref/grammar.peg +++ b/doc/langref/grammar.peg @@ -20,19 +20,19 @@ VarDeclProto <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteA GlobalVarDecl <- VarDeclProto (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? (KEYWORD_comptime / !KEYWORD_comptime) !KEYWORD_fn (IDENTIFIER COLON / !(IDENTIFIER COLON))? TypeExpr ByteAlign? (EQUAL Expr)? +ContainerField <- doc_comment? KEYWORD_comptime? !KEYWORD_fn (IDENTIFIER COLON)? TypeExpr ByteAlign? (EQUAL Expr)? # *** Block Level *** BlockStatement <- Statement / KEYWORD_defer BlockExprStatement / KEYWORD_errdefer BlockExprStatement - / !ExprStatement (KEYWORD_comptime !BlockExpr)? VarAssignStatement + / (KEYWORD_comptime)? VarAssignStatement Statement <- ExprStatement / KEYWORD_suspend BlockExprStatement - / !ExprStatement (KEYWORD_comptime !BlockExpr)? AssignExpr SEMICOLON + / (KEYWORD_comptime)? AssignExpr SEMICOLON ExprStatement <- IfStatement @@ -42,7 +42,7 @@ ExprStatement IfStatement <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? - / IfPrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) + / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) LabeledStatement <- BlockLabel? (Block / LoopStatement / SwitchExpr) @@ -50,11 +50,11 @@ LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement <- ForPrefix BlockExpr ( KEYWORD_else Statement / !KEYWORD_else ) - / ForPrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Statement ) + / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? - / WhilePrefix !BlockExpr AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) + / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement <- BlockExpr @@ -93,10 +93,10 @@ PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr <- AsmExpr / IfExpr - / KEYWORD_break (BreakLabel / !BreakLabel) (Expr !ExprSuffix / !SinglePtrTypeStart) + / KEYWORD_break BreakLabel? (Expr !ExprSuffix / !SinglePtrTypeStart) / KEYWORD_comptime Expr !ExprSuffix / KEYWORD_nosuspend Expr !ExprSuffix - / KEYWORD_continue (BreakLabel / !BreakLabel) (Expr !ExprSuffix / !SinglePtrTypeStart) + / KEYWORD_continue BreakLabel? (Expr !ExprSuffix / !SinglePtrTypeStart) / KEYWORD_resume Expr !ExprSuffix / KEYWORD_return (Expr !ExprSuffix / !SinglePtrTypeStart) / BlockLabel? LoopExpr @@ -137,7 +137,7 @@ PrimaryTypeExpr / FnProto / GroupedExpr / LabeledTypeExpr - / IDENTIFIER !(COLON LabelableExpr) + / IDENTIFIER / IfTypeExpr / KEYWORD_comptime TypeExpr !ExprSuffix / KEYWORD_error DOT IDENTIFIER @@ -353,7 +353,7 @@ SinglePtrTypeStart <- ASTERISK ManyPtrTypeStart <- LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr !ASTERISK (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE @@ -362,7 +362,7 @@ ContainerDeclType <- KEYWORD_struct (LPAREN Expr RPAREN)? / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? - / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / !KEYWORD_enum Expr) RPAREN)? + / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment ByteAlign <- KEYWORD_align LPAREN Expr RPAREN diff --git a/lib/std/zig/parser_generated_oracle.zig b/lib/std/zig/parser_generated_oracle.zig index cb46b2ef6e8bc053c12a9bff5fffd871ac7a64e8..675d5231269c557ace96022f11abf26cda1884a0 100644 --- a/lib/std/zig/parser_generated_oracle.zig +++ b/lib/std/zig/parser_generated_oracle.zig @@ -169,19 +169,7 @@ const Parser = struct { pub fn parseContainerField(p: *Parser) bool { return blk_0: { const pos_0 = p.i; - if ((p.parsedoc_comment() or true) and blk_2: { - const pos_2 = p.i; - if (p.parseKEYWORD_comptime()) break :blk_2 true; - p.i = pos_2; - if (blk_3: { - const pos_3 = p.i; - const match_3 = p.parseKEYWORD_comptime(); - p.i = pos_3; - break :blk_3 !match_3; - }) break :blk_2 true; - p.i = pos_2; - break :blk_2 false; - } and blk_1: { + if ((p.parsedoc_comment() or true) and (p.parseKEYWORD_comptime() or true) and blk_1: { const pos_1 = p.i; const match_1 = p.parseKEYWORD_fn(); p.i = pos_1; @@ -190,18 +178,6 @@ const Parser = struct { const pos_3 = p.i; if (p.parseIDENTIFIER() and p.parseCOLON()) break :blk_3 true; p.i = pos_3; - if (blk_4: { - const pos_4 = p.i; - const match_4 = blk_6: { - const pos_6 = p.i; - if (p.parseIDENTIFIER() and p.parseCOLON()) break :blk_6 true; - p.i = pos_6; - break :blk_6 false; - }; - p.i = pos_4; - break :blk_4 !match_4; - }) break :blk_3 true; - p.i = pos_3; break :blk_3 false; } or true) and p.parseTypeExpr() and (p.parseByteAlign() or true) and (blk_3: { const pos_3 = p.i; @@ -222,19 +198,9 @@ const Parser = struct { p.i = pos_0; if (p.parseKEYWORD_errdefer() and p.parseBlockExprStatement()) break :blk_0 true; p.i = pos_0; - if (blk_1: { - const pos_1 = p.i; - const match_1 = p.parseExprStatement(); - p.i = pos_1; - break :blk_1 !match_1; - } and (blk_3: { + if ((blk_3: { const pos_3 = p.i; - if (p.parseKEYWORD_comptime() and blk_4: { - const pos_4 = p.i; - const match_4 = p.parseBlockExpr(); - p.i = pos_4; - break :blk_4 !match_4; - }) break :blk_3 true; + if (p.parseKEYWORD_comptime()) break :blk_3 true; p.i = pos_3; break :blk_3 false; } or true) and p.parseVarAssignStatement()) break :blk_0 true; @@ -249,19 +215,9 @@ const Parser = struct { p.i = pos_0; if (p.parseKEYWORD_suspend() and p.parseBlockExprStatement()) break :blk_0 true; p.i = pos_0; - if (blk_1: { - const pos_1 = p.i; - const match_1 = p.parseExprStatement(); - p.i = pos_1; - break :blk_1 !match_1; - } and (blk_3: { + if ((blk_3: { const pos_3 = p.i; - if (p.parseKEYWORD_comptime() and blk_4: { - const pos_4 = p.i; - const match_4 = p.parseBlockExpr(); - p.i = pos_4; - break :blk_4 !match_4; - }) break :blk_3 true; + if (p.parseKEYWORD_comptime()) break :blk_3 true; p.i = pos_3; break :blk_3 false; } or true) and p.parseAssignExpr() and p.parseSEMICOLON()) break :blk_0 true; @@ -293,12 +249,7 @@ const Parser = struct { break :blk_3 false; } or true)) break :blk_0 true; p.i = pos_0; - if (p.parseIfPrefix() and blk_1: { - const pos_1 = p.i; - const match_1 = p.parseBlockExpr(); - p.i = pos_1; - break :blk_1 !match_1; - } and p.parseAssignExpr() and blk_2: { + if (p.parseIfPrefix() and p.parseAssignExpr() and blk_2: { const pos_2 = p.i; if (p.parseSEMICOLON()) break :blk_2 true; p.i = pos_2; @@ -359,12 +310,7 @@ const Parser = struct { break :blk_2 false; }) break :blk_0 true; p.i = pos_0; - if (p.parseForPrefix() and blk_1: { - const pos_1 = p.i; - const match_1 = p.parseBlockExpr(); - p.i = pos_1; - break :blk_1 !match_1; - } and p.parseAssignExpr() and blk_2: { + if (p.parseForPrefix() and p.parseAssignExpr() and blk_2: { const pos_2 = p.i; if (p.parseSEMICOLON()) break :blk_2 true; p.i = pos_2; @@ -386,12 +332,7 @@ const Parser = struct { break :blk_3 false; } or true)) break :blk_0 true; p.i = pos_0; - if (p.parseWhilePrefix() and blk_1: { - const pos_1 = p.i; - const match_1 = p.parseBlockExpr(); - p.i = pos_1; - break :blk_1 !match_1; - } and p.parseAssignExpr() and blk_2: { + if (p.parseWhilePrefix() and p.parseAssignExpr() and blk_2: { const pos_2 = p.i; if (p.parseSEMICOLON()) break :blk_2 true; p.i = pos_2; @@ -630,19 +571,7 @@ const Parser = struct { p.i = pos_0; if (p.parseIfExpr()) break :blk_0 true; p.i = pos_0; - if (p.parseKEYWORD_break() and blk_2: { - const pos_2 = p.i; - if (p.parseBreakLabel()) break :blk_2 true; - p.i = pos_2; - if (blk_3: { - const pos_3 = p.i; - const match_3 = p.parseBreakLabel(); - p.i = pos_3; - break :blk_3 !match_3; - }) break :blk_2 true; - p.i = pos_2; - break :blk_2 false; - } and blk_2: { + if (p.parseKEYWORD_break() and (p.parseBreakLabel() or true) and blk_2: { const pos_2 = p.i; if (p.parseExpr() and blk_3: { const pos_3 = p.i; @@ -675,19 +604,7 @@ const Parser = struct { break :blk_1 !match_1; }) break :blk_0 true; p.i = pos_0; - if (p.parseKEYWORD_continue() and blk_2: { - const pos_2 = p.i; - if (p.parseBreakLabel()) break :blk_2 true; - p.i = pos_2; - if (blk_3: { - const pos_3 = p.i; - const match_3 = p.parseBreakLabel(); - p.i = pos_3; - break :blk_3 !match_3; - }) break :blk_2 true; - p.i = pos_2; - break :blk_2 false; - } and blk_2: { + if (p.parseKEYWORD_continue() and (p.parseBreakLabel() or true) and blk_2: { const pos_2 = p.i; if (p.parseExpr() and blk_3: { const pos_3 = p.i; @@ -927,17 +844,7 @@ const Parser = struct { p.i = pos_0; if (p.parseLabeledTypeExpr()) break :blk_0 true; p.i = pos_0; - if (p.parseIDENTIFIER() and blk_1: { - const pos_1 = p.i; - const match_1 = blk_3: { - const pos_3 = p.i; - if (p.parseCOLON() and p.parseLabelableExpr()) break :blk_3 true; - p.i = pos_3; - break :blk_3 false; - }; - p.i = pos_1; - break :blk_1 !match_1; - }) break :blk_0 true; + if (p.parseIDENTIFIER()) break :blk_0 true; p.i = pos_0; if (p.parseIfTypeExpr()) break :blk_0 true; p.i = pos_0; @@ -1813,12 +1720,7 @@ const Parser = struct { pub fn parseArrayTypeStart(p: *Parser) bool { return blk_0: { const pos_0 = p.i; - if (p.parseLBRACKET() and p.parseExpr() and blk_1: { - const pos_1 = p.i; - const match_1 = p.parseASTERISK(); - p.i = pos_1; - break :blk_1 !match_1; - } and (blk_3: { + if (p.parseLBRACKET() and p.parseExpr() and (blk_3: { const pos_3 = p.i; if (p.parseCOLON() and p.parseExpr()) break :blk_3 true; p.i = pos_3; @@ -1866,12 +1768,7 @@ const Parser = struct { break :blk_8 false; } or true)) break :blk_5 true; p.i = pos_5; - if (blk_6: { - const pos_6 = p.i; - const match_6 = p.parseKEYWORD_enum(); - p.i = pos_6; - break :blk_6 !match_6; - } and p.parseExpr()) break :blk_5 true; + if (p.parseExpr()) break :blk_5 true; p.i = pos_5; break :blk_5 false; } and p.parseRPAREN()) break :blk_3 true; -- 2.54.0