From e5230c5e8aa95c03e62554ba31bd2f2c7ff86ed9 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Sat, 4 Jul 2026 11:38:55 +0200 Subject: [PATCH] grammar: fix nosuspend statement backtracking This is a case in which the grammar is currently not LL(k) and needs a negative lookahead to prevent backtracking. The new grammar is consistent with the Parse.zig implementation. See the new test case for an example. --- doc/langref/grammar.peg | 2 +- lib/std/zig/parser_generated_oracle.zig | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/langref/grammar.peg b/doc/langref/grammar.peg index bb602287eb8bef8498d55b6334680e233c68af75..efbe0ca0013fdcc348c0fb7ef1b74d8301a6b33a 100644 --- a/doc/langref/grammar.peg +++ b/doc/langref/grammar.peg @@ -77,7 +77,7 @@ BlockStatement <- Statement / KEYWORD_defer BlockExprStatement / KEYWORD_errdefer BlockExprStatement - / (KEYWORD_comptime !BlockExprPrefix)? VarAssignStatement + / !KEYWORD_nosuspend (KEYWORD_comptime !BlockExprPrefix)? VarAssignStatement Statement <- IfStatement diff --git a/lib/std/zig/parser_generated_oracle.zig b/lib/std/zig/parser_generated_oracle.zig index 41a86a9ee2e3cd8698bba712e3846ce492a2d38f..78a24973c9c3de5e4ae5ce577a2ca6db558bfddb 100644 --- a/lib/std/zig/parser_generated_oracle.zig +++ b/lib/std/zig/parser_generated_oracle.zig @@ -267,7 +267,12 @@ const Parser = struct { p.i = pos_0; if (try p.parseKEYWORD_errdefer() and try p.parseBlockExprStatement()) break :blk_0 true; p.i = pos_0; - if ((blk_3: { + if (blk_1: { + const pos_1 = p.i; + const match_1 = try p.parseKEYWORD_nosuspend(); + p.i = pos_1; + break :blk_1 !match_1; + } and (blk_3: { const pos_3 = p.i; if (try p.parseKEYWORD_comptime() and blk_4: { const pos_4 = p.i; -- 2.54.0