]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-118082: Improve `import` without names syntax error message (#118083)
authorNikita Sobolev <mail@sobolevn.me>
Tue, 23 Apr 2024 12:00:52 +0000 (15:00 +0300)
committerGitHub <noreply@github.com>
Tue, 23 Apr 2024 12:00:52 +0000 (13:00 +0100)
Grammar/python.gram
Lib/test/test_syntax.py
Misc/NEWS.d/next/Core and Builtins/2024-04-19-11-59-57.gh-issue-118082._FLuOT.rst [new file with mode: 0644]
Parser/parser.c

index 9564abf5ec314b75cb9d6f79da0ccf6b1c09a33b..11438e57da527bfb7daeae30ad81da8db949c106 100644 (file)
@@ -1299,10 +1299,14 @@ invalid_group:
 invalid_import:
     | a='import' ','.dotted_name+ 'from' dotted_name {
         RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") }
+    | 'import' token=NEWLINE { 
+        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }
 
 invalid_import_from_targets:
     | import_from_as_names ',' NEWLINE {
         RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") }
+    | token=NEWLINE { 
+        RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }
 
 invalid_compound_stmt:
     | a='elif' named_expression ':' { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "'elif' must match an if-statement here") }
index dfa2a3b2f5413b04b4529f7ba80e890924ef855c..e9bec3317811dd6a7649c860a66ee10daad6ce58 100644 (file)
@@ -1699,6 +1699,18 @@ SyntaxError: Did you mean to use 'from ... import ...' instead?
 Traceback (most recent call last):
 SyntaxError: invalid syntax
 
+>>> from i import
+Traceback (most recent call last):
+SyntaxError: Expected one or more names after 'import'
+
+>>> from .. import
+Traceback (most recent call last):
+SyntaxError: Expected one or more names after 'import'
+
+>>> import
+Traceback (most recent call last):
+SyntaxError: Expected one or more names after 'import'
+
 >>> (): int
 Traceback (most recent call last):
 SyntaxError: only single target (not tuple) can be annotated
diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-04-19-11-59-57.gh-issue-118082._FLuOT.rst b/Misc/NEWS.d/next/Core and Builtins/2024-04-19-11-59-57.gh-issue-118082._FLuOT.rst
new file mode 100644 (file)
index 0000000..7b9a726
--- /dev/null
@@ -0,0 +1,3 @@
+Improve :exc:`SyntaxError` message for imports without names, like in
+``from x import`` and ``import`` cases. It now points
+out to users that :keyword:`import` expects at least one name after it.
index 35d672b0d397f98f0f1bd1289d01a72a056c48c4..b6683bfd1f1bc0131aaeaf04af3e7bc0367481bd 100644 (file)
@@ -21,28 +21,28 @@ static KeywordToken *reserved_keywords[] = {
     (KeywordToken[]) {{NULL, -1}},
     (KeywordToken[]) {{NULL, -1}},
     (KeywordToken[]) {
-        {"if", 661},
-        {"as", 659},
-        {"in", 672},
+        {"if", 662},
+        {"as", 660},
+        {"in", 673},
         {"or", 581},
         {"is", 589},
         {NULL, -1},
     },
     (KeywordToken[]) {
         {"del", 616},
-        {"def", 674},
-        {"for", 671},
-        {"try", 643},
+        {"def", 675},
+        {"for", 672},
+        {"try", 644},
         {"and", 582},
-        {"not", 678},
+        {"not", 679},
         {NULL, -1},
     },
     (KeywordToken[]) {
         {"from", 621},
         {"pass", 504},
-        {"with", 634},
-        {"elif", 663},
-        {"else", 664},
+        {"with", 635},
+        {"elif", 664},
+        {"else", 665},
         {"None", 614},
         {"True", 613},
         {NULL, -1},
@@ -51,24 +51,24 @@ static KeywordToken *reserved_keywords[] = {
         {"raise", 525},
         {"yield", 580},
         {"break", 508},
-        {"async", 673},
-        {"class", 676},
-        {"while", 666},
+        {"async", 674},
+        {"class", 677},
+        {"while", 667},
         {"False", 615},
         {"await", 590},
         {NULL, -1},
     },
     (KeywordToken[]) {
         {"return", 522},
-        {"import", 620},
+        {"import", 622},
         {"assert", 529},
         {"global", 526},
-        {"except", 656},
+        {"except", 657},
         {"lambda", 612},
         {NULL, -1},
     },
     (KeywordToken[]) {
-        {"finally", 652},
+        {"finally", 653},
         {NULL, -1},
     },
     (KeywordToken[]) {
@@ -2135,7 +2135,7 @@ compound_stmt_rule(Parser *p)
         D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt"));
         stmt_ty if_stmt_var;
         if (
-            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 661)  // token='if'
+            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 662)  // token='if'
             &&
             (if_stmt_var = if_stmt_rule(p))  // if_stmt
         )
@@ -2219,7 +2219,7 @@ compound_stmt_rule(Parser *p)
         D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt"));
         stmt_ty try_stmt_var;
         if (
-            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 643)  // token='try'
+            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 644)  // token='try'
             &&
             (try_stmt_var = try_stmt_rule(p))  // try_stmt
         )
@@ -2240,7 +2240,7 @@ compound_stmt_rule(Parser *p)
         D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt"));
         stmt_ty while_stmt_var;
         if (
-            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 666)  // token='while'
+            _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 667)  // token='while'
             &&
             (while_stmt_var = while_stmt_rule(p))  // while_stmt
         )
@@ -3514,7 +3514,7 @@ import_name_rule(Parser *p)
         Token * _keyword;
         asdl_alias_seq* a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 620))  // token='import'
+            (_keyword = _PyPegen_expect_token(p, 622))  // token='import'
             &&
             (a = dotted_as_names_rule(p))  // dotted_as_names
         )
@@ -3589,7 +3589,7 @@ import_from_rule(Parser *p)
             &&
             (b = dotted_name_rule(p))  // dotted_name
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 620))  // token='import'
+            (_keyword_1 = _PyPegen_expect_token(p, 622))  // token='import'
             &&
             (c = import_from_targets_rule(p))  // import_from_targets
         )
@@ -3631,7 +3631,7 @@ import_from_rule(Parser *p)
             &&
             (a = _loop1_25_rule(p))  // (('.' | '...'))+
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 620))  // token='import'
+            (_keyword_1 = _PyPegen_expect_token(p, 622))  // token='import'
             &&
             (b = import_from_targets_rule(p))  // import_from_targets
         )
@@ -4380,7 +4380,7 @@ class_def_raw_rule(Parser *p)
         asdl_stmt_seq* c;
         void *t;
         if (
-            (_keyword = _PyPegen_expect_token(p, 676))  // token='class'
+            (_keyword = _PyPegen_expect_token(p, 677))  // token='class'
             &&
             (a = _PyPegen_name_token(p))  // NAME
             &&
@@ -4547,7 +4547,7 @@ function_def_raw_rule(Parser *p)
         void *t;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 674))  // token='def'
+            (_keyword = _PyPegen_expect_token(p, 675))  // token='def'
             &&
             (n = _PyPegen_name_token(p))  // NAME
             &&
@@ -4608,9 +4608,9 @@ function_def_raw_rule(Parser *p)
         void *t;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 674))  // token='def'
+            (_keyword_1 = _PyPegen_expect_token(p, 675))  // token='def'
             &&
             (n = _PyPegen_name_token(p))  // NAME
             &&
@@ -5948,7 +5948,7 @@ if_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         stmt_ty c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (a = named_expression_rule(p))  // named_expression
             &&
@@ -5993,7 +5993,7 @@ if_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (a = named_expression_rule(p))  // named_expression
             &&
@@ -6088,7 +6088,7 @@ elif_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         stmt_ty c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 663))  // token='elif'
+            (_keyword = _PyPegen_expect_token(p, 664))  // token='elif'
             &&
             (a = named_expression_rule(p))  // named_expression
             &&
@@ -6133,7 +6133,7 @@ elif_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 663))  // token='elif'
+            (_keyword = _PyPegen_expect_token(p, 664))  // token='elif'
             &&
             (a = named_expression_rule(p))  // named_expression
             &&
@@ -6214,7 +6214,7 @@ else_block_rule(Parser *p)
         Token * _literal;
         asdl_stmt_seq* b;
         if (
-            (_keyword = _PyPegen_expect_token(p, 664))  // token='else'
+            (_keyword = _PyPegen_expect_token(p, 665))  // token='else'
             &&
             (_literal = _PyPegen_expect_forced_token(p, 11, ":"))  // forced_token=':'
             &&
@@ -6293,7 +6293,7 @@ while_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 666))  // token='while'
+            (_keyword = _PyPegen_expect_token(p, 667))  // token='while'
             &&
             (a = named_expression_rule(p))  // named_expression
             &&
@@ -6393,11 +6393,11 @@ for_stmt_rule(Parser *p)
         expr_ty t;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (t = star_targets_rule(p))  // star_targets
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_1 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (_cut_var = 1)
             &&
@@ -6455,13 +6455,13 @@ for_stmt_rule(Parser *p)
         expr_ty t;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (t = star_targets_rule(p))  // star_targets
             &&
-            (_keyword_2 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_2 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (_cut_var = 1)
             &&
@@ -6590,7 +6590,7 @@ with_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_literal = _PyPegen_expect_token(p, 7))  // token='('
             &&
@@ -6641,7 +6641,7 @@ with_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (a = (asdl_withitem_seq*)_gather_53_rule(p))  // ','.with_item+
             &&
@@ -6690,9 +6690,9 @@ with_stmt_rule(Parser *p)
         asdl_withitem_seq* a;
         asdl_stmt_seq* b;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword_1 = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_literal = _PyPegen_expect_token(p, 7))  // token='('
             &&
@@ -6742,9 +6742,9 @@ with_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         void *tc;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword_1 = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (a = (asdl_withitem_seq*)_gather_57_rule(p))  // ','.with_item+
             &&
@@ -6830,7 +6830,7 @@ with_item_rule(Parser *p)
         if (
             (e = expression_rule(p))  // expression
             &&
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (t = star_target_rule(p))  // star_target
             &&
@@ -6955,7 +6955,7 @@ try_stmt_rule(Parser *p)
         asdl_stmt_seq* b;
         asdl_stmt_seq* f;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_forced_token(p, 11, ":"))  // forced_token=':'
             &&
@@ -6999,7 +6999,7 @@ try_stmt_rule(Parser *p)
         asdl_excepthandler_seq* ex;
         void *f;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_forced_token(p, 11, ":"))  // forced_token=':'
             &&
@@ -7047,7 +7047,7 @@ try_stmt_rule(Parser *p)
         asdl_excepthandler_seq* ex;
         void *f;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_forced_token(p, 11, ":"))  // forced_token=':'
             &&
@@ -7145,7 +7145,7 @@ except_block_rule(Parser *p)
         expr_ty e;
         void *t;
         if (
-            (_keyword = _PyPegen_expect_token(p, 656))  // token='except'
+            (_keyword = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (e = expression_rule(p))  // expression
             &&
@@ -7188,7 +7188,7 @@ except_block_rule(Parser *p)
         Token * _literal;
         asdl_stmt_seq* b;
         if (
-            (_keyword = _PyPegen_expect_token(p, 656))  // token='except'
+            (_keyword = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -7299,7 +7299,7 @@ except_star_block_rule(Parser *p)
         expr_ty e;
         void *t;
         if (
-            (_keyword = _PyPegen_expect_token(p, 656))  // token='except'
+            (_keyword = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_literal = _PyPegen_expect_token(p, 16))  // token='*'
             &&
@@ -7401,7 +7401,7 @@ finally_block_rule(Parser *p)
         Token * _literal;
         asdl_stmt_seq* a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 652))  // token='finally'
+            (_keyword = _PyPegen_expect_token(p, 653))  // token='finally'
             &&
             (_literal = _PyPegen_expect_forced_token(p, 11, ":"))  // forced_token=':'
             &&
@@ -7709,7 +7709,7 @@ guard_rule(Parser *p)
         Token * _keyword;
         expr_ty guard;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (guard = named_expression_rule(p))  // named_expression
         )
@@ -7904,7 +7904,7 @@ as_pattern_rule(Parser *p)
         if (
             (pattern = or_pattern_rule(p))  // or_pattern
             &&
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (target = pattern_capture_target_rule(p))  // pattern_capture_target
         )
@@ -11127,11 +11127,11 @@ expression_rule(Parser *p)
         if (
             (a = disjunction_rule(p))  // disjunction
             &&
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (b = disjunction_rule(p))  // disjunction
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 664))  // token='else'
+            (_keyword_1 = _PyPegen_expect_token(p, 665))  // token='else'
             &&
             (c = expression_rule(p))  // expression
         )
@@ -12013,7 +12013,7 @@ inversion_rule(Parser *p)
         Token * _keyword;
         expr_ty a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 678))  // token='not'
+            (_keyword = _PyPegen_expect_token(p, 679))  // token='not'
             &&
             (a = inversion_rule(p))  // inversion
         )
@@ -12667,9 +12667,9 @@ notin_bitwise_or_rule(Parser *p)
         Token * _keyword_1;
         expr_ty a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 678))  // token='not'
+            (_keyword = _PyPegen_expect_token(p, 679))  // token='not'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_1 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (a = bitwise_or_rule(p))  // bitwise_or
         )
@@ -12715,7 +12715,7 @@ in_bitwise_or_rule(Parser *p)
         Token * _keyword;
         expr_ty a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (a = bitwise_or_rule(p))  // bitwise_or
         )
@@ -12764,7 +12764,7 @@ isnot_bitwise_or_rule(Parser *p)
         if (
             (_keyword = _PyPegen_expect_token(p, 589))  // token='is'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 678))  // token='not'
+            (_keyword_1 = _PyPegen_expect_token(p, 679))  // token='not'
             &&
             (a = bitwise_or_rule(p))  // bitwise_or
         )
@@ -16935,13 +16935,13 @@ for_if_clause_rule(Parser *p)
         expr_ty b;
         asdl_expr_seq* c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (a = star_targets_rule(p))  // star_targets
             &&
-            (_keyword_2 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_2 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (_cut_var = 1)
             &&
@@ -16980,11 +16980,11 @@ for_if_clause_rule(Parser *p)
         expr_ty b;
         asdl_expr_seq* c;
         if (
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (a = star_targets_rule(p))  // star_targets
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_1 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (_cut_var = 1)
             &&
@@ -17021,13 +17021,13 @@ for_if_clause_rule(Parser *p)
         UNUSED(_opt_var); // Silence compiler warnings
         void *_tmp_122_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (_tmp_122_var = _tmp_122_rule(p))  // bitwise_or ((',' bitwise_or))* ','?
             &&
-            _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 672)  // token='in'
+            _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 673)  // token='in'
         )
         {
             D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'? 'for' (bitwise_or ((',' bitwise_or))* ','?) !'in'"));
@@ -20301,11 +20301,11 @@ expression_without_invalid_rule(Parser *p)
         if (
             (a = disjunction_rule(p))  // disjunction
             &&
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (b = disjunction_rule(p))  // disjunction
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 664))  // token='else'
+            (_keyword_1 = _PyPegen_expect_token(p, 665))  // token='else'
             &&
             (c = expression_rule(p))  // expression
         )
@@ -20486,7 +20486,7 @@ invalid_expression_rule(Parser *p)
         if (
             (a = disjunction_rule(p))  // disjunction
             &&
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (b = disjunction_rule(p))  // disjunction
             &&
@@ -22424,7 +22424,7 @@ invalid_with_item_rule(Parser *p)
         if (
             (expression_var = expression_rule(p))  // expression
             &&
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (a = expression_rule(p))  // expression
             &&
@@ -22474,9 +22474,9 @@ invalid_for_target_rule(Parser *p)
         UNUSED(_opt_var); // Silence compiler warnings
         expr_ty a;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (a = star_expressions_rule(p))  // star_expressions
         )
@@ -22582,7 +22582,7 @@ invalid_group_rule(Parser *p)
     return _res;
 }
 
-// invalid_import: 'import' ','.dotted_name+ 'from' dotted_name
+// invalid_import: 'import' ','.dotted_name+ 'from' dotted_name | 'import' NEWLINE
 static void *
 invalid_import_rule(Parser *p)
 {
@@ -22606,7 +22606,7 @@ invalid_import_rule(Parser *p)
         Token * a;
         expr_ty dotted_name_var;
         if (
-            (a = _PyPegen_expect_token(p, 620))  // token='import'
+            (a = _PyPegen_expect_token(p, 622))  // token='import'
             &&
             (_gather_206_var = _gather_206_rule(p))  // ','.dotted_name+
             &&
@@ -22628,13 +22628,40 @@ invalid_import_rule(Parser *p)
         D(fprintf(stderr, "%*c%s invalid_import[%d-%d]: %s failed!\n", p->level, ' ',
                   p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import' ','.dotted_name+ 'from' dotted_name"));
     }
+    { // 'import' NEWLINE
+        if (p->error_indicator) {
+            p->level--;
+            return NULL;
+        }
+        D(fprintf(stderr, "%*c> invalid_import[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' NEWLINE"));
+        Token * _keyword;
+        Token * token;
+        if (
+            (_keyword = _PyPegen_expect_token(p, 622))  // token='import'
+            &&
+            (token = _PyPegen_expect_token(p, NEWLINE))  // token='NEWLINE'
+        )
+        {
+            D(fprintf(stderr, "%*c+ invalid_import[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import' NEWLINE"));
+            _res = RAISE_SYNTAX_ERROR_STARTING_FROM ( token , "Expected one or more names after 'import'" );
+            if (_res == NULL && PyErr_Occurred()) {
+                p->error_indicator = 1;
+                p->level--;
+                return NULL;
+            }
+            goto done;
+        }
+        p->mark = _mark;
+        D(fprintf(stderr, "%*c%s invalid_import[%d-%d]: %s failed!\n", p->level, ' ',
+                  p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import' NEWLINE"));
+    }
     _res = NULL;
   done:
     p->level--;
     return _res;
 }
 
-// invalid_import_from_targets: import_from_as_names ',' NEWLINE
+// invalid_import_from_targets: import_from_as_names ',' NEWLINE | NEWLINE
 static void *
 invalid_import_from_targets_rule(Parser *p)
 {
@@ -22677,6 +22704,30 @@ invalid_import_from_targets_rule(Parser *p)
         D(fprintf(stderr, "%*c%s invalid_import_from_targets[%d-%d]: %s failed!\n", p->level, ' ',
                   p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_names ',' NEWLINE"));
     }
+    { // NEWLINE
+        if (p->error_indicator) {
+            p->level--;
+            return NULL;
+        }
+        D(fprintf(stderr, "%*c> invalid_import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE"));
+        Token * token;
+        if (
+            (token = _PyPegen_expect_token(p, NEWLINE))  // token='NEWLINE'
+        )
+        {
+            D(fprintf(stderr, "%*c+ invalid_import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE"));
+            _res = RAISE_SYNTAX_ERROR_STARTING_FROM ( token , "Expected one or more names after 'import'" );
+            if (_res == NULL && PyErr_Occurred()) {
+                p->error_indicator = 1;
+                p->level--;
+                return NULL;
+            }
+            goto done;
+        }
+        p->mark = _mark;
+        D(fprintf(stderr, "%*c%s invalid_import_from_targets[%d-%d]: %s failed!\n", p->level, ' ',
+                  p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE"));
+    }
     _res = NULL;
   done:
     p->level--;
@@ -22706,7 +22757,7 @@ invalid_compound_stmt_rule(Parser *p)
         Token * a;
         expr_ty named_expression_var;
         if (
-            (a = _PyPegen_expect_token(p, 663))  // token='elif'
+            (a = _PyPegen_expect_token(p, 664))  // token='elif'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -22735,7 +22786,7 @@ invalid_compound_stmt_rule(Parser *p)
         Token * _literal;
         Token * a;
         if (
-            (a = _PyPegen_expect_token(p, 664))  // token='else'
+            (a = _PyPegen_expect_token(p, 665))  // token='else'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
         )
@@ -22786,9 +22837,9 @@ invalid_with_stmt_rule(Parser *p)
         UNUSED(_opt_var); // Silence compiler warnings
         Token * newline_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (_keyword = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_gather_208_var = _gather_208_rule(p))  // ','.(expression ['as' star_target])+
             &&
@@ -22824,9 +22875,9 @@ invalid_with_stmt_rule(Parser *p)
         UNUSED(_opt_var_1); // Silence compiler warnings
         Token * newline_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (_keyword = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_literal = _PyPegen_expect_token(p, 7))  // token='('
             &&
@@ -22886,9 +22937,9 @@ invalid_with_stmt_indent_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (a = _PyPegen_expect_token(p, 634))  // token='with'
+            (a = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_gather_212_var = _gather_212_rule(p))  // ','.(expression ['as' star_target])+
             &&
@@ -22929,9 +22980,9 @@ invalid_with_stmt_indent_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (a = _PyPegen_expect_token(p, 634))  // token='with'
+            (a = _PyPegen_expect_token(p, 635))  // token='with'
             &&
             (_literal = _PyPegen_expect_token(p, 7))  // token='('
             &&
@@ -22994,7 +23045,7 @@ invalid_try_stmt_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 643))  // token='try'
+            (a = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23026,7 +23077,7 @@ invalid_try_stmt_rule(Parser *p)
         Token * _literal;
         asdl_stmt_seq* block_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23065,7 +23116,7 @@ invalid_try_stmt_rule(Parser *p)
         Token * b;
         expr_ty expression_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23073,7 +23124,7 @@ invalid_try_stmt_rule(Parser *p)
             &&
             (_loop1_218_var = _loop1_218_rule(p))  // except_block+
             &&
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (b = _PyPegen_expect_token(p, 16))  // token='*'
             &&
@@ -23112,7 +23163,7 @@ invalid_try_stmt_rule(Parser *p)
         UNUSED(_opt_var); // Silence compiler warnings
         Token * a;
         if (
-            (_keyword = _PyPegen_expect_token(p, 643))  // token='try'
+            (_keyword = _PyPegen_expect_token(p, 644))  // token='try'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23120,7 +23171,7 @@ invalid_try_stmt_rule(Parser *p)
             &&
             (_loop1_221_var = _loop1_221_rule(p))  // except_star_block+
             &&
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_opt_var = _tmp_222_rule(p), !p->error_indicator)  // [expression ['as' NAME]]
             &&
@@ -23179,7 +23230,7 @@ invalid_except_stmt_rule(Parser *p)
         expr_ty a;
         expr_ty expressions_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 656))  // token='except'
+            (_keyword = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator)  // '*'?
             &&
@@ -23221,7 +23272,7 @@ invalid_except_stmt_rule(Parser *p)
         expr_ty expression_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator)  // '*'?
             &&
@@ -23254,7 +23305,7 @@ invalid_except_stmt_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (newline_var = _PyPegen_expect_token(p, NEWLINE))  // token='NEWLINE'
         )
@@ -23282,7 +23333,7 @@ invalid_except_stmt_rule(Parser *p)
         void *_tmp_225_var;
         Token * a;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_literal = _PyPegen_expect_token(p, 16))  // token='*'
             &&
@@ -23331,7 +23382,7 @@ invalid_finally_stmt_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 652))  // token='finally'
+            (a = _PyPegen_expect_token(p, 653))  // token='finally'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23387,7 +23438,7 @@ invalid_except_stmt_indent_rule(Parser *p)
         expr_ty expression_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (expression_var = expression_rule(p))  // expression
             &&
@@ -23423,7 +23474,7 @@ invalid_except_stmt_indent_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -23479,7 +23530,7 @@ invalid_except_star_stmt_indent_rule(Parser *p)
         expr_ty expression_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 656))  // token='except'
+            (a = _PyPegen_expect_token(p, 657))  // token='except'
             &&
             (_literal = _PyPegen_expect_token(p, 16))  // token='*'
             &&
@@ -23718,7 +23769,7 @@ invalid_as_pattern_rule(Parser *p)
         if (
             (or_pattern_var = or_pattern_rule(p))  // or_pattern
             &&
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (a = _PyPegen_expect_soft_keyword(p, "_"))  // soft_keyword='"_"'
         )
@@ -23748,7 +23799,7 @@ invalid_as_pattern_rule(Parser *p)
         if (
             (or_pattern_var = or_pattern_rule(p))  // or_pattern
             &&
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             _PyPegen_lookahead_with_name(0, _PyPegen_name_token, p)
             &&
@@ -23902,7 +23953,7 @@ invalid_if_stmt_rule(Parser *p)
         expr_ty named_expression_var;
         Token * newline_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -23933,7 +23984,7 @@ invalid_if_stmt_rule(Parser *p)
         expr_ty a_1;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 661))  // token='if'
+            (a = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (a_1 = named_expression_rule(p))  // named_expression
             &&
@@ -23988,7 +24039,7 @@ invalid_elif_stmt_rule(Parser *p)
         expr_ty named_expression_var;
         Token * newline_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 663))  // token='elif'
+            (_keyword = _PyPegen_expect_token(p, 664))  // token='elif'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -24019,7 +24070,7 @@ invalid_elif_stmt_rule(Parser *p)
         expr_ty named_expression_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 663))  // token='elif'
+            (a = _PyPegen_expect_token(p, 664))  // token='elif'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -24072,7 +24123,7 @@ invalid_else_stmt_rule(Parser *p)
         Token * a;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 664))  // token='else'
+            (a = _PyPegen_expect_token(p, 665))  // token='else'
             &&
             (_literal = _PyPegen_expect_token(p, 11))  // token=':'
             &&
@@ -24125,7 +24176,7 @@ invalid_while_stmt_rule(Parser *p)
         expr_ty named_expression_var;
         Token * newline_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 666))  // token='while'
+            (_keyword = _PyPegen_expect_token(p, 667))  // token='while'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -24156,7 +24207,7 @@ invalid_while_stmt_rule(Parser *p)
         expr_ty named_expression_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 666))  // token='while'
+            (a = _PyPegen_expect_token(p, 667))  // token='while'
             &&
             (named_expression_var = named_expression_rule(p))  // named_expression
             &&
@@ -24215,13 +24266,13 @@ invalid_for_stmt_rule(Parser *p)
         expr_ty star_expressions_var;
         expr_ty star_targets_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (star_targets_var = star_targets_rule(p))  // star_targets
             &&
-            (_keyword_1 = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword_1 = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (star_expressions_var = star_expressions_rule(p))  // star_expressions
             &&
@@ -24256,13 +24307,13 @@ invalid_for_stmt_rule(Parser *p)
         expr_ty star_expressions_var;
         expr_ty star_targets_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (a = _PyPegen_expect_token(p, 671))  // token='for'
+            (a = _PyPegen_expect_token(p, 672))  // token='for'
             &&
             (star_targets_var = star_targets_rule(p))  // star_targets
             &&
-            (_keyword = _PyPegen_expect_token(p, 672))  // token='in'
+            (_keyword = _PyPegen_expect_token(p, 673))  // token='in'
             &&
             (star_expressions_var = star_expressions_rule(p))  // star_expressions
             &&
@@ -24327,9 +24378,9 @@ invalid_def_raw_rule(Parser *p)
         expr_ty name_var;
         Token * newline_var;
         if (
-            (_opt_var = _PyPegen_expect_token(p, 673), !p->error_indicator)  // 'async'?
+            (_opt_var = _PyPegen_expect_token(p, 674), !p->error_indicator)  // 'async'?
             &&
-            (a = _PyPegen_expect_token(p, 674))  // token='def'
+            (a = _PyPegen_expect_token(p, 675))  // token='def'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
             &&
@@ -24398,7 +24449,7 @@ invalid_class_def_raw_rule(Parser *p)
         expr_ty name_var;
         Token * newline_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 676))  // token='class'
+            (_keyword = _PyPegen_expect_token(p, 677))  // token='class'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
             &&
@@ -24437,7 +24488,7 @@ invalid_class_def_raw_rule(Parser *p)
         expr_ty name_var;
         Token * newline_var;
         if (
-            (a = _PyPegen_expect_token(p, 676))  // token='class'
+            (a = _PyPegen_expect_token(p, 677))  // token='class'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
             &&
@@ -25212,7 +25263,7 @@ invalid_arithmetic_rule(Parser *p)
             &&
             (_tmp_251_var = _tmp_251_rule(p))  // '+' | '-' | '*' | '/' | '%' | '//' | '@'
             &&
-            (a = _PyPegen_expect_token(p, 678))  // token='not'
+            (a = _PyPegen_expect_token(p, 679))  // token='not'
             &&
             (b = inversion_rule(p))  // inversion
         )
@@ -25261,7 +25312,7 @@ invalid_factor_rule(Parser *p)
         if (
             (_tmp_252_var = _tmp_252_rule(p))  // '+' | '-' | '~'
             &&
-            (a = _PyPegen_expect_token(p, 678))  // token='not'
+            (a = _PyPegen_expect_token(p, 679))  // token='not'
             &&
             (b = factor_rule(p))  // factor
         )
@@ -25629,7 +25680,7 @@ _tmp_6_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 620))  // token='import'
+            (_keyword = _PyPegen_expect_token(p, 622))  // token='import'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'"));
@@ -25686,7 +25737,7 @@ _tmp_7_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 674))  // token='def'
+            (_keyword = _PyPegen_expect_token(p, 675))  // token='def'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'"));
@@ -25724,7 +25775,7 @@ _tmp_7_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'"));
@@ -25762,7 +25813,7 @@ _tmp_8_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 676))  // token='class'
+            (_keyword = _PyPegen_expect_token(p, 677))  // token='class'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'"));
@@ -25819,7 +25870,7 @@ _tmp_9_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 634))  // token='with'
+            (_keyword = _PyPegen_expect_token(p, 635))  // token='with'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'"));
@@ -25838,7 +25889,7 @@ _tmp_9_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'"));
@@ -25876,7 +25927,7 @@ _tmp_10_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 671))  // token='for'
+            (_keyword = _PyPegen_expect_token(p, 672))  // token='for'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'"));
@@ -25895,7 +25946,7 @@ _tmp_10_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'async'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 673))  // token='async'
+            (_keyword = _PyPegen_expect_token(p, 674))  // token='async'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'async'"));
@@ -26919,7 +26970,7 @@ _tmp_28_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (z = _PyPegen_name_token(p))  // NAME
         )
@@ -27082,7 +27133,7 @@ _tmp_31_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (z = _PyPegen_name_token(p))  // NAME
         )
@@ -29069,7 +29120,7 @@ _tmp_62_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (z = _PyPegen_name_token(p))  // NAME
         )
@@ -29115,7 +29166,7 @@ _tmp_63_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (z = _PyPegen_name_token(p))  // NAME
         )
@@ -35059,7 +35110,7 @@ _tmp_160_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 664))  // token='else'
+            (_keyword = _PyPegen_expect_token(p, 665))  // token='else'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'"));
@@ -38652,7 +38703,7 @@ _tmp_216_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 656))  // token='except'
+            (_keyword = _PyPegen_expect_token(p, 657))  // token='except'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'"));
@@ -38671,7 +38722,7 @@ _tmp_216_rule(Parser *p)
         D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'"));
         Token * _keyword;
         if (
-            (_keyword = _PyPegen_expect_token(p, 652))  // token='finally'
+            (_keyword = _PyPegen_expect_token(p, 653))  // token='finally'
         )
         {
             D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'"));
@@ -38849,7 +38900,7 @@ _tmp_219_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -39071,7 +39122,7 @@ _tmp_223_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -39112,7 +39163,7 @@ _tmp_224_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -39210,7 +39261,7 @@ _tmp_226_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -39251,7 +39302,7 @@ _tmp_227_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -41304,7 +41355,7 @@ _tmp_263_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (z = disjunction_rule(p))  // disjunction
         )
@@ -41350,7 +41401,7 @@ _tmp_264_rule(Parser *p)
         Token * _keyword;
         expr_ty z;
         if (
-            (_keyword = _PyPegen_expect_token(p, 661))  // token='if'
+            (_keyword = _PyPegen_expect_token(p, 662))  // token='if'
             &&
             (z = disjunction_rule(p))  // disjunction
         )
@@ -42063,7 +42114,7 @@ _tmp_279_rule(Parser *p)
         Token * _keyword;
         expr_ty name_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (name_var = _PyPegen_name_token(p))  // NAME
         )
@@ -42322,7 +42373,7 @@ _tmp_284_rule(Parser *p)
         Token * _keyword;
         expr_ty star_target_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (star_target_var = star_target_rule(p))  // star_target
         )
@@ -42363,7 +42414,7 @@ _tmp_285_rule(Parser *p)
         Token * _keyword;
         expr_ty star_target_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (star_target_var = star_target_rule(p))  // star_target
         )
@@ -42404,7 +42455,7 @@ _tmp_286_rule(Parser *p)
         Token * _keyword;
         expr_ty star_target_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (star_target_var = star_target_rule(p))  // star_target
         )
@@ -42445,7 +42496,7 @@ _tmp_287_rule(Parser *p)
         Token * _keyword;
         expr_ty star_target_var;
         if (
-            (_keyword = _PyPegen_expect_token(p, 659))  // token='as'
+            (_keyword = _PyPegen_expect_token(p, 660))  // token='as'
             &&
             (star_target_var = star_target_rule(p))  // star_target
         )