From 1ef61cf71a218c71860ff6aecf0fd51edb8b65dc Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 17:18:16 +0100 Subject: [PATCH 01/24] gh-102856: Initial implementation of PEP 701 (#102855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Lysandros Nikolaou Co-authored-by: Batuhan Taskaya Co-authored-by: Marta Gómez Macías Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> --- Doc/library/token-list.inc | 10 + Grammar/Tokens | 4 + Grammar/python.gram | 54 +- Include/internal/pycore_token.h | 22 +- Lib/test/test_ast.py | 5 - Lib/test/test_cmd_line_script.py | 6 +- Lib/test/test_eof.py | 4 +- Lib/test/test_exceptions.py | 3 +- Lib/test/test_fstring.py | 311 +- Lib/test/test_tokenize.py | 28 +- Lib/test/test_type_comments.py | 2 +- Lib/token.py | 27 +- ...-04-17-16-00-32.gh-issue-102856.UunJ7y.rst | 1 + Parser/action_helpers.c | 539 +- Parser/parser.c | 7846 +++++++++++------ Parser/pegen.c | 2 +- Parser/pegen.h | 18 +- Parser/pegen_errors.c | 16 +- Parser/string_parser.c | 1089 +-- Parser/string_parser.h | 39 +- Parser/token.c | 5 + Parser/tokenizer.c | 489 +- Parser/tokenizer.h | 29 + Programs/test_frozenmain.h | 8 +- Python/Python-tokenize.c | 4 +- Tools/build/generate_token.py | 2 + Tools/peg_generator/pegen/c_generator.py | 1 + 27 files changed, 6425 insertions(+), 4139 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index 2739d5bfc1dfa2..3b345099bf54b5 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -201,6 +201,10 @@ Token value for ``":="``. +.. data:: EXCLAMATION + + Token value for ``"!"``. + .. data:: OP .. data:: AWAIT @@ -213,6 +217,12 @@ .. data:: SOFT_KEYWORD +.. data:: FSTRING_START + +.. data:: FSTRING_MIDDLE + +.. data:: FSTRING_END + .. data:: ERRORTOKEN .. data:: N_TOKENS diff --git a/Grammar/Tokens b/Grammar/Tokens index 1f3e3b09913653..096876fdd130f8 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -53,6 +53,7 @@ ATEQUAL '@=' RARROW '->' ELLIPSIS '...' COLONEQUAL ':=' +EXCLAMATION '!' OP AWAIT @@ -60,6 +61,9 @@ ASYNC TYPE_IGNORE TYPE_COMMENT SOFT_KEYWORD +FSTRING_START +FSTRING_MIDDLE +FSTRING_END ERRORTOKEN # These aren't used by the C tokenizer but are needed for tokenize.py diff --git a/Grammar/python.gram b/Grammar/python.gram index 2498251293e80e..3a356c65a75195 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -194,7 +194,7 @@ yield_stmt[stmt_ty]: y=yield_expr { _PyAST_Expr(y, EXTRA) } assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _PyAST_Assert(a, b, EXTRA) } -import_stmt[stmt_ty]: +import_stmt[stmt_ty]: | invalid_import | import_name | import_from @@ -415,8 +415,8 @@ try_stmt[stmt_ty]: | invalid_try_stmt | 'try' &&':' b=block f=finally_block { _PyAST_Try(b, NULL, NULL, f, EXTRA) } | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _PyAST_Try(b, ex, el, f, EXTRA) } - | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] { - CHECK_VERSION(stmt_ty, 11, "Exception groups are", + | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_star_block+ el=[else_block] f=[finally_block] { + CHECK_VERSION(stmt_ty, 11, "Exception groups are", _PyAST_TryStar(b, ex, el, f, EXTRA)) } @@ -807,7 +807,7 @@ atom[expr_ty]: | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) } | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) } | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) } - | &STRING strings + | &(STRING|FSTRING_START) strings | NUMBER | &'(' (tuple | group | genexp) | &'[' (list | listcomp) @@ -877,7 +877,26 @@ lambda_param[arg_ty]: a=NAME { _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) } # LITERALS # ======== -strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } +fstring_middle[expr_ty]: + | fstring_replacement_field + | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } +fstring_replacement_field[expr_ty]: + | '{' a=(yield_expr | star_expressions) debug_expr="="? conversion=[fstring_conversion] format=[fstring_full_format_spec] '}' { + _PyPegen_formatted_value(p, a, debug_expr, conversion, format, EXTRA) + } + | invalid_replacement_field +fstring_conversion[expr_ty]: + | conv_token="!" conv=NAME { _PyPegen_check_fstring_conversion(p, conv_token, conv) } +fstring_full_format_spec[expr_ty]: + | ':' spec=fstring_format_spec* { spec ? _PyAST_JoinedStr((asdl_expr_seq*)spec, EXTRA) : NULL } +fstring_format_spec[expr_ty]: + | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } + | fstring_replacement_field +fstring[expr_ty]: + | a=FSTRING_START b=fstring_middle* c=FSTRING_END { _PyPegen_joined_str(p, a, (asdl_expr_seq*)b, c) } + +string[expr_ty]: s[Token*]=STRING { _PyPegen_constant_from_string(p, s) } +strings[expr_ty] (memo): a[asdl_expr_seq*]=(fstring|string)+ { _PyPegen_concatenate_strings(p, a, EXTRA) } list[expr_ty]: | '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) } @@ -1118,6 +1137,8 @@ invalid_expression: _PyPegen_check_legacy_stmt(p, a) ? NULL : p->tokens[p->mark-1]->level == 0 ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") } | a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") } + | a='lambda' [lambda_params] b=':' &(FSTRING_MIDDLE | fstring_replacement_field) { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") } invalid_named_expression(memo): | a=expression ':=' expression { @@ -1241,7 +1262,7 @@ 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?") } - + invalid_import_from_targets: | import_from_as_names ',' NEWLINE { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } @@ -1335,3 +1356,24 @@ invalid_kvpair: | expression a=':' &('}'|',') {RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") } invalid_starred_expression: | a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") } +invalid_replacement_field: + | '{' a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '='") } + | '{' a='!' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '!'") } + | '{' a=':' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before ':'") } + | '{' a='}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '}'") } + | '{' !(yield_expr | star_expressions) { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '{'")} + | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '}'") } + | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '}'") } + | '{' (yield_expr | star_expressions) '='? invalid_conversion_character + | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '}'") } + | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}', or format specs") } + | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' { + PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}'") } + +invalid_conversion_character: + | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") } + | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") } diff --git a/Include/internal/pycore_token.h b/Include/internal/pycore_token.h index 95459ab9f7d004..b9df8766736adf 100644 --- a/Include/internal/pycore_token.h +++ b/Include/internal/pycore_token.h @@ -67,14 +67,18 @@ extern "C" { #define RARROW 51 #define ELLIPSIS 52 #define COLONEQUAL 53 -#define OP 54 -#define AWAIT 55 -#define ASYNC 56 -#define TYPE_IGNORE 57 -#define TYPE_COMMENT 58 -#define SOFT_KEYWORD 59 -#define ERRORTOKEN 60 -#define N_TOKENS 64 +#define EXCLAMATION 54 +#define OP 55 +#define AWAIT 56 +#define ASYNC 57 +#define TYPE_IGNORE 58 +#define TYPE_COMMENT 59 +#define SOFT_KEYWORD 60 +#define FSTRING_START 61 +#define FSTRING_MIDDLE 62 +#define FSTRING_END 63 +#define ERRORTOKEN 64 +#define N_TOKENS 68 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ @@ -86,6 +90,8 @@ extern "C" { (x) == NEWLINE || \ (x) == INDENT || \ (x) == DEDENT) +#define ISSTRINGLIT(x) ((x) == STRING || \ + (x) == FSTRING_MIDDLE) // Symbols exported for test_peg_generator diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 6c932e1305e1dd..a579bfd7930784 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -774,11 +774,6 @@ def test_parenthesized_with_feature_version(self): ast.parse('with (CtxManager() as example): ...', feature_version=(3, 8)) ast.parse('with CtxManager() as example: ...', feature_version=(3, 8)) - def test_debug_f_string_feature_version(self): - ast.parse('f"{x=}"', feature_version=(3, 8)) - with self.assertRaises(SyntaxError): - ast.parse('f"{x=}"', feature_version=(3, 7)) - def test_assignment_expression_feature_version(self): ast.parse('(x := 0)', feature_version=(3, 8)) with self.assertRaises(SyntaxError): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index f10d72ea5547ee..d98e23855e0c19 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -636,9 +636,9 @@ def test_syntaxerror_multi_line_fstring(self): self.assertEqual( stderr.splitlines()[-3:], [ - b' foo"""', - b' ^', - b'SyntaxError: f-string: empty expression not allowed', + b' foo = f"""{}', + b' ^', + b'SyntaxError: f-string: valid expression required before \'}\'', ], ) diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index abcbf046e2cc22..be4fd73bfdc36b 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -4,6 +4,7 @@ from test import support from test.support import os_helper from test.support import script_helper +from test.support import warnings_helper import unittest class EOFTestCase(unittest.TestCase): @@ -36,10 +37,11 @@ def test_EOFS_with_file(self): rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unterminated triple-quoted string literal (detected at line 3)', err) + @warnings_helper.ignore_warnings(category=SyntaxWarning) def test_eof_with_line_continuation(self): expect = "unexpected EOF while parsing (, line 1)" try: - compile('"\\xhh" \\', '', 'exec', dont_inherit=True) + compile('"\\Xhh" \\', '', 'exec') except SyntaxError as msg: self.assertEqual(str(msg), expect) else: diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 684e888f08c778..4ef7decfbc263e 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -155,6 +155,7 @@ def ckmsg(src, msg): ckmsg(s, "'continue' not properly in loop") ckmsg("continue\n", "'continue' not properly in loop") + ckmsg("f'{6 0}'", "invalid syntax. Perhaps you forgot a comma?") def testSyntaxErrorMissingParens(self): def ckmsg(src, msg, exception=SyntaxError): @@ -227,7 +228,7 @@ def testSyntaxErrorOffset(self): check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20) check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +', 2, 19, encoding='cp1251') - check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) + check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 10) check('x = "a', 1, 5) check('lambda x: x = 2', 1, 1) check('f{a + b + c}', 1, 2) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index b3f6ef41d77b8f..f571233da07b78 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -329,13 +329,13 @@ def test_ast_line_numbers_multiline_fstring(self): self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) - self.assertEqual(t.body[1].value.values[1].lineno, 3) - self.assertEqual(t.body[1].value.values[2].lineno, 3) + self.assertEqual(t.body[1].value.values[1].lineno, 4) + self.assertEqual(t.body[1].value.values[2].lineno, 6) self.assertEqual(t.body[1].col_offset, 0) self.assertEqual(t.body[1].value.col_offset, 0) - self.assertEqual(t.body[1].value.values[0].col_offset, 0) - self.assertEqual(t.body[1].value.values[1].col_offset, 0) - self.assertEqual(t.body[1].value.values[2].col_offset, 0) + self.assertEqual(t.body[1].value.values[0].col_offset, 4) + self.assertEqual(t.body[1].value.values[1].col_offset, 2) + self.assertEqual(t.body[1].value.values[2].col_offset, 11) # NOTE: the following lineno information and col_offset is correct for # expressions within FormattedValues. binop = t.body[1].value.values[1].value @@ -366,13 +366,13 @@ def test_ast_line_numbers_multiline_fstring(self): self.assertEqual(t.body[0].lineno, 2) self.assertEqual(t.body[0].value.lineno, 2) self.assertEqual(t.body[0].value.values[0].lineno, 2) - self.assertEqual(t.body[0].value.values[1].lineno, 2) - self.assertEqual(t.body[0].value.values[2].lineno, 2) + self.assertEqual(t.body[0].value.values[1].lineno, 3) + self.assertEqual(t.body[0].value.values[2].lineno, 3) self.assertEqual(t.body[0].col_offset, 0) self.assertEqual(t.body[0].value.col_offset, 4) - self.assertEqual(t.body[0].value.values[0].col_offset, 4) - self.assertEqual(t.body[0].value.values[1].col_offset, 4) - self.assertEqual(t.body[0].value.values[2].col_offset, 4) + self.assertEqual(t.body[0].value.values[0].col_offset, 8) + self.assertEqual(t.body[0].value.values[1].col_offset, 10) + self.assertEqual(t.body[0].value.values[2].col_offset, 17) # Check {blech} self.assertEqual(t.body[0].value.values[1].value.lineno, 3) self.assertEqual(t.body[0].value.values[1].value.end_lineno, 3) @@ -387,6 +387,20 @@ def test_ast_line_numbers_with_parentheses(self): t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 1) + # check the joinedstr location + joinedstr = t.body[0].value + self.assertEqual(type(joinedstr), ast.JoinedStr) + self.assertEqual(joinedstr.lineno, 3) + self.assertEqual(joinedstr.end_lineno, 3) + self.assertEqual(joinedstr.col_offset, 4) + self.assertEqual(joinedstr.end_col_offset, 17) + # check the formatted value location + fv = t.body[0].value.values[1] + self.assertEqual(type(fv), ast.FormattedValue) + self.assertEqual(fv.lineno, 3) + self.assertEqual(fv.end_lineno, 3) + self.assertEqual(fv.col_offset, 7) + self.assertEqual(fv.end_col_offset, 16) # check the test(t) location call = t.body[0].value.values[1].value self.assertEqual(type(call), ast.Call) @@ -397,6 +411,50 @@ def test_ast_line_numbers_with_parentheses(self): expr = """ x = ( + u'wat', + u"wat", + b'wat', + b"wat", + f'wat', + f"wat", +) + +y = ( + u'''wat''', + u\"\"\"wat\"\"\", + b'''wat''', + b\"\"\"wat\"\"\", + f'''wat''', + f\"\"\"wat\"\"\", +) + """ + t = ast.parse(expr) + self.assertEqual(type(t), ast.Module) + self.assertEqual(len(t.body), 2) + x, y = t.body + + # Check the single quoted string offsets first. + offsets = [ + (elt.col_offset, elt.end_col_offset) + for elt in x.value.elts + ] + self.assertTrue(all( + offset == (4, 10) + for offset in offsets + )) + + # Check the triple quoted string offsets. + offsets = [ + (elt.col_offset, elt.end_col_offset) + for elt in y.value.elts + ] + self.assertTrue(all( + offset == (4, 14) + for offset in offsets + )) + + expr = """ +x = ( 'PERL_MM_OPT', ( f'wat' f'some_string={f(x)} ' @@ -415,9 +473,9 @@ def test_ast_line_numbers_with_parentheses(self): # check the first wat self.assertEqual(type(wat1), ast.Constant) self.assertEqual(wat1.lineno, 4) - self.assertEqual(wat1.end_lineno, 6) - self.assertEqual(wat1.col_offset, 12) - self.assertEqual(wat1.end_col_offset, 18) + self.assertEqual(wat1.end_lineno, 5) + self.assertEqual(wat1.col_offset, 14) + self.assertEqual(wat1.end_col_offset, 26) # check the call call = middle.value self.assertEqual(type(call), ast.Call) @@ -427,10 +485,14 @@ def test_ast_line_numbers_with_parentheses(self): self.assertEqual(call.end_col_offset, 31) # check the second wat self.assertEqual(type(wat2), ast.Constant) - self.assertEqual(wat2.lineno, 4) + self.assertEqual(wat2.lineno, 5) self.assertEqual(wat2.end_lineno, 6) - self.assertEqual(wat2.col_offset, 12) - self.assertEqual(wat2.end_col_offset, 18) + self.assertEqual(wat2.col_offset, 32) + # wat ends at the offset 17, but the whole f-string + # ends at the offset 18 (since the quote is part of the + # f-string but not the wat string) + self.assertEqual(wat2.end_col_offset, 17) + self.assertEqual(fstring.end_col_offset, 18) def test_docstring(self): def f(): @@ -467,7 +529,7 @@ def test_literal(self): self.assertEqual(f' ', ' ') def test_unterminated_string(self): - self.assertAllRaise(SyntaxError, 'f-string: unterminated string', + self.assertAllRaise(SyntaxError, 'unterminated string', [r"""f'{"x'""", r"""f'{"x}'""", r"""f'{("x'""", @@ -475,28 +537,33 @@ def test_unterminated_string(self): ]) def test_mismatched_parens(self): - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{((}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\)' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\)' " r"does not match opening parenthesis '\['", ["f'{a[4)}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\]' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\]' " r"does not match opening parenthesis '\('", ["f'{a(4]}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\['", ["f'{a[4}'", ]) - self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " + self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{a(4}'", ]) self.assertRaises(SyntaxError, eval, "f'{" + "("*500 + "}'") + def test_fstring_nested_too_deeply(self): + self.assertAllRaise(SyntaxError, + "f-string: expressions nested too deeply", + ['f"{1+2:{1+2:{1+1:{1}}}}"']) + def test_double_braces(self): self.assertEqual(f'{{', '{') self.assertEqual(f'a{{', 'a{') @@ -559,8 +626,14 @@ def test_compile_time_concat(self): self.assertEqual(f'' '' f'', '') self.assertEqual(f'' '' f'' '', '') - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3' f'}'", # can't concat to get a valid f-string + # This is not really [f'{'] + [f'}'] since we treat the inside + # of braces as a purely new context, so it is actually f'{ and + # then eval(' f') (a valid expression) and then }' which would + # constitute a valid f-string. + self.assertEqual(f'{' f'}', ' f') + + self.assertAllRaise(SyntaxError, "expecting '}'", + ['''f'{3' f"}"''', # can't concat to get a valid f-string ]) def test_comments(self): @@ -618,25 +691,19 @@ def test_format_specifier_expressions(self): self.assertEqual(f'{-10:-{"#"}1{0}x}', ' -0xa') self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', ' -0xa') self.assertEqual(f'{10:#{3 != {4:5} and width}x}', ' 0xa') + self.assertEqual(f'result: {value:{width:{0}}.{precision:1}}', 'result: 12.35') - self.assertAllRaise(SyntaxError, - """f-string: invalid conversion character 'r{"': """ - """expected 's', 'r', or 'a'""", + self.assertAllRaise(SyntaxError, "f-string: expecting ':' or '}'", ["""f'{"s"!r{":10"}}'""", - # This looks like a nested format spec. ]) - self.assertAllRaise(SyntaxError, "f-string: invalid syntax", + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", [# Invalid syntax inside a nested spec. "f'{4:{/5}}'", ]) - self.assertAllRaise(SyntaxError, "f-string: expressions nested too deeply", - [# Can't nest format specifiers. - "f'result: {value:{width:{0}}.{precision:1}}'", - ]) - self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', [# No expansion inside conversion or for # the : or ! itself. @@ -655,7 +722,8 @@ def __format__(self, spec): self.assertEqual(f'{x} {x}', '1 2') def test_missing_expression(self): - self.assertAllRaise(SyntaxError, 'f-string: empty expression not allowed', + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '}'", ["f'{}'", "f'{ }'" "f' {} '", @@ -667,8 +735,8 @@ def test_missing_expression(self): "f'''{\t\f\r\n}'''", ]) - # Different error messages are raised when a specifier ('!', ':' or '=') is used after an empty expression - self.assertAllRaise(SyntaxError, "f-string: expression required before '!'", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '!'", ["f'{!r}'", "f'{ !r}'", "f'{!}'", @@ -689,7 +757,8 @@ def test_missing_expression(self): "f'{ !xr:a}'", ]) - self.assertAllRaise(SyntaxError, "f-string: expression required before ':'", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before ':'", ["f'{:}'", "f'{ :!}'", "f'{:2}'", @@ -697,7 +766,8 @@ def test_missing_expression(self): "f'{:'", ]) - self.assertAllRaise(SyntaxError, "f-string: expression required before '='", + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '='", ["f'{=}'", "f'{ =}'", "f'{ =:}'", @@ -715,24 +785,18 @@ def test_missing_expression(self): def test_parens_in_expressions(self): self.assertEqual(f'{3,}', '(3,)') - # Add these because when an expression is evaluated, parens - # are added around it. But we shouldn't go from an invalid - # expression to a valid one. The added parens are just - # supposed to allow whitespace (including newlines). - self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", ["f'{,}'", - "f'{,}'", # this is (,), which is an error ]) self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", ["f'{3)+(4}'", ]) - self.assertAllRaise(SyntaxError, 'unterminated string literal', - ["f'{\n}'", - ]) def test_newlines_before_syntax_error(self): - self.assertAllRaise(SyntaxError, "invalid syntax", + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) def test_backslashes_in_string_part(self): @@ -776,7 +840,7 @@ def test_backslashes_in_string_part(self): self.assertEqual(f'2\x203', '2 3') self.assertEqual(f'\x203', ' 3') - with self.assertWarns(SyntaxWarning): # invalid escape sequence + with self.assertWarns(DeprecationWarning): # invalid escape sequence value = eval(r"f'\{6*7}'") self.assertEqual(value, '\\42') self.assertEqual(f'\\{6*7}', '\\42') @@ -809,18 +873,40 @@ def test_misformed_unicode_character_name(self): r"'\N{GREEK CAPITAL LETTER DELTA'", ]) - def test_no_backslashes_in_expression_part(self): - self.assertAllRaise(SyntaxError, 'f-string expression part cannot include a backslash', - [r"f'{\'a\'}'", - r"f'{\t3}'", - r"f'{\}'", - r"rf'{\'a\'}'", - r"rf'{\t3}'", - r"rf'{\}'", - r"""rf'{"\N{LEFT CURLY BRACKET}"}'""", - r"f'{\n}'", + def test_backslashes_in_expression_part(self): + self.assertEqual(f"{( + 1 + + 2 + )}", "3") + + self.assertEqual("\N{LEFT CURLY BRACKET}", '{') + self.assertEqual(f'{"\N{LEFT CURLY BRACKET}"}', '{') + self.assertEqual(rf'{"\N{LEFT CURLY BRACKET}"}', '{') + + self.assertAllRaise(SyntaxError, + "f-string: valid expression required before '}'", + ["f'{\n}'", ]) + def test_invalid_backslashes_inside_fstring_context(self): + # All of these variations are invalid python syntax, + # so they are also invalid in f-strings as well. + cases = [ + formatting.format(expr=expr) + for formatting in [ + "{expr}", + "f'{{{expr}}}'", + "rf'{{{expr}}}'", + ] + for expr in [ + r"\'a\'", + r"\t3", + r"\\"[0], + ] + ] + self.assertAllRaise(SyntaxError, 'unexpected character after line continuation', + cases) + def test_no_escapes_for_braces(self): """ Only literal curly braces begin an expression. @@ -843,11 +929,69 @@ def test_lambda(self): self.assertEqual(f'{(lambda y:x*y)("8"):10}', "88888 ") # lambda doesn't work without parens, because the colon - # makes the parser think it's a format_spec - self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', + # makes the parser think it's a format_spec + # emit warning if we can match a format_spec + self.assertAllRaise(SyntaxError, + "f-string: lambda expressions are not allowed " + "without parentheses", ["f'{lambda x:x}'", + "f'{lambda :x}'", + "f'{lambda *arg, :x}'", + "f'{1, lambda:x}'", + ]) + + # but don't emit the paren warning in general cases + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", + ["f'{lambda x:}'", + "f'{lambda :}'", + "f'{+ lambda:None}'", ]) + def test_valid_prefixes(self): + self.assertEqual(F'{1}', "1") + self.assertEqual(FR'{2}', "2") + self.assertEqual(fR'{3}', "3") + + def test_roundtrip_raw_quotes(self): + self.assertEqual(fr"\'", "\\'") + self.assertEqual(fr'\"', '\\"') + self.assertEqual(fr'\"\'', '\\"\\\'') + self.assertEqual(fr'\'\"', '\\\'\\"') + self.assertEqual(fr'\"\'\"', '\\"\\\'\\"') + self.assertEqual(fr'\'\"\'', '\\\'\\"\\\'') + self.assertEqual(fr'\"\'\"\'', '\\"\\\'\\"\\\'') + + def test_fstring_backslash_before_double_bracket(self): + self.assertEqual(f'\{{\}}', '\\{\\}') + self.assertEqual(f'\{{', '\\{') + self.assertEqual(f'\{{{1+1}', '\\{2') + self.assertEqual(f'\}}{1+1}', '\\}2') + self.assertEqual(f'{1+1}\}}', '2\\}') + self.assertEqual(fr'\{{\}}', '\\{\\}') + self.assertEqual(fr'\{{', '\\{') + self.assertEqual(fr'\{{{1+1}', '\\{2') + self.assertEqual(fr'\}}{1+1}', '\\}2') + self.assertEqual(fr'{1+1}\}}', '2\\}') + + def test_fstring_backslash_prefix_raw(self): + self.assertEqual(f'\\', '\\') + self.assertEqual(f'\\\\', '\\\\') + self.assertEqual(fr'\\', r'\\') + self.assertEqual(fr'\\\\', r'\\\\') + self.assertEqual(rf'\\', r'\\') + self.assertEqual(rf'\\\\', r'\\\\') + self.assertEqual(Rf'\\', R'\\') + self.assertEqual(Rf'\\\\', R'\\\\') + self.assertEqual(fR'\\', R'\\') + self.assertEqual(fR'\\\\', R'\\\\') + self.assertEqual(FR'\\', R'\\') + self.assertEqual(FR'\\\\', R'\\\\') + + def test_fstring_format_spec_greedy_matching(self): + self.assertEqual(f"{1:}}}", "1}") + self.assertEqual(f"{1:>3{5}}}}", " 1}") + def test_yield(self): # Not terribly useful, but make sure the yield turns # a function into a generator @@ -1037,6 +1181,11 @@ def test_conversions(self): self.assertEqual(f'{"a"!r}', "'a'") self.assertEqual(f'{"a"!a}', "'a'") + # Conversions can have trailing whitespace after them since it + # does not provide any significance + self.assertEqual(f"{3!s }", "3") + self.assertEqual(f'{3.14!s :10.10}', '3.14 ') + # Not a conversion. self.assertEqual(f'{"a!r"}', "a!r") @@ -1049,16 +1198,27 @@ def test_conversions(self): "f'{3!g'", ]) - self.assertAllRaise(SyntaxError, 'f-string: missed conversion character', + self.assertAllRaise(SyntaxError, 'f-string: missing conversion character', ["f'{3!}'", "f'{3!:'", "f'{3!:}'", ]) - for conv in 'g', 'A', '3', 'G', '!', ' s', 's ', ' s ', 'ä', 'ɐ', 'ª': + for conv_identifier in 'g', 'A', 'G', 'ä', 'ɐ': self.assertAllRaise(SyntaxError, "f-string: invalid conversion character %r: " - "expected 's', 'r', or 'a'" % conv, + "expected 's', 'r', or 'a'" % conv_identifier, + ["f'{3!" + conv_identifier + "}'"]) + + for conv_non_identifier in '3', '!': + self.assertAllRaise(SyntaxError, + "f-string: invalid conversion character", + ["f'{3!" + conv_non_identifier + "}'"]) + + for conv in ' s', ' s ': + self.assertAllRaise(SyntaxError, + "f-string: conversion type must come right after the" + " exclamanation mark", ["f'{3!" + conv + "}'"]) self.assertAllRaise(SyntaxError, @@ -1097,8 +1257,7 @@ def test_mismatched_braces(self): ]) self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3:{{>10}'", - "f'{3'", + ["f'{3'", "f'{3!'", "f'{3:'", "f'{3!s'", @@ -1111,11 +1270,14 @@ def test_mismatched_braces(self): "f'{{{'", "f'{{}}{'", "f'{'", - "f'x{<'", # See bpo-46762. - "f'x{>'", "f'{i='", # See gh-93418. ]) + self.assertAllRaise(SyntaxError, + "f-string: expecting a valid expression after '{'", + ["f'{3:{{>10}'", + ]) + # But these are just normal strings. self.assertEqual(f'{"{"}', '{') self.assertEqual(f'{"}"}', '}') @@ -1314,6 +1476,7 @@ def __repr__(self): self.assertEqual(f'X{x =}Y', 'Xx ='+repr(x)+'Y') self.assertEqual(f'X{x= }Y', 'Xx= '+repr(x)+'Y') self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y') + self.assertEqual(f"sadsd {1 + 1 = :{1 + 1:1d}f}", "sadsd 1 + 1 = 2.000000") # These next lines contains tabs. Backslash escapes don't # work in f-strings. @@ -1335,7 +1498,8 @@ def test_walrus(self): self.assertEqual(x, 10) def test_invalid_syntax_error_message(self): - with self.assertRaisesRegex(SyntaxError, "f-string: invalid syntax"): + with self.assertRaisesRegex(SyntaxError, + "f-string: expecting '=', or '!', or ':', or '}'"): compile("f'{a $ b}'", "?", "exec") def test_with_two_commas_in_format_specifier(self): @@ -1359,12 +1523,11 @@ def test_with_an_underscore_and_a_comma_in_format_specifier(self): f'{1:_,}' def test_syntax_error_for_starred_expressions(self): - error_msg = re.escape("cannot use starred expression here") - with self.assertRaisesRegex(SyntaxError, error_msg): + with self.assertRaisesRegex(SyntaxError, "can't use starred expression here"): compile("f'{*a}'", "?", "exec") - error_msg = re.escape("cannot use double starred expression here") - with self.assertRaisesRegex(SyntaxError, error_msg): + with self.assertRaisesRegex(SyntaxError, + "f-string: expecting a valid expression after '{'"): compile("f'{**a}'", "?", "exec") if __name__ == '__main__': diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 63c2501cfe2338..283a7c23609e67 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -1625,6 +1625,10 @@ def test_random_files(self): # 7 more testfiles fail. Remove them also until the failure is diagnosed. testfiles.remove(os.path.join(tempdir, "test_unicode_identifiers.py")) + + # TODO: Remove this once we can unparse PEP 701 syntax + testfiles.remove(os.path.join(tempdir, "test_fstring.py")) + for f in ('buffer', 'builtin', 'fileio', 'inspect', 'os', 'platform', 'sys'): testfiles.remove(os.path.join(tempdir, "test_%s.py") % f) @@ -1937,25 +1941,39 @@ def test_string(self): """) self.check_tokenize('f"abc"', """\ - STRING 'f"abc"' (1, 0) (1, 6) + FSTRING_START 'f"' (1, 0) (1, 2) + FSTRING_MIDDLE 'abc' (1, 2) (1, 5) + FSTRING_END '"' (1, 5) (1, 6) """) self.check_tokenize('fR"a{b}c"', """\ - STRING 'fR"a{b}c"' (1, 0) (1, 9) + FSTRING_START 'fR"' (1, 0) (1, 3) + FSTRING_MIDDLE 'a' (1, 3) (1, 4) + LBRACE '{' (1, 4) (1, 5) + NAME 'b' (1, 5) (1, 6) + RBRACE '}' (1, 6) (1, 7) + FSTRING_MIDDLE 'c' (1, 7) (1, 8) + FSTRING_END '"' (1, 8) (1, 9) """) self.check_tokenize('f"""abc"""', """\ - STRING 'f\"\"\"abc\"\"\"' (1, 0) (1, 10) + FSTRING_START 'f\"""' (1, 0) (1, 4) + FSTRING_MIDDLE 'abc' (1, 4) (1, 7) + FSTRING_END '\"""' (1, 7) (1, 10) """) self.check_tokenize(r'f"abc\ def"', """\ - STRING 'f"abc\\\\\\ndef"' (1, 0) (2, 4) + FSTRING_START \'f"\' (1, 0) (1, 2) + FSTRING_MIDDLE 'abc\\\\\\ndef' (1, 2) (2, 3) + FSTRING_END '"' (2, 3) (2, 4) """) self.check_tokenize(r'Rf"abc\ def"', """\ - STRING 'Rf"abc\\\\\\ndef"' (1, 0) (2, 4) + FSTRING_START 'Rf"' (1, 0) (1, 3) + FSTRING_MIDDLE 'abc\\\\\\ndef' (1, 3) (2, 3) + FSTRING_END '"' (2, 3) (2, 4) """) def test_function(self): diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 8db7394d1512aa..aba4a44be9da96 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -272,7 +272,7 @@ def test_matmul(self): pass def test_fstring(self): - for tree in self.parse_all(fstring, minver=6): + for tree in self.parse_all(fstring): pass def test_underscorednumber(self): diff --git a/Lib/token.py b/Lib/token.py index 95b107c6643b3f..1459d12b376f82 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -57,18 +57,22 @@ RARROW = 51 ELLIPSIS = 52 COLONEQUAL = 53 -OP = 54 -AWAIT = 55 -ASYNC = 56 -TYPE_IGNORE = 57 -TYPE_COMMENT = 58 -SOFT_KEYWORD = 59 +EXCLAMATION = 54 +OP = 55 +AWAIT = 56 +ASYNC = 57 +TYPE_IGNORE = 58 +TYPE_COMMENT = 59 +SOFT_KEYWORD = 60 +FSTRING_START = 61 +FSTRING_MIDDLE = 62 +FSTRING_END = 63 # These aren't used by the C tokenizer but are needed for tokenize.py -ERRORTOKEN = 60 -COMMENT = 61 -NL = 62 -ENCODING = 63 -N_TOKENS = 64 +ERRORTOKEN = 64 +COMMENT = 65 +NL = 66 +ENCODING = 67 +N_TOKENS = 68 # Special definitions for cooperation with parser NT_OFFSET = 256 @@ -78,6 +82,7 @@ __all__.extend(tok_name.values()) EXACT_TOKEN_TYPES = { + '!': EXCLAMATION, '!=': NOTEQUAL, '%': PERCENT, '%=': PERCENTEQUAL, diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst new file mode 100644 index 00000000000000..35eceb83816bcb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-17-16-00-32.gh-issue-102856.UunJ7y.rst @@ -0,0 +1 @@ +Implement the required C tokenizer changes for PEP 701. Patch by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta Gómez Macías and sunmy2019. diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c index 46390966892d16..55c0f6fdd620f4 100644 --- a/Parser/action_helpers.c +++ b/Parser/action_helpers.c @@ -1,6 +1,7 @@ #include #include "pegen.h" +#include "tokenizer.h" #include "string_parser.h" #include "pycore_runtime.h" // _PyRuntime @@ -853,96 +854,6 @@ _PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) return new_seq; } -expr_ty -_PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) -{ - Py_ssize_t len = asdl_seq_LEN(strings); - assert(len > 0); - - Token *first = asdl_seq_GET_UNTYPED(strings, 0); - Token *last = asdl_seq_GET_UNTYPED(strings, len - 1); - - int bytesmode = 0; - PyObject *bytes_str = NULL; - - FstringParser state; - _PyPegen_FstringParser_Init(&state); - - for (Py_ssize_t i = 0; i < len; i++) { - Token *t = asdl_seq_GET_UNTYPED(strings, i); - - int this_bytesmode; - int this_rawmode; - PyObject *s; - const char *fstr; - Py_ssize_t fstrlen = -1; - - if (_PyPegen_parsestr(p, &this_bytesmode, &this_rawmode, &s, &fstr, &fstrlen, t) != 0) { - goto error; - } - - /* Check that we are not mixing bytes with unicode. */ - if (i != 0 && bytesmode != this_bytesmode) { - RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); - Py_XDECREF(s); - goto error; - } - bytesmode = this_bytesmode; - - if (fstr != NULL) { - assert(s == NULL && !bytesmode); - - int result = _PyPegen_FstringParser_ConcatFstring(p, &state, &fstr, fstr + fstrlen, - this_rawmode, 0, first, t, last); - if (result < 0) { - goto error; - } - } - else { - /* String or byte string. */ - assert(s != NULL && fstr == NULL); - assert(bytesmode ? PyBytes_CheckExact(s) : PyUnicode_CheckExact(s)); - - if (bytesmode) { - if (i == 0) { - bytes_str = s; - } - else { - PyBytes_ConcatAndDel(&bytes_str, s); - if (!bytes_str) { - goto error; - } - } - } - else { - /* This is a regular string. Concatenate it. */ - if (_PyPegen_FstringParser_ConcatAndDel(&state, s) < 0) { - goto error; - } - } - } - } - - if (bytesmode) { - if (_PyArena_AddPyObject(p->arena, bytes_str) < 0) { - goto error; - } - return _PyAST_Constant(bytes_str, NULL, first->lineno, - first->col_offset, last->end_lineno, - last->end_col_offset, p->arena); - } - - return _PyPegen_FstringParser_Finish(p, &state, first, last); - -error: - Py_XDECREF(bytes_str); - _PyPegen_FstringParser_Dealloc(&state); - if (PyErr_Occurred()) { - _Pypegen_raise_decode_error(p); - } - return NULL; -} - expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty exp) { @@ -1054,6 +965,18 @@ _PyPegen_check_legacy_stmt(Parser *p, expr_ty name) { return 0; } +expr_ty +_PyPegen_check_fstring_conversion(Parser *p, Token* symbol, expr_ty conv) { + if (symbol->lineno != conv->lineno || symbol->end_col_offset != conv->col_offset) { + return RAISE_SYNTAX_ERROR_KNOWN_RANGE( + symbol, conv, + "f-string: conversion type must come right after the exclamanation mark" + ); + } + return conv; +} + + const char * _PyPegen_get_expr_name(expr_ty e) { @@ -1271,3 +1194,439 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq "Generator expression must be parenthesized" ); } + +// Fstring stuff + +static expr_ty +decode_fstring_buffer(Parser *p, int lineno, int col_offset, int end_lineno, + int end_col_offset) +{ + tokenizer_mode *tok_mode = &(p->tok->tok_mode_stack[p->tok->tok_mode_stack_index]); + assert(tok_mode->last_expr_buffer != NULL); + assert(tok_mode->last_expr_size >= 0 && tok_mode->last_expr_end >= 0); + + PyObject *res = PyUnicode_DecodeUTF8( + tok_mode->last_expr_buffer, + tok_mode->last_expr_size - tok_mode->last_expr_end, + NULL + ); + if (!res || _PyArena_AddPyObject(p->arena, res) < 0) { + Py_XDECREF(res); + return NULL; + } + + return _PyAST_Constant(res, NULL, lineno, col_offset, end_lineno, end_col_offset, p->arena); +} + +static expr_ty +_PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant) { + assert(PyUnicode_CheckExact(constant->v.Constant.value)); + + const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value); + if (bstr == NULL) { + return NULL; + } + + size_t len; + if (strcmp(bstr, "{{") == 0 || strcmp(bstr, "}}") == 0) { + len = 1; + } else { + len = strlen(bstr); + } + + is_raw = is_raw || strchr(bstr, '\\') == NULL; + PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, NULL); + if (str == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, constant->lineno, constant->col_offset, + constant->end_lineno, constant->end_col_offset, + p->arena); +} + +static asdl_expr_seq * +unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions) +{ + /* The parser might put multiple f-string values into an individual + * JoinedStr node at the top level due to stuff like f-string debugging + * expressions. This function flattens those and promotes them to the + * upper level. Only simplifies AST, but the compiler already takes care + * of the regular output, so this is not necessary if you are not going + * to expose the output AST to Python level. */ + + Py_ssize_t i, req_size, raw_size; + + req_size = raw_size = asdl_seq_LEN(raw_expressions); + expr_ty expr; + for (i = 0; i < raw_size; i++) { + expr = asdl_seq_GET(raw_expressions, i); + if (expr->kind == JoinedStr_kind) { + req_size += asdl_seq_LEN(expr->v.JoinedStr.values) - 1; + } + } + + asdl_expr_seq *expressions = _Py_asdl_expr_seq_new(req_size, p->arena); + + Py_ssize_t raw_index, req_index = 0; + for (raw_index = 0; raw_index < raw_size; raw_index++) { + expr = asdl_seq_GET(raw_expressions, raw_index); + if (expr->kind == JoinedStr_kind) { + asdl_expr_seq *values = expr->v.JoinedStr.values; + for (Py_ssize_t n = 0; n < asdl_seq_LEN(values); n++) { + asdl_seq_SET(expressions, req_index, asdl_seq_GET(values, n)); + req_index++; + } + } else { + asdl_seq_SET(expressions, req_index, expr); + req_index++; + } + } + return expressions; +} + +expr_ty +_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) { + asdl_expr_seq *expr = unpack_top_level_joined_strs(p, raw_expressions); + Py_ssize_t n_items = asdl_seq_LEN(expr); + + const char* quote_str = PyBytes_AsString(a->bytes); + if (quote_str == NULL) { + return NULL; + } + int is_raw = strpbrk(quote_str, "rR") != NULL; + + asdl_expr_seq *seq = _Py_asdl_expr_seq_new(n_items, p->arena); + if (seq == NULL) { + return NULL; + } + + Py_ssize_t index = 0; + for (Py_ssize_t i = 0; i < n_items; i++) { + expr_ty item = asdl_seq_GET(expr, i); + if (item->kind == Constant_kind) { + item = _PyPegen_decode_fstring_part(p, is_raw, item); + if (item == NULL) { + return NULL; + } + + /* Tokenizer emits string parts even when the underlying string + might become an empty value (e.g. FSTRING_MIDDLE with the value \\n) + so we need to check for them and simplify it here. */ + if (PyUnicode_CheckExact(item->v.Constant.value) + && PyUnicode_GET_LENGTH(item->v.Constant.value) == 0) { + continue; + } + } + asdl_seq_SET(seq, index++, item); + } + + asdl_expr_seq *resized_exprs; + if (index != n_items) { + resized_exprs = _Py_asdl_expr_seq_new(index, p->arena); + if (resized_exprs == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < index; i++) { + asdl_seq_SET(resized_exprs, i, asdl_seq_GET(seq, i)); + } + } + else { + resized_exprs = seq; + } + + return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset, + b->end_lineno, b->end_col_offset, + p->arena); +} + +expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok) { + char* bstr = PyBytes_AsString(tok->bytes); + if (bstr == NULL) { + return NULL; + } + PyObject* str = PyUnicode_FromString(bstr); + if (str == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, + tok->end_lineno, tok->end_col_offset, + p->arena); +} + +expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok) { + char* the_str = PyBytes_AsString(tok->bytes); + if (the_str == NULL) { + return NULL; + } + PyObject *s = _PyPegen_parse_string(p, tok); + if (s == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, s) < 0) { + Py_DECREF(s); + return NULL; + } + PyObject *kind = NULL; + if (the_str && the_str[0] == 'u') { + kind = _PyPegen_new_identifier(p, "u"); + if (kind == NULL) { + return NULL; + } + } + return _PyAST_Constant(s, kind, tok->lineno, tok->col_offset, tok->end_lineno, tok->end_col_offset, p->arena); +} + +expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, expr_ty conversion, + expr_ty format, int lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena) { + int conversion_val = -1; + if (conversion != NULL) { + assert(conversion->kind == Name_kind); + Py_UCS4 first = PyUnicode_READ_CHAR(conversion->v.Name.id, 0); + + if (PyUnicode_GET_LENGTH(conversion->v.Name.id) > 1 || + !(first == 's' || first == 'r' || first == 'a')) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(conversion, + "f-string: invalid conversion character %R: expected 's', 'r', or 'a'", + conversion->v.Name.id); + return NULL; + } + + conversion_val = Py_SAFE_DOWNCAST(first, Py_UCS4, int); + } + else if (debug && !format) { + /* If no conversion is specified, use !r for debug expressions */ + conversion_val = (int)'r'; + } + + expr_ty formatted_value = _PyAST_FormattedValue( + expression, conversion_val, format, + lineno, col_offset, end_lineno, + end_col_offset, arena + ); + + if (debug) { + /* Find the non whitespace token after the "=" */ + int debug_end_line, debug_end_offset; + + if (conversion) { + debug_end_line = conversion->lineno; + debug_end_offset = conversion->col_offset; + } + else if (format) { + debug_end_line = format->lineno; + debug_end_offset = format->col_offset + 1; // HACK: ?? + } + else { + debug_end_line = end_lineno; + debug_end_offset = end_col_offset; + } + + expr_ty debug_text = decode_fstring_buffer(p, lineno, col_offset + 1, + debug_end_line, debug_end_offset - 1); + if (!debug_text) { + return NULL; + } + + asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena); + asdl_seq_SET(values, 0, debug_text); + asdl_seq_SET(values, 1, formatted_value); + return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line, debug_end_offset, p->arena); + } + else { + return formatted_value; + } +} + +expr_ty +_PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) +{ + Py_ssize_t len = asdl_seq_LEN(strings); + assert(len > 0); + + int f_string_found = 0; + int unicode_string_found = 0; + int bytes_found = 0; + + Py_ssize_t i = 0; + Py_ssize_t n_flattened_elements = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + if (elem->kind == Constant_kind) { + if (PyBytes_CheckExact(elem->v.Constant.value)) { + bytes_found = 1; + } else { + unicode_string_found = 1; + } + n_flattened_elements++; + } else { + n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values); + f_string_found = 1; + } + } + + if ((unicode_string_found || f_string_found) && bytes_found) { + RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); + return NULL; + } + + if (bytes_found) { + PyObject* res = PyBytes_FromString(""); + + /* Bytes literals never get a kind, but just for consistency + since they are represented as Constant nodes, we'll mirror + the same behavior as unicode strings for determining the + kind. */ + PyObject* kind = asdl_seq_GET(strings, 0)->v.Constant.kind; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + PyBytes_Concat(&res, elem->v.Constant.value); + } + if (!res || _PyArena_AddPyObject(arena, res) < 0) { + Py_XDECREF(res); + return NULL; + } + return _PyAST_Constant(res, kind, lineno, col_offset, end_lineno, end_col_offset, p->arena); + } + + if (!f_string_found && len == 1) { + return asdl_seq_GET(strings, 0); + } + + asdl_expr_seq* flattened = _Py_asdl_expr_seq_new(n_flattened_elements, p->arena); + if (flattened == NULL) { + return NULL; + } + + /* build flattened list */ + Py_ssize_t current_pos = 0; + Py_ssize_t j = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + if (elem->kind == Constant_kind) { + asdl_seq_SET(flattened, current_pos++, elem); + } else { + for (j = 0; j < asdl_seq_LEN(elem->v.JoinedStr.values); j++) { + expr_ty subvalue = asdl_seq_GET(elem->v.JoinedStr.values, j); + if (subvalue == NULL) { + return NULL; + } + asdl_seq_SET(flattened, current_pos++, subvalue); + } + } + } + + /* calculate folded element count */ + Py_ssize_t n_elements = 0; + int prev_is_constant = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* The concatenation of a FormattedValue and an empty Contant should + lead to the FormattedValue itself. Thus, we will not take any empty + constants into account, just as in `_PyPegen_joined_str` */ + if (f_string_found && elem->kind == Constant_kind && + PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) + continue; + + if (!prev_is_constant || elem->kind != Constant_kind) { + n_elements++; + } + prev_is_constant = elem->kind == Constant_kind; + } + + asdl_expr_seq* values = _Py_asdl_expr_seq_new(n_elements, p->arena); + if (values == NULL) { + return NULL; + } + + /* build folded list */ + _PyUnicodeWriter writer; + current_pos = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* if the current elem and the following are constants, + fold them and all consequent constants */ + if (elem->kind == Constant_kind) { + if (i + 1 < n_flattened_elements && + asdl_seq_GET(flattened, i + 1)->kind == Constant_kind) { + expr_ty first_elem = elem; + + /* When a string is getting concatenated, the kind of the string + is determined by the first string in the concatenation + sequence. + + u"abc" "def" -> u"abcdef" + "abc" u"abc" -> "abcabc" */ + PyObject *kind = elem->v.Constant.kind; + + _PyUnicodeWriter_Init(&writer); + expr_ty last_elem = elem; + for (j = i; j < n_flattened_elements; j++) { + expr_ty current_elem = asdl_seq_GET(flattened, j); + if (current_elem->kind == Constant_kind) { + if (_PyUnicodeWriter_WriteStr( + &writer, current_elem->v.Constant.value)) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; + } + last_elem = current_elem; + } else { + break; + } + } + i = j - 1; + + PyObject *concat_str = _PyUnicodeWriter_Finish(&writer); + if (concat_str == NULL) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, concat_str) < 0) { + Py_DECREF(concat_str); + return NULL; + } + elem = _PyAST_Constant(concat_str, kind, first_elem->lineno, + first_elem->col_offset, + last_elem->end_lineno, + last_elem->end_col_offset, p->arena); + if (elem == NULL) { + return NULL; + } + } + + /* Drop all empty contanst strings */ + if (f_string_found && + PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) { + continue; + } + } + + asdl_seq_SET(values, current_pos++, elem); + } + + if (!f_string_found) { + assert(n_elements == 1); + expr_ty elem = asdl_seq_GET(values, 0); + assert(elem->kind == Constant_kind); + return elem; + } + + assert(current_pos == n_elements); + return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, end_col_offset, p->arena); +} diff --git a/Parser/parser.c b/Parser/parser.c index e0a88a9cc72c8b..771366844fc489 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -17,52 +17,52 @@ static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) { - {"if", 641}, - {"as", 639}, - {"in", 650}, + {"if", 642}, + {"as", 640}, + {"in", 651}, {"or", 574}, {"is", 582}, {NULL, -1}, }, (KeywordToken[]) { - {"del", 603}, - {"def", 651}, - {"for", 649}, - {"try", 623}, + {"del", 604}, + {"def", 652}, + {"for", 650}, + {"try", 624}, {"and", 575}, {"not", 581}, {NULL, -1}, }, (KeywordToken[]) { - {"from", 607}, + {"from", 608}, {"pass", 504}, - {"with", 614}, - {"elif", 643}, - {"else", 644}, - {"None", 601}, - {"True", 600}, + {"with", 615}, + {"elif", 644}, + {"else", 645}, + {"None", 602}, + {"True", 601}, {NULL, -1}, }, (KeywordToken[]) { {"raise", 522}, {"yield", 573}, {"break", 508}, - {"class", 653}, - {"while", 646}, - {"False", 602}, + {"class", 654}, + {"while", 647}, + {"False", 603}, {NULL, -1}, }, (KeywordToken[]) { {"return", 519}, - {"import", 606}, + {"import", 607}, {"assert", 526}, {"global", 523}, - {"except", 636}, - {"lambda", 586}, + {"except", 637}, + {"lambda", 600}, {NULL, -1}, }, (KeywordToken[]) { - {"finally", 632}, + {"finally", 633}, {NULL, -1}, }, (KeywordToken[]) { @@ -224,341 +224,370 @@ static char *soft_keywords[] = { #define lambda_param_with_default_type 1144 #define lambda_param_maybe_default_type 1145 #define lambda_param_type 1146 -#define strings_type 1147 -#define list_type 1148 -#define tuple_type 1149 -#define set_type 1150 -#define dict_type 1151 -#define double_starred_kvpairs_type 1152 -#define double_starred_kvpair_type 1153 -#define kvpair_type 1154 -#define for_if_clauses_type 1155 -#define for_if_clause_type 1156 -#define listcomp_type 1157 -#define setcomp_type 1158 -#define genexp_type 1159 -#define dictcomp_type 1160 -#define arguments_type 1161 -#define args_type 1162 -#define kwargs_type 1163 -#define starred_expression_type 1164 -#define kwarg_or_starred_type 1165 -#define kwarg_or_double_starred_type 1166 -#define star_targets_type 1167 -#define star_targets_list_seq_type 1168 -#define star_targets_tuple_seq_type 1169 -#define star_target_type 1170 -#define target_with_star_atom_type 1171 -#define star_atom_type 1172 -#define single_target_type 1173 -#define single_subscript_attribute_target_type 1174 -#define t_primary_type 1175 // Left-recursive -#define t_lookahead_type 1176 -#define del_targets_type 1177 -#define del_target_type 1178 -#define del_t_atom_type 1179 -#define type_expressions_type 1180 -#define func_type_comment_type 1181 -#define invalid_arguments_type 1182 -#define invalid_kwarg_type 1183 -#define expression_without_invalid_type 1184 -#define invalid_legacy_expression_type 1185 -#define invalid_expression_type 1186 -#define invalid_named_expression_type 1187 -#define invalid_assignment_type 1188 -#define invalid_ann_assign_target_type 1189 -#define invalid_del_stmt_type 1190 -#define invalid_block_type 1191 -#define invalid_comprehension_type 1192 -#define invalid_dict_comprehension_type 1193 -#define invalid_parameters_type 1194 -#define invalid_default_type 1195 -#define invalid_star_etc_type 1196 -#define invalid_kwds_type 1197 -#define invalid_parameters_helper_type 1198 -#define invalid_lambda_parameters_type 1199 -#define invalid_lambda_parameters_helper_type 1200 -#define invalid_lambda_star_etc_type 1201 -#define invalid_lambda_kwds_type 1202 -#define invalid_double_type_comments_type 1203 -#define invalid_with_item_type 1204 -#define invalid_for_target_type 1205 -#define invalid_group_type 1206 -#define invalid_import_type 1207 -#define invalid_import_from_targets_type 1208 -#define invalid_with_stmt_type 1209 -#define invalid_with_stmt_indent_type 1210 -#define invalid_try_stmt_type 1211 -#define invalid_except_stmt_type 1212 -#define invalid_finally_stmt_type 1213 -#define invalid_except_stmt_indent_type 1214 -#define invalid_except_star_stmt_indent_type 1215 -#define invalid_match_stmt_type 1216 -#define invalid_case_block_type 1217 -#define invalid_as_pattern_type 1218 -#define invalid_class_pattern_type 1219 -#define invalid_class_argument_pattern_type 1220 -#define invalid_if_stmt_type 1221 -#define invalid_elif_stmt_type 1222 -#define invalid_else_stmt_type 1223 -#define invalid_while_stmt_type 1224 -#define invalid_for_stmt_type 1225 -#define invalid_def_raw_type 1226 -#define invalid_class_def_raw_type 1227 -#define invalid_double_starred_kvpairs_type 1228 -#define invalid_kvpair_type 1229 -#define invalid_starred_expression_type 1230 -#define _loop0_1_type 1231 -#define _loop0_2_type 1232 -#define _loop1_3_type 1233 -#define _loop0_5_type 1234 -#define _gather_4_type 1235 -#define _tmp_6_type 1236 -#define _tmp_7_type 1237 -#define _tmp_8_type 1238 -#define _tmp_9_type 1239 -#define _tmp_10_type 1240 -#define _tmp_11_type 1241 -#define _tmp_12_type 1242 -#define _tmp_13_type 1243 -#define _loop1_14_type 1244 -#define _tmp_15_type 1245 -#define _tmp_16_type 1246 -#define _tmp_17_type 1247 -#define _loop0_19_type 1248 -#define _gather_18_type 1249 -#define _loop0_21_type 1250 -#define _gather_20_type 1251 -#define _tmp_22_type 1252 -#define _tmp_23_type 1253 -#define _loop0_24_type 1254 -#define _loop1_25_type 1255 -#define _loop0_27_type 1256 -#define _gather_26_type 1257 -#define _tmp_28_type 1258 -#define _loop0_30_type 1259 -#define _gather_29_type 1260 -#define _tmp_31_type 1261 -#define _loop1_32_type 1262 -#define _tmp_33_type 1263 -#define _tmp_34_type 1264 -#define _tmp_35_type 1265 -#define _loop0_36_type 1266 -#define _loop0_37_type 1267 -#define _loop0_38_type 1268 -#define _loop1_39_type 1269 -#define _loop0_40_type 1270 -#define _loop1_41_type 1271 -#define _loop1_42_type 1272 -#define _loop1_43_type 1273 -#define _loop0_44_type 1274 -#define _loop1_45_type 1275 -#define _loop0_46_type 1276 -#define _loop1_47_type 1277 -#define _loop0_48_type 1278 -#define _loop0_49_type 1279 -#define _loop1_50_type 1280 -#define _loop0_52_type 1281 -#define _gather_51_type 1282 -#define _loop0_54_type 1283 -#define _gather_53_type 1284 -#define _loop0_56_type 1285 -#define _gather_55_type 1286 -#define _loop0_58_type 1287 -#define _gather_57_type 1288 -#define _tmp_59_type 1289 -#define _loop1_60_type 1290 -#define _loop1_61_type 1291 -#define _tmp_62_type 1292 -#define _tmp_63_type 1293 -#define _loop1_64_type 1294 -#define _loop0_66_type 1295 -#define _gather_65_type 1296 -#define _tmp_67_type 1297 -#define _tmp_68_type 1298 -#define _tmp_69_type 1299 -#define _tmp_70_type 1300 -#define _loop0_72_type 1301 -#define _gather_71_type 1302 -#define _loop0_74_type 1303 -#define _gather_73_type 1304 -#define _tmp_75_type 1305 -#define _loop0_77_type 1306 -#define _gather_76_type 1307 -#define _loop0_79_type 1308 -#define _gather_78_type 1309 -#define _loop1_80_type 1310 -#define _loop1_81_type 1311 -#define _loop0_83_type 1312 -#define _gather_82_type 1313 -#define _loop1_84_type 1314 -#define _loop1_85_type 1315 -#define _loop1_86_type 1316 -#define _tmp_87_type 1317 -#define _loop0_89_type 1318 -#define _gather_88_type 1319 -#define _tmp_90_type 1320 -#define _tmp_91_type 1321 -#define _tmp_92_type 1322 -#define _tmp_93_type 1323 -#define _tmp_94_type 1324 -#define _loop0_95_type 1325 -#define _loop0_96_type 1326 -#define _loop0_97_type 1327 -#define _loop1_98_type 1328 -#define _loop0_99_type 1329 -#define _loop1_100_type 1330 -#define _loop1_101_type 1331 -#define _loop1_102_type 1332 -#define _loop0_103_type 1333 -#define _loop1_104_type 1334 -#define _loop0_105_type 1335 -#define _loop1_106_type 1336 -#define _loop0_107_type 1337 -#define _loop1_108_type 1338 -#define _loop1_109_type 1339 -#define _tmp_110_type 1340 -#define _loop0_112_type 1341 -#define _gather_111_type 1342 -#define _loop1_113_type 1343 -#define _loop0_114_type 1344 -#define _loop0_115_type 1345 -#define _tmp_116_type 1346 -#define _loop0_118_type 1347 -#define _gather_117_type 1348 -#define _tmp_119_type 1349 -#define _loop0_121_type 1350 -#define _gather_120_type 1351 -#define _loop0_123_type 1352 -#define _gather_122_type 1353 -#define _loop0_125_type 1354 -#define _gather_124_type 1355 -#define _loop0_127_type 1356 -#define _gather_126_type 1357 -#define _loop0_128_type 1358 -#define _loop0_130_type 1359 -#define _gather_129_type 1360 -#define _loop1_131_type 1361 -#define _tmp_132_type 1362 -#define _loop0_134_type 1363 -#define _gather_133_type 1364 -#define _loop0_136_type 1365 -#define _gather_135_type 1366 -#define _loop0_138_type 1367 -#define _gather_137_type 1368 -#define _loop0_140_type 1369 -#define _gather_139_type 1370 -#define _loop0_142_type 1371 -#define _gather_141_type 1372 -#define _tmp_143_type 1373 -#define _tmp_144_type 1374 -#define _tmp_145_type 1375 -#define _tmp_146_type 1376 -#define _tmp_147_type 1377 -#define _tmp_148_type 1378 -#define _tmp_149_type 1379 -#define _tmp_150_type 1380 -#define _tmp_151_type 1381 -#define _tmp_152_type 1382 -#define _tmp_153_type 1383 -#define _loop0_154_type 1384 -#define _loop0_155_type 1385 -#define _loop0_156_type 1386 -#define _tmp_157_type 1387 -#define _tmp_158_type 1388 -#define _tmp_159_type 1389 -#define _tmp_160_type 1390 -#define _tmp_161_type 1391 -#define _loop0_162_type 1392 -#define _loop0_163_type 1393 -#define _loop0_164_type 1394 -#define _loop1_165_type 1395 -#define _tmp_166_type 1396 -#define _loop0_167_type 1397 -#define _tmp_168_type 1398 -#define _loop0_169_type 1399 -#define _loop1_170_type 1400 -#define _tmp_171_type 1401 -#define _tmp_172_type 1402 -#define _tmp_173_type 1403 -#define _loop0_174_type 1404 -#define _tmp_175_type 1405 -#define _tmp_176_type 1406 -#define _loop1_177_type 1407 -#define _tmp_178_type 1408 -#define _loop0_179_type 1409 -#define _loop0_180_type 1410 -#define _loop0_181_type 1411 -#define _loop0_183_type 1412 -#define _gather_182_type 1413 -#define _tmp_184_type 1414 -#define _loop0_185_type 1415 -#define _tmp_186_type 1416 -#define _loop0_187_type 1417 -#define _loop1_188_type 1418 -#define _loop1_189_type 1419 -#define _tmp_190_type 1420 -#define _tmp_191_type 1421 -#define _loop0_192_type 1422 -#define _tmp_193_type 1423 -#define _tmp_194_type 1424 -#define _tmp_195_type 1425 -#define _loop0_197_type 1426 -#define _gather_196_type 1427 -#define _loop0_199_type 1428 -#define _gather_198_type 1429 -#define _loop0_201_type 1430 -#define _gather_200_type 1431 -#define _loop0_203_type 1432 -#define _gather_202_type 1433 -#define _tmp_204_type 1434 -#define _loop0_205_type 1435 -#define _loop1_206_type 1436 -#define _tmp_207_type 1437 -#define _loop0_208_type 1438 -#define _loop1_209_type 1439 -#define _tmp_210_type 1440 -#define _tmp_211_type 1441 -#define _tmp_212_type 1442 -#define _tmp_213_type 1443 -#define _tmp_214_type 1444 -#define _tmp_215_type 1445 -#define _tmp_216_type 1446 -#define _tmp_217_type 1447 -#define _tmp_218_type 1448 -#define _tmp_219_type 1449 -#define _loop0_221_type 1450 -#define _gather_220_type 1451 -#define _tmp_222_type 1452 -#define _tmp_223_type 1453 -#define _tmp_224_type 1454 -#define _tmp_225_type 1455 -#define _tmp_226_type 1456 -#define _tmp_227_type 1457 -#define _tmp_228_type 1458 -#define _tmp_229_type 1459 -#define _tmp_230_type 1460 -#define _tmp_231_type 1461 -#define _tmp_232_type 1462 -#define _tmp_233_type 1463 -#define _tmp_234_type 1464 -#define _tmp_235_type 1465 -#define _tmp_236_type 1466 -#define _tmp_237_type 1467 -#define _tmp_238_type 1468 -#define _tmp_239_type 1469 -#define _tmp_240_type 1470 -#define _tmp_241_type 1471 -#define _tmp_242_type 1472 -#define _tmp_243_type 1473 -#define _tmp_244_type 1474 -#define _tmp_245_type 1475 -#define _tmp_246_type 1476 -#define _tmp_247_type 1477 -#define _tmp_248_type 1478 -#define _tmp_249_type 1479 -#define _tmp_250_type 1480 -#define _tmp_251_type 1481 +#define fstring_middle_type 1147 +#define fstring_replacement_field_type 1148 +#define fstring_conversion_type 1149 +#define fstring_full_format_spec_type 1150 +#define fstring_format_spec_type 1151 +#define string_type 1152 +#define strings_type 1153 +#define list_type 1154 +#define tuple_type 1155 +#define set_type 1156 +#define dict_type 1157 +#define double_starred_kvpairs_type 1158 +#define double_starred_kvpair_type 1159 +#define kvpair_type 1160 +#define for_if_clauses_type 1161 +#define for_if_clause_type 1162 +#define listcomp_type 1163 +#define setcomp_type 1164 +#define genexp_type 1165 +#define dictcomp_type 1166 +#define arguments_type 1167 +#define args_type 1168 +#define kwargs_type 1169 +#define starred_expression_type 1170 +#define kwarg_or_starred_type 1171 +#define kwarg_or_double_starred_type 1172 +#define star_targets_type 1173 +#define star_targets_list_seq_type 1174 +#define star_targets_tuple_seq_type 1175 +#define star_target_type 1176 +#define target_with_star_atom_type 1177 +#define star_atom_type 1178 +#define single_target_type 1179 +#define single_subscript_attribute_target_type 1180 +#define t_primary_type 1181 // Left-recursive +#define t_lookahead_type 1182 +#define del_targets_type 1183 +#define del_target_type 1184 +#define del_t_atom_type 1185 +#define type_expressions_type 1186 +#define func_type_comment_type 1187 +#define invalid_arguments_type 1188 +#define invalid_kwarg_type 1189 +#define expression_without_invalid_type 1190 +#define invalid_legacy_expression_type 1191 +#define invalid_expression_type 1192 +#define invalid_named_expression_type 1193 +#define invalid_assignment_type 1194 +#define invalid_ann_assign_target_type 1195 +#define invalid_del_stmt_type 1196 +#define invalid_block_type 1197 +#define invalid_comprehension_type 1198 +#define invalid_dict_comprehension_type 1199 +#define invalid_parameters_type 1200 +#define invalid_default_type 1201 +#define invalid_star_etc_type 1202 +#define invalid_kwds_type 1203 +#define invalid_parameters_helper_type 1204 +#define invalid_lambda_parameters_type 1205 +#define invalid_lambda_parameters_helper_type 1206 +#define invalid_lambda_star_etc_type 1207 +#define invalid_lambda_kwds_type 1208 +#define invalid_double_type_comments_type 1209 +#define invalid_with_item_type 1210 +#define invalid_for_target_type 1211 +#define invalid_group_type 1212 +#define invalid_import_type 1213 +#define invalid_import_from_targets_type 1214 +#define invalid_with_stmt_type 1215 +#define invalid_with_stmt_indent_type 1216 +#define invalid_try_stmt_type 1217 +#define invalid_except_stmt_type 1218 +#define invalid_finally_stmt_type 1219 +#define invalid_except_stmt_indent_type 1220 +#define invalid_except_star_stmt_indent_type 1221 +#define invalid_match_stmt_type 1222 +#define invalid_case_block_type 1223 +#define invalid_as_pattern_type 1224 +#define invalid_class_pattern_type 1225 +#define invalid_class_argument_pattern_type 1226 +#define invalid_if_stmt_type 1227 +#define invalid_elif_stmt_type 1228 +#define invalid_else_stmt_type 1229 +#define invalid_while_stmt_type 1230 +#define invalid_for_stmt_type 1231 +#define invalid_def_raw_type 1232 +#define invalid_class_def_raw_type 1233 +#define invalid_double_starred_kvpairs_type 1234 +#define invalid_kvpair_type 1235 +#define invalid_starred_expression_type 1236 +#define invalid_replacement_field_type 1237 +#define invalid_conversion_character_type 1238 +#define _loop0_1_type 1239 +#define _loop0_2_type 1240 +#define _loop0_3_type 1241 +#define _loop1_4_type 1242 +#define _loop0_6_type 1243 +#define _gather_5_type 1244 +#define _tmp_7_type 1245 +#define _tmp_8_type 1246 +#define _tmp_9_type 1247 +#define _tmp_10_type 1248 +#define _tmp_11_type 1249 +#define _tmp_12_type 1250 +#define _tmp_13_type 1251 +#define _tmp_14_type 1252 +#define _loop1_15_type 1253 +#define _tmp_16_type 1254 +#define _tmp_17_type 1255 +#define _tmp_18_type 1256 +#define _loop0_20_type 1257 +#define _gather_19_type 1258 +#define _loop0_22_type 1259 +#define _gather_21_type 1260 +#define _tmp_23_type 1261 +#define _tmp_24_type 1262 +#define _loop0_25_type 1263 +#define _loop1_26_type 1264 +#define _loop0_28_type 1265 +#define _gather_27_type 1266 +#define _tmp_29_type 1267 +#define _loop0_31_type 1268 +#define _gather_30_type 1269 +#define _tmp_32_type 1270 +#define _loop1_33_type 1271 +#define _tmp_34_type 1272 +#define _tmp_35_type 1273 +#define _tmp_36_type 1274 +#define _loop0_37_type 1275 +#define _loop0_38_type 1276 +#define _loop0_39_type 1277 +#define _loop1_40_type 1278 +#define _loop0_41_type 1279 +#define _loop1_42_type 1280 +#define _loop1_43_type 1281 +#define _loop1_44_type 1282 +#define _loop0_45_type 1283 +#define _loop1_46_type 1284 +#define _loop0_47_type 1285 +#define _loop1_48_type 1286 +#define _loop0_49_type 1287 +#define _loop0_50_type 1288 +#define _loop1_51_type 1289 +#define _loop0_53_type 1290 +#define _gather_52_type 1291 +#define _loop0_55_type 1292 +#define _gather_54_type 1293 +#define _loop0_57_type 1294 +#define _gather_56_type 1295 +#define _loop0_59_type 1296 +#define _gather_58_type 1297 +#define _tmp_60_type 1298 +#define _loop1_61_type 1299 +#define _loop1_62_type 1300 +#define _tmp_63_type 1301 +#define _tmp_64_type 1302 +#define _loop1_65_type 1303 +#define _loop0_67_type 1304 +#define _gather_66_type 1305 +#define _tmp_68_type 1306 +#define _tmp_69_type 1307 +#define _tmp_70_type 1308 +#define _tmp_71_type 1309 +#define _loop0_73_type 1310 +#define _gather_72_type 1311 +#define _loop0_75_type 1312 +#define _gather_74_type 1313 +#define _tmp_76_type 1314 +#define _loop0_78_type 1315 +#define _gather_77_type 1316 +#define _loop0_80_type 1317 +#define _gather_79_type 1318 +#define _loop1_81_type 1319 +#define _loop1_82_type 1320 +#define _loop0_84_type 1321 +#define _gather_83_type 1322 +#define _loop1_85_type 1323 +#define _loop1_86_type 1324 +#define _loop1_87_type 1325 +#define _tmp_88_type 1326 +#define _loop0_90_type 1327 +#define _gather_89_type 1328 +#define _tmp_91_type 1329 +#define _tmp_92_type 1330 +#define _tmp_93_type 1331 +#define _tmp_94_type 1332 +#define _tmp_95_type 1333 +#define _tmp_96_type 1334 +#define _loop0_97_type 1335 +#define _loop0_98_type 1336 +#define _loop0_99_type 1337 +#define _loop1_100_type 1338 +#define _loop0_101_type 1339 +#define _loop1_102_type 1340 +#define _loop1_103_type 1341 +#define _loop1_104_type 1342 +#define _loop0_105_type 1343 +#define _loop1_106_type 1344 +#define _loop0_107_type 1345 +#define _loop1_108_type 1346 +#define _loop0_109_type 1347 +#define _loop1_110_type 1348 +#define _tmp_111_type 1349 +#define _loop0_112_type 1350 +#define _loop1_113_type 1351 +#define _tmp_114_type 1352 +#define _loop0_116_type 1353 +#define _gather_115_type 1354 +#define _loop1_117_type 1355 +#define _loop0_118_type 1356 +#define _loop0_119_type 1357 +#define _tmp_120_type 1358 +#define _loop0_122_type 1359 +#define _gather_121_type 1360 +#define _tmp_123_type 1361 +#define _loop0_125_type 1362 +#define _gather_124_type 1363 +#define _loop0_127_type 1364 +#define _gather_126_type 1365 +#define _loop0_129_type 1366 +#define _gather_128_type 1367 +#define _loop0_131_type 1368 +#define _gather_130_type 1369 +#define _loop0_132_type 1370 +#define _loop0_134_type 1371 +#define _gather_133_type 1372 +#define _loop1_135_type 1373 +#define _tmp_136_type 1374 +#define _loop0_138_type 1375 +#define _gather_137_type 1376 +#define _loop0_140_type 1377 +#define _gather_139_type 1378 +#define _loop0_142_type 1379 +#define _gather_141_type 1380 +#define _loop0_144_type 1381 +#define _gather_143_type 1382 +#define _loop0_146_type 1383 +#define _gather_145_type 1384 +#define _tmp_147_type 1385 +#define _tmp_148_type 1386 +#define _tmp_149_type 1387 +#define _tmp_150_type 1388 +#define _tmp_151_type 1389 +#define _tmp_152_type 1390 +#define _tmp_153_type 1391 +#define _tmp_154_type 1392 +#define _tmp_155_type 1393 +#define _tmp_156_type 1394 +#define _tmp_157_type 1395 +#define _tmp_158_type 1396 +#define _loop0_159_type 1397 +#define _loop0_160_type 1398 +#define _loop0_161_type 1399 +#define _tmp_162_type 1400 +#define _tmp_163_type 1401 +#define _tmp_164_type 1402 +#define _tmp_165_type 1403 +#define _tmp_166_type 1404 +#define _loop0_167_type 1405 +#define _loop0_168_type 1406 +#define _loop0_169_type 1407 +#define _loop1_170_type 1408 +#define _tmp_171_type 1409 +#define _loop0_172_type 1410 +#define _tmp_173_type 1411 +#define _loop0_174_type 1412 +#define _loop1_175_type 1413 +#define _tmp_176_type 1414 +#define _tmp_177_type 1415 +#define _tmp_178_type 1416 +#define _loop0_179_type 1417 +#define _tmp_180_type 1418 +#define _tmp_181_type 1419 +#define _loop1_182_type 1420 +#define _tmp_183_type 1421 +#define _loop0_184_type 1422 +#define _loop0_185_type 1423 +#define _loop0_186_type 1424 +#define _loop0_188_type 1425 +#define _gather_187_type 1426 +#define _tmp_189_type 1427 +#define _loop0_190_type 1428 +#define _tmp_191_type 1429 +#define _loop0_192_type 1430 +#define _loop1_193_type 1431 +#define _loop1_194_type 1432 +#define _tmp_195_type 1433 +#define _tmp_196_type 1434 +#define _loop0_197_type 1435 +#define _tmp_198_type 1436 +#define _tmp_199_type 1437 +#define _tmp_200_type 1438 +#define _loop0_202_type 1439 +#define _gather_201_type 1440 +#define _loop0_204_type 1441 +#define _gather_203_type 1442 +#define _loop0_206_type 1443 +#define _gather_205_type 1444 +#define _loop0_208_type 1445 +#define _gather_207_type 1446 +#define _tmp_209_type 1447 +#define _loop0_210_type 1448 +#define _loop1_211_type 1449 +#define _tmp_212_type 1450 +#define _loop0_213_type 1451 +#define _loop1_214_type 1452 +#define _tmp_215_type 1453 +#define _tmp_216_type 1454 +#define _tmp_217_type 1455 +#define _tmp_218_type 1456 +#define _tmp_219_type 1457 +#define _tmp_220_type 1458 +#define _tmp_221_type 1459 +#define _tmp_222_type 1460 +#define _tmp_223_type 1461 +#define _tmp_224_type 1462 +#define _loop0_226_type 1463 +#define _gather_225_type 1464 +#define _tmp_227_type 1465 +#define _tmp_228_type 1466 +#define _tmp_229_type 1467 +#define _tmp_230_type 1468 +#define _tmp_231_type 1469 +#define _tmp_232_type 1470 +#define _tmp_233_type 1471 +#define _tmp_234_type 1472 +#define _tmp_235_type 1473 +#define _tmp_236_type 1474 +#define _tmp_237_type 1475 +#define _tmp_238_type 1476 +#define _tmp_239_type 1477 +#define _loop0_240_type 1478 +#define _tmp_241_type 1479 +#define _tmp_242_type 1480 +#define _tmp_243_type 1481 +#define _tmp_244_type 1482 +#define _tmp_245_type 1483 +#define _tmp_246_type 1484 +#define _tmp_247_type 1485 +#define _tmp_248_type 1486 +#define _tmp_249_type 1487 +#define _tmp_250_type 1488 +#define _tmp_251_type 1489 +#define _tmp_252_type 1490 +#define _tmp_253_type 1491 +#define _tmp_254_type 1492 +#define _tmp_255_type 1493 +#define _tmp_256_type 1494 +#define _tmp_257_type 1495 +#define _tmp_258_type 1496 +#define _tmp_259_type 1497 +#define _tmp_260_type 1498 +#define _tmp_261_type 1499 +#define _tmp_262_type 1500 +#define _tmp_263_type 1501 +#define _tmp_264_type 1502 +#define _tmp_265_type 1503 +#define _tmp_266_type 1504 +#define _tmp_267_type 1505 +#define _tmp_268_type 1506 +#define _tmp_269_type 1507 +#define _tmp_270_type 1508 +#define _tmp_271_type 1509 +#define _tmp_272_type 1510 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -707,6 +736,12 @@ static arg_ty lambda_param_no_default_rule(Parser *p); static NameDefaultPair* lambda_param_with_default_rule(Parser *p); static NameDefaultPair* lambda_param_maybe_default_rule(Parser *p); static arg_ty lambda_param_rule(Parser *p); +static expr_ty fstring_middle_rule(Parser *p); +static expr_ty fstring_replacement_field_rule(Parser *p); +static expr_ty fstring_conversion_rule(Parser *p); +static expr_ty fstring_full_format_spec_rule(Parser *p); +static expr_ty fstring_format_spec_rule(Parser *p); +static expr_ty string_rule(Parser *p); static expr_ty strings_rule(Parser *p); static expr_ty list_rule(Parser *p); static expr_ty tuple_rule(Parser *p); @@ -791,12 +826,14 @@ static void *invalid_class_def_raw_rule(Parser *p); static void *invalid_double_starred_kvpairs_rule(Parser *p); static void *invalid_kvpair_rule(Parser *p); static void *invalid_starred_expression_rule(Parser *p); +static void *invalid_replacement_field_rule(Parser *p); +static void *invalid_conversion_character_rule(Parser *p); static asdl_seq *_loop0_1_rule(Parser *p); static asdl_seq *_loop0_2_rule(Parser *p); -static asdl_seq *_loop1_3_rule(Parser *p); -static asdl_seq *_loop0_5_rule(Parser *p); -static asdl_seq *_gather_4_rule(Parser *p); -static void *_tmp_6_rule(Parser *p); +static asdl_seq *_loop0_3_rule(Parser *p); +static asdl_seq *_loop1_4_rule(Parser *p); +static asdl_seq *_loop0_6_rule(Parser *p); +static asdl_seq *_gather_5_rule(Parser *p); static void *_tmp_7_rule(Parser *p); static void *_tmp_8_rule(Parser *p); static void *_tmp_9_rule(Parser *p); @@ -804,139 +841,139 @@ static void *_tmp_10_rule(Parser *p); static void *_tmp_11_rule(Parser *p); static void *_tmp_12_rule(Parser *p); static void *_tmp_13_rule(Parser *p); -static asdl_seq *_loop1_14_rule(Parser *p); -static void *_tmp_15_rule(Parser *p); +static void *_tmp_14_rule(Parser *p); +static asdl_seq *_loop1_15_rule(Parser *p); static void *_tmp_16_rule(Parser *p); static void *_tmp_17_rule(Parser *p); -static asdl_seq *_loop0_19_rule(Parser *p); -static asdl_seq *_gather_18_rule(Parser *p); -static asdl_seq *_loop0_21_rule(Parser *p); -static asdl_seq *_gather_20_rule(Parser *p); -static void *_tmp_22_rule(Parser *p); +static void *_tmp_18_rule(Parser *p); +static asdl_seq *_loop0_20_rule(Parser *p); +static asdl_seq *_gather_19_rule(Parser *p); +static asdl_seq *_loop0_22_rule(Parser *p); +static asdl_seq *_gather_21_rule(Parser *p); static void *_tmp_23_rule(Parser *p); -static asdl_seq *_loop0_24_rule(Parser *p); -static asdl_seq *_loop1_25_rule(Parser *p); -static asdl_seq *_loop0_27_rule(Parser *p); -static asdl_seq *_gather_26_rule(Parser *p); -static void *_tmp_28_rule(Parser *p); -static asdl_seq *_loop0_30_rule(Parser *p); -static asdl_seq *_gather_29_rule(Parser *p); -static void *_tmp_31_rule(Parser *p); -static asdl_seq *_loop1_32_rule(Parser *p); -static void *_tmp_33_rule(Parser *p); +static void *_tmp_24_rule(Parser *p); +static asdl_seq *_loop0_25_rule(Parser *p); +static asdl_seq *_loop1_26_rule(Parser *p); +static asdl_seq *_loop0_28_rule(Parser *p); +static asdl_seq *_gather_27_rule(Parser *p); +static void *_tmp_29_rule(Parser *p); +static asdl_seq *_loop0_31_rule(Parser *p); +static asdl_seq *_gather_30_rule(Parser *p); +static void *_tmp_32_rule(Parser *p); +static asdl_seq *_loop1_33_rule(Parser *p); static void *_tmp_34_rule(Parser *p); static void *_tmp_35_rule(Parser *p); -static asdl_seq *_loop0_36_rule(Parser *p); +static void *_tmp_36_rule(Parser *p); static asdl_seq *_loop0_37_rule(Parser *p); static asdl_seq *_loop0_38_rule(Parser *p); -static asdl_seq *_loop1_39_rule(Parser *p); -static asdl_seq *_loop0_40_rule(Parser *p); -static asdl_seq *_loop1_41_rule(Parser *p); +static asdl_seq *_loop0_39_rule(Parser *p); +static asdl_seq *_loop1_40_rule(Parser *p); +static asdl_seq *_loop0_41_rule(Parser *p); static asdl_seq *_loop1_42_rule(Parser *p); static asdl_seq *_loop1_43_rule(Parser *p); -static asdl_seq *_loop0_44_rule(Parser *p); -static asdl_seq *_loop1_45_rule(Parser *p); -static asdl_seq *_loop0_46_rule(Parser *p); -static asdl_seq *_loop1_47_rule(Parser *p); -static asdl_seq *_loop0_48_rule(Parser *p); +static asdl_seq *_loop1_44_rule(Parser *p); +static asdl_seq *_loop0_45_rule(Parser *p); +static asdl_seq *_loop1_46_rule(Parser *p); +static asdl_seq *_loop0_47_rule(Parser *p); +static asdl_seq *_loop1_48_rule(Parser *p); static asdl_seq *_loop0_49_rule(Parser *p); -static asdl_seq *_loop1_50_rule(Parser *p); -static asdl_seq *_loop0_52_rule(Parser *p); -static asdl_seq *_gather_51_rule(Parser *p); -static asdl_seq *_loop0_54_rule(Parser *p); -static asdl_seq *_gather_53_rule(Parser *p); -static asdl_seq *_loop0_56_rule(Parser *p); -static asdl_seq *_gather_55_rule(Parser *p); -static asdl_seq *_loop0_58_rule(Parser *p); -static asdl_seq *_gather_57_rule(Parser *p); -static void *_tmp_59_rule(Parser *p); -static asdl_seq *_loop1_60_rule(Parser *p); +static asdl_seq *_loop0_50_rule(Parser *p); +static asdl_seq *_loop1_51_rule(Parser *p); +static asdl_seq *_loop0_53_rule(Parser *p); +static asdl_seq *_gather_52_rule(Parser *p); +static asdl_seq *_loop0_55_rule(Parser *p); +static asdl_seq *_gather_54_rule(Parser *p); +static asdl_seq *_loop0_57_rule(Parser *p); +static asdl_seq *_gather_56_rule(Parser *p); +static asdl_seq *_loop0_59_rule(Parser *p); +static asdl_seq *_gather_58_rule(Parser *p); +static void *_tmp_60_rule(Parser *p); static asdl_seq *_loop1_61_rule(Parser *p); -static void *_tmp_62_rule(Parser *p); +static asdl_seq *_loop1_62_rule(Parser *p); static void *_tmp_63_rule(Parser *p); -static asdl_seq *_loop1_64_rule(Parser *p); -static asdl_seq *_loop0_66_rule(Parser *p); -static asdl_seq *_gather_65_rule(Parser *p); -static void *_tmp_67_rule(Parser *p); +static void *_tmp_64_rule(Parser *p); +static asdl_seq *_loop1_65_rule(Parser *p); +static asdl_seq *_loop0_67_rule(Parser *p); +static asdl_seq *_gather_66_rule(Parser *p); static void *_tmp_68_rule(Parser *p); static void *_tmp_69_rule(Parser *p); static void *_tmp_70_rule(Parser *p); -static asdl_seq *_loop0_72_rule(Parser *p); -static asdl_seq *_gather_71_rule(Parser *p); -static asdl_seq *_loop0_74_rule(Parser *p); -static asdl_seq *_gather_73_rule(Parser *p); -static void *_tmp_75_rule(Parser *p); -static asdl_seq *_loop0_77_rule(Parser *p); -static asdl_seq *_gather_76_rule(Parser *p); -static asdl_seq *_loop0_79_rule(Parser *p); -static asdl_seq *_gather_78_rule(Parser *p); -static asdl_seq *_loop1_80_rule(Parser *p); +static void *_tmp_71_rule(Parser *p); +static asdl_seq *_loop0_73_rule(Parser *p); +static asdl_seq *_gather_72_rule(Parser *p); +static asdl_seq *_loop0_75_rule(Parser *p); +static asdl_seq *_gather_74_rule(Parser *p); +static void *_tmp_76_rule(Parser *p); +static asdl_seq *_loop0_78_rule(Parser *p); +static asdl_seq *_gather_77_rule(Parser *p); +static asdl_seq *_loop0_80_rule(Parser *p); +static asdl_seq *_gather_79_rule(Parser *p); static asdl_seq *_loop1_81_rule(Parser *p); -static asdl_seq *_loop0_83_rule(Parser *p); -static asdl_seq *_gather_82_rule(Parser *p); -static asdl_seq *_loop1_84_rule(Parser *p); +static asdl_seq *_loop1_82_rule(Parser *p); +static asdl_seq *_loop0_84_rule(Parser *p); +static asdl_seq *_gather_83_rule(Parser *p); static asdl_seq *_loop1_85_rule(Parser *p); static asdl_seq *_loop1_86_rule(Parser *p); -static void *_tmp_87_rule(Parser *p); -static asdl_seq *_loop0_89_rule(Parser *p); -static asdl_seq *_gather_88_rule(Parser *p); -static void *_tmp_90_rule(Parser *p); +static asdl_seq *_loop1_87_rule(Parser *p); +static void *_tmp_88_rule(Parser *p); +static asdl_seq *_loop0_90_rule(Parser *p); +static asdl_seq *_gather_89_rule(Parser *p); static void *_tmp_91_rule(Parser *p); static void *_tmp_92_rule(Parser *p); static void *_tmp_93_rule(Parser *p); static void *_tmp_94_rule(Parser *p); -static asdl_seq *_loop0_95_rule(Parser *p); -static asdl_seq *_loop0_96_rule(Parser *p); +static void *_tmp_95_rule(Parser *p); +static void *_tmp_96_rule(Parser *p); static asdl_seq *_loop0_97_rule(Parser *p); -static asdl_seq *_loop1_98_rule(Parser *p); +static asdl_seq *_loop0_98_rule(Parser *p); static asdl_seq *_loop0_99_rule(Parser *p); static asdl_seq *_loop1_100_rule(Parser *p); -static asdl_seq *_loop1_101_rule(Parser *p); +static asdl_seq *_loop0_101_rule(Parser *p); static asdl_seq *_loop1_102_rule(Parser *p); -static asdl_seq *_loop0_103_rule(Parser *p); +static asdl_seq *_loop1_103_rule(Parser *p); static asdl_seq *_loop1_104_rule(Parser *p); static asdl_seq *_loop0_105_rule(Parser *p); static asdl_seq *_loop1_106_rule(Parser *p); static asdl_seq *_loop0_107_rule(Parser *p); static asdl_seq *_loop1_108_rule(Parser *p); -static asdl_seq *_loop1_109_rule(Parser *p); -static void *_tmp_110_rule(Parser *p); +static asdl_seq *_loop0_109_rule(Parser *p); +static asdl_seq *_loop1_110_rule(Parser *p); +static void *_tmp_111_rule(Parser *p); static asdl_seq *_loop0_112_rule(Parser *p); -static asdl_seq *_gather_111_rule(Parser *p); static asdl_seq *_loop1_113_rule(Parser *p); -static asdl_seq *_loop0_114_rule(Parser *p); -static asdl_seq *_loop0_115_rule(Parser *p); -static void *_tmp_116_rule(Parser *p); +static void *_tmp_114_rule(Parser *p); +static asdl_seq *_loop0_116_rule(Parser *p); +static asdl_seq *_gather_115_rule(Parser *p); +static asdl_seq *_loop1_117_rule(Parser *p); static asdl_seq *_loop0_118_rule(Parser *p); -static asdl_seq *_gather_117_rule(Parser *p); -static void *_tmp_119_rule(Parser *p); -static asdl_seq *_loop0_121_rule(Parser *p); -static asdl_seq *_gather_120_rule(Parser *p); -static asdl_seq *_loop0_123_rule(Parser *p); -static asdl_seq *_gather_122_rule(Parser *p); +static asdl_seq *_loop0_119_rule(Parser *p); +static void *_tmp_120_rule(Parser *p); +static asdl_seq *_loop0_122_rule(Parser *p); +static asdl_seq *_gather_121_rule(Parser *p); +static void *_tmp_123_rule(Parser *p); static asdl_seq *_loop0_125_rule(Parser *p); static asdl_seq *_gather_124_rule(Parser *p); static asdl_seq *_loop0_127_rule(Parser *p); static asdl_seq *_gather_126_rule(Parser *p); -static asdl_seq *_loop0_128_rule(Parser *p); -static asdl_seq *_loop0_130_rule(Parser *p); -static asdl_seq *_gather_129_rule(Parser *p); -static asdl_seq *_loop1_131_rule(Parser *p); -static void *_tmp_132_rule(Parser *p); +static asdl_seq *_loop0_129_rule(Parser *p); +static asdl_seq *_gather_128_rule(Parser *p); +static asdl_seq *_loop0_131_rule(Parser *p); +static asdl_seq *_gather_130_rule(Parser *p); +static asdl_seq *_loop0_132_rule(Parser *p); static asdl_seq *_loop0_134_rule(Parser *p); static asdl_seq *_gather_133_rule(Parser *p); -static asdl_seq *_loop0_136_rule(Parser *p); -static asdl_seq *_gather_135_rule(Parser *p); +static asdl_seq *_loop1_135_rule(Parser *p); +static void *_tmp_136_rule(Parser *p); static asdl_seq *_loop0_138_rule(Parser *p); static asdl_seq *_gather_137_rule(Parser *p); static asdl_seq *_loop0_140_rule(Parser *p); static asdl_seq *_gather_139_rule(Parser *p); static asdl_seq *_loop0_142_rule(Parser *p); static asdl_seq *_gather_141_rule(Parser *p); -static void *_tmp_143_rule(Parser *p); -static void *_tmp_144_rule(Parser *p); -static void *_tmp_145_rule(Parser *p); -static void *_tmp_146_rule(Parser *p); +static asdl_seq *_loop0_144_rule(Parser *p); +static asdl_seq *_gather_143_rule(Parser *p); +static asdl_seq *_loop0_146_rule(Parser *p); +static asdl_seq *_gather_145_rule(Parser *p); static void *_tmp_147_rule(Parser *p); static void *_tmp_148_rule(Parser *p); static void *_tmp_149_rule(Parser *p); @@ -944,79 +981,79 @@ static void *_tmp_150_rule(Parser *p); static void *_tmp_151_rule(Parser *p); static void *_tmp_152_rule(Parser *p); static void *_tmp_153_rule(Parser *p); -static asdl_seq *_loop0_154_rule(Parser *p); -static asdl_seq *_loop0_155_rule(Parser *p); -static asdl_seq *_loop0_156_rule(Parser *p); +static void *_tmp_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); static void *_tmp_157_rule(Parser *p); static void *_tmp_158_rule(Parser *p); -static void *_tmp_159_rule(Parser *p); -static void *_tmp_160_rule(Parser *p); -static void *_tmp_161_rule(Parser *p); -static asdl_seq *_loop0_162_rule(Parser *p); -static asdl_seq *_loop0_163_rule(Parser *p); -static asdl_seq *_loop0_164_rule(Parser *p); -static asdl_seq *_loop1_165_rule(Parser *p); +static asdl_seq *_loop0_159_rule(Parser *p); +static asdl_seq *_loop0_160_rule(Parser *p); +static asdl_seq *_loop0_161_rule(Parser *p); +static void *_tmp_162_rule(Parser *p); +static void *_tmp_163_rule(Parser *p); +static void *_tmp_164_rule(Parser *p); +static void *_tmp_165_rule(Parser *p); static void *_tmp_166_rule(Parser *p); static asdl_seq *_loop0_167_rule(Parser *p); -static void *_tmp_168_rule(Parser *p); +static asdl_seq *_loop0_168_rule(Parser *p); static asdl_seq *_loop0_169_rule(Parser *p); static asdl_seq *_loop1_170_rule(Parser *p); static void *_tmp_171_rule(Parser *p); -static void *_tmp_172_rule(Parser *p); +static asdl_seq *_loop0_172_rule(Parser *p); static void *_tmp_173_rule(Parser *p); static asdl_seq *_loop0_174_rule(Parser *p); -static void *_tmp_175_rule(Parser *p); +static asdl_seq *_loop1_175_rule(Parser *p); static void *_tmp_176_rule(Parser *p); -static asdl_seq *_loop1_177_rule(Parser *p); +static void *_tmp_177_rule(Parser *p); static void *_tmp_178_rule(Parser *p); static asdl_seq *_loop0_179_rule(Parser *p); -static asdl_seq *_loop0_180_rule(Parser *p); -static asdl_seq *_loop0_181_rule(Parser *p); -static asdl_seq *_loop0_183_rule(Parser *p); -static asdl_seq *_gather_182_rule(Parser *p); -static void *_tmp_184_rule(Parser *p); +static void *_tmp_180_rule(Parser *p); +static void *_tmp_181_rule(Parser *p); +static asdl_seq *_loop1_182_rule(Parser *p); +static void *_tmp_183_rule(Parser *p); +static asdl_seq *_loop0_184_rule(Parser *p); static asdl_seq *_loop0_185_rule(Parser *p); -static void *_tmp_186_rule(Parser *p); -static asdl_seq *_loop0_187_rule(Parser *p); -static asdl_seq *_loop1_188_rule(Parser *p); -static asdl_seq *_loop1_189_rule(Parser *p); -static void *_tmp_190_rule(Parser *p); +static asdl_seq *_loop0_186_rule(Parser *p); +static asdl_seq *_loop0_188_rule(Parser *p); +static asdl_seq *_gather_187_rule(Parser *p); +static void *_tmp_189_rule(Parser *p); +static asdl_seq *_loop0_190_rule(Parser *p); static void *_tmp_191_rule(Parser *p); static asdl_seq *_loop0_192_rule(Parser *p); -static void *_tmp_193_rule(Parser *p); -static void *_tmp_194_rule(Parser *p); +static asdl_seq *_loop1_193_rule(Parser *p); +static asdl_seq *_loop1_194_rule(Parser *p); static void *_tmp_195_rule(Parser *p); +static void *_tmp_196_rule(Parser *p); static asdl_seq *_loop0_197_rule(Parser *p); -static asdl_seq *_gather_196_rule(Parser *p); -static asdl_seq *_loop0_199_rule(Parser *p); -static asdl_seq *_gather_198_rule(Parser *p); -static asdl_seq *_loop0_201_rule(Parser *p); -static asdl_seq *_gather_200_rule(Parser *p); -static asdl_seq *_loop0_203_rule(Parser *p); -static asdl_seq *_gather_202_rule(Parser *p); -static void *_tmp_204_rule(Parser *p); -static asdl_seq *_loop0_205_rule(Parser *p); -static asdl_seq *_loop1_206_rule(Parser *p); -static void *_tmp_207_rule(Parser *p); +static void *_tmp_198_rule(Parser *p); +static void *_tmp_199_rule(Parser *p); +static void *_tmp_200_rule(Parser *p); +static asdl_seq *_loop0_202_rule(Parser *p); +static asdl_seq *_gather_201_rule(Parser *p); +static asdl_seq *_loop0_204_rule(Parser *p); +static asdl_seq *_gather_203_rule(Parser *p); +static asdl_seq *_loop0_206_rule(Parser *p); +static asdl_seq *_gather_205_rule(Parser *p); static asdl_seq *_loop0_208_rule(Parser *p); -static asdl_seq *_loop1_209_rule(Parser *p); -static void *_tmp_210_rule(Parser *p); -static void *_tmp_211_rule(Parser *p); +static asdl_seq *_gather_207_rule(Parser *p); +static void *_tmp_209_rule(Parser *p); +static asdl_seq *_loop0_210_rule(Parser *p); +static asdl_seq *_loop1_211_rule(Parser *p); static void *_tmp_212_rule(Parser *p); -static void *_tmp_213_rule(Parser *p); -static void *_tmp_214_rule(Parser *p); +static asdl_seq *_loop0_213_rule(Parser *p); +static asdl_seq *_loop1_214_rule(Parser *p); static void *_tmp_215_rule(Parser *p); static void *_tmp_216_rule(Parser *p); static void *_tmp_217_rule(Parser *p); static void *_tmp_218_rule(Parser *p); static void *_tmp_219_rule(Parser *p); -static asdl_seq *_loop0_221_rule(Parser *p); -static asdl_seq *_gather_220_rule(Parser *p); +static void *_tmp_220_rule(Parser *p); +static void *_tmp_221_rule(Parser *p); static void *_tmp_222_rule(Parser *p); static void *_tmp_223_rule(Parser *p); static void *_tmp_224_rule(Parser *p); -static void *_tmp_225_rule(Parser *p); -static void *_tmp_226_rule(Parser *p); +static asdl_seq *_loop0_226_rule(Parser *p); +static asdl_seq *_gather_225_rule(Parser *p); static void *_tmp_227_rule(Parser *p); static void *_tmp_228_rule(Parser *p); static void *_tmp_229_rule(Parser *p); @@ -1030,7 +1067,7 @@ static void *_tmp_236_rule(Parser *p); static void *_tmp_237_rule(Parser *p); static void *_tmp_238_rule(Parser *p); static void *_tmp_239_rule(Parser *p); -static void *_tmp_240_rule(Parser *p); +static asdl_seq *_loop0_240_rule(Parser *p); static void *_tmp_241_rule(Parser *p); static void *_tmp_242_rule(Parser *p); static void *_tmp_243_rule(Parser *p); @@ -1042,6 +1079,27 @@ static void *_tmp_248_rule(Parser *p); static void *_tmp_249_rule(Parser *p); static void *_tmp_250_rule(Parser *p); static void *_tmp_251_rule(Parser *p); +static void *_tmp_252_rule(Parser *p); +static void *_tmp_253_rule(Parser *p); +static void *_tmp_254_rule(Parser *p); +static void *_tmp_255_rule(Parser *p); +static void *_tmp_256_rule(Parser *p); +static void *_tmp_257_rule(Parser *p); +static void *_tmp_258_rule(Parser *p); +static void *_tmp_259_rule(Parser *p); +static void *_tmp_260_rule(Parser *p); +static void *_tmp_261_rule(Parser *p); +static void *_tmp_262_rule(Parser *p); +static void *_tmp_263_rule(Parser *p); +static void *_tmp_264_rule(Parser *p); +static void *_tmp_265_rule(Parser *p); +static void *_tmp_266_rule(Parser *p); +static void *_tmp_267_rule(Parser *p); +static void *_tmp_268_rule(Parser *p); +static void *_tmp_269_rule(Parser *p); +static void *_tmp_270_rule(Parser *p); +static void *_tmp_271_rule(Parser *p); +static void *_tmp_272_rule(Parser *p); // file: statements? $ @@ -1247,7 +1305,7 @@ func_type_rule(Parser *p) return _res; } -// fstring: star_expressions +// fstring: FSTRING_START fstring_middle* FSTRING_END static expr_ty fstring_rule(Parser *p) { @@ -1261,24 +1319,35 @@ fstring_rule(Parser *p) } expr_ty _res = NULL; int _mark = p->mark; - { // star_expressions + { // FSTRING_START fstring_middle* FSTRING_END if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); - expr_ty star_expressions_var; + D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + Token * a; + asdl_seq * b; + Token * c; if ( - (star_expressions_var = star_expressions_rule(p)) // star_expressions + (a = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' + && + (b = _loop0_3_rule(p)) // fstring_middle* + && + (c = _PyPegen_expect_token(p, FSTRING_END)) // token='FSTRING_END' ) { - D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); - _res = star_expressions_var; + D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); + _res = _PyPegen_joined_str ( p , a , ( asdl_expr_seq* ) b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START fstring_middle* FSTRING_END")); } _res = NULL; done: @@ -1308,7 +1377,7 @@ statements_rule(Parser *p) D(fprintf(stderr, "%*c> statements[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement+")); asdl_seq * a; if ( - (a = _loop1_3_rule(p)) // statement+ + (a = _loop1_4_rule(p)) // statement+ ) { D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); @@ -1584,7 +1653,7 @@ simple_stmts_rule(Parser *p) asdl_stmt_seq* a; Token * newline_var; if ( - (a = (asdl_stmt_seq*)_gather_4_rule(p)) // ';'.simple_stmt+ + (a = (asdl_stmt_seq*)_gather_5_rule(p)) // ';'.simple_stmt+ && (_opt_var = _PyPegen_expect_token(p, 13), !p->error_indicator) // ';'? && @@ -1731,7 +1800,7 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); stmt_ty import_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_6_rule, p) + _PyPegen_lookahead(1, _tmp_7_rule, p) && (import_stmt_var = import_stmt_rule(p)) // import_stmt ) @@ -1806,7 +1875,7 @@ simple_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); stmt_ty del_stmt_var; if ( - _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 603) // token='del' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 604) // token='del' && (del_stmt_var = del_stmt_rule(p)) // del_stmt ) @@ -2006,7 +2075,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); stmt_ty function_def_var; if ( - _PyPegen_lookahead(1, _tmp_7_rule, p) + _PyPegen_lookahead(1, _tmp_8_rule, p) && (function_def_var = function_def_rule(p)) // function_def ) @@ -2027,7 +2096,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, 641) // token='if' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 642) // token='if' && (if_stmt_var = if_stmt_rule(p)) // if_stmt ) @@ -2048,7 +2117,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); stmt_ty class_def_var; if ( - _PyPegen_lookahead(1, _tmp_8_rule, p) + _PyPegen_lookahead(1, _tmp_9_rule, p) && (class_def_var = class_def_rule(p)) // class_def ) @@ -2069,7 +2138,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); stmt_ty with_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_9_rule, p) + _PyPegen_lookahead(1, _tmp_10_rule, p) && (with_stmt_var = with_stmt_rule(p)) // with_stmt ) @@ -2090,7 +2159,7 @@ compound_stmt_rule(Parser *p) D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); stmt_ty for_stmt_var; if ( - _PyPegen_lookahead(1, _tmp_10_rule, p) + _PyPegen_lookahead(1, _tmp_11_rule, p) && (for_stmt_var = for_stmt_rule(p)) // for_stmt ) @@ -2111,7 +2180,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, 623) // token='try' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 624) // token='try' && (try_stmt_var = try_stmt_rule(p)) // try_stmt ) @@ -2132,7 +2201,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, 646) // token='while' + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 647) // token='while' && (while_stmt_var = while_stmt_rule(p)) // while_stmt ) @@ -2215,7 +2284,7 @@ assignment_rule(Parser *p) && (b = expression_rule(p)) // expression && - (c = _tmp_11_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_12_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); @@ -2251,13 +2320,13 @@ assignment_rule(Parser *p) expr_ty b; void *c; if ( - (a = _tmp_12_rule(p)) // '(' single_target ')' | single_subscript_attribute_target + (a = _tmp_13_rule(p)) // '(' single_target ')' | single_subscript_attribute_target && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (b = expression_rule(p)) // expression && - (c = _tmp_13_rule(p), !p->error_indicator) // ['=' annotated_rhs] + (c = _tmp_14_rule(p), !p->error_indicator) // ['=' annotated_rhs] ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); @@ -2292,9 +2361,9 @@ assignment_rule(Parser *p) void *b; void *tc; if ( - (a = (asdl_expr_seq*)_loop1_14_rule(p)) // ((star_targets '='))+ + (a = (asdl_expr_seq*)_loop1_15_rule(p)) // ((star_targets '='))+ && - (b = _tmp_15_rule(p)) // yield_expr | star_expressions + (b = _tmp_16_rule(p)) // yield_expr | star_expressions && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' && @@ -2340,7 +2409,7 @@ assignment_rule(Parser *p) && (_cut_var = 1) && - (c = _tmp_16_rule(p)) // yield_expr | star_expressions + (c = _tmp_17_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); @@ -2899,7 +2968,7 @@ raise_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_17_rule(p), !p->error_indicator) // ['from' expression] + (b = _tmp_18_rule(p), !p->error_indicator) // ['from' expression] ) { D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); @@ -2997,7 +3066,7 @@ global_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 523)) // token='global' && - (a = (asdl_expr_seq*)_gather_18_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_19_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); @@ -3062,7 +3131,7 @@ nonlocal_stmt_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 524)) // token='nonlocal' && - (a = (asdl_expr_seq*)_gather_20_rule(p)) // ','.NAME+ + (a = (asdl_expr_seq*)_gather_21_rule(p)) // ','.NAME+ ) { D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); @@ -3125,11 +3194,11 @@ del_stmt_rule(Parser *p) Token * _keyword; asdl_expr_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 603)) // token='del' + (_keyword = _PyPegen_expect_token(p, 604)) // token='del' && (a = del_targets_rule(p)) // del_targets && - _PyPegen_lookahead(1, _tmp_22_rule, p) + _PyPegen_lookahead(1, _tmp_23_rule, p) ) { D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); @@ -3278,7 +3347,7 @@ assert_stmt_rule(Parser *p) && (a = expression_rule(p)) // expression && - (b = _tmp_23_rule(p), !p->error_indicator) // [',' expression] + (b = _tmp_24_rule(p), !p->error_indicator) // [',' expression] ) { D(fprintf(stderr, "%*c+ assert_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); @@ -3418,7 +3487,7 @@ import_name_rule(Parser *p) Token * _keyword; asdl_alias_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword = _PyPegen_expect_token(p, 607)) // token='import' && (a = dotted_as_names_rule(p)) // dotted_as_names ) @@ -3488,13 +3557,13 @@ import_from_rule(Parser *p) expr_ty b; asdl_alias_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && - (a = _loop0_24_rule(p)) // (('.' | '...'))* + (a = _loop0_25_rule(p)) // (('.' | '...'))* && (b = dotted_name_rule(p)) // dotted_name && - (_keyword_1 = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='import' && (c = import_from_targets_rule(p)) // import_from_targets ) @@ -3532,11 +3601,11 @@ import_from_rule(Parser *p) asdl_seq * a; asdl_alias_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && - (a = _loop1_25_rule(p)) // (('.' | '...'))+ + (a = _loop1_26_rule(p)) // (('.' | '...'))+ && - (_keyword_1 = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='import' && (b = import_from_targets_rule(p)) // import_from_targets ) @@ -3731,7 +3800,7 @@ import_from_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_26_rule(p)) // ','.import_from_as_name+ + (a = (asdl_alias_seq*)_gather_27_rule(p)) // ','.import_from_as_name+ ) { D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); @@ -3787,7 +3856,7 @@ import_from_as_name_rule(Parser *p) if ( (a = _PyPegen_name_token(p)) // NAME && - (b = _tmp_28_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_29_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); @@ -3840,7 +3909,7 @@ dotted_as_names_rule(Parser *p) D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); asdl_alias_seq* a; if ( - (a = (asdl_alias_seq*)_gather_29_rule(p)) // ','.dotted_as_name+ + (a = (asdl_alias_seq*)_gather_30_rule(p)) // ','.dotted_as_name+ ) { D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); @@ -3896,7 +3965,7 @@ dotted_as_name_rule(Parser *p) if ( (a = dotted_name_rule(p)) // dotted_name && - (b = _tmp_31_rule(p), !p->error_indicator) // ['as' NAME] + (b = _tmp_32_rule(p), !p->error_indicator) // ['as' NAME] ) { D(fprintf(stderr, "%*c+ dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); @@ -4151,7 +4220,7 @@ decorators_rule(Parser *p) D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_loop1_32_rule(p)) // (('@' named_expression NEWLINE))+ + (a = (asdl_expr_seq*)_loop1_33_rule(p)) // (('@' named_expression NEWLINE))+ ) { D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); @@ -4293,11 +4362,11 @@ class_def_raw_rule(Parser *p) void *b; asdl_stmt_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' && (a = _PyPegen_name_token(p)) // NAME && - (b = _tmp_33_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (b = _tmp_34_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -4459,7 +4528,7 @@ function_def_raw_rule(Parser *p) void *params; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' && (n = _PyPegen_name_token(p)) // NAME && @@ -4469,7 +4538,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_34_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4519,7 +4588,7 @@ function_def_raw_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' && (n = _PyPegen_name_token(p)) // NAME && @@ -4529,7 +4598,7 @@ function_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (a = _tmp_35_rule(p), !p->error_indicator) // ['->' expression] + (a = _tmp_36_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -4656,9 +4725,9 @@ parameters_rule(Parser *p) if ( (a = slash_no_default_rule(p)) // slash_no_default && - (b = (asdl_arg_seq*)_loop0_36_rule(p)) // param_no_default* + (b = (asdl_arg_seq*)_loop0_37_rule(p)) // param_no_default* && - (c = _loop0_37_rule(p)) // param_with_default* + (c = _loop0_38_rule(p)) // param_with_default* && (d = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4688,7 +4757,7 @@ parameters_rule(Parser *p) if ( (a = slash_with_default_rule(p)) // slash_with_default && - (b = _loop0_38_rule(p)) // param_with_default* + (b = _loop0_39_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4716,9 +4785,9 @@ parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_39_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_40_rule(p)) // param_no_default+ && - (b = _loop0_40_rule(p)) // param_with_default* + (b = _loop0_41_rule(p)) // param_with_default* && (c = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4745,7 +4814,7 @@ parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_41_rule(p)) // param_with_default+ + (a = _loop1_42_rule(p)) // param_with_default+ && (b = star_etc_rule(p), !p->error_indicator) // star_etc? ) @@ -4817,7 +4886,7 @@ slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_42_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4846,7 +4915,7 @@ slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_43_rule(p)) // param_no_default+ + (a = (asdl_arg_seq*)_loop1_44_rule(p)) // param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4899,9 +4968,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_44_rule(p)) // param_no_default* + (a = _loop0_45_rule(p)) // param_no_default* && - (b = _loop1_45_rule(p)) // param_with_default+ + (b = _loop1_46_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -4931,9 +5000,9 @@ slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_46_rule(p)) // param_no_default* + (a = _loop0_47_rule(p)) // param_no_default* && - (b = _loop1_47_rule(p)) // param_with_default+ + (b = _loop1_48_rule(p)) // param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -5012,7 +5081,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_rule(p)) // param_no_default && - (b = _loop0_48_rule(p)) // param_maybe_default* + (b = _loop0_49_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5045,7 +5114,7 @@ star_etc_rule(Parser *p) && (a = param_no_default_star_annotation_rule(p)) // param_no_default_star_annotation && - (b = _loop0_49_rule(p)) // param_maybe_default* + (b = _loop0_50_rule(p)) // param_maybe_default* && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5078,7 +5147,7 @@ star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_50_rule(p)) // param_maybe_default+ + (b = _loop1_51_rule(p)) // param_maybe_default+ && (c = kwds_rule(p), !p->error_indicator) // kwds? ) @@ -5871,7 +5940,7 @@ if_stmt_rule(Parser *p) asdl_stmt_seq* b; stmt_ty c; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (a = named_expression_rule(p)) // named_expression && @@ -5916,7 +5985,7 @@ if_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (a = named_expression_rule(p)) // named_expression && @@ -6012,7 +6081,7 @@ elif_stmt_rule(Parser *p) asdl_stmt_seq* b; stmt_ty c; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (a = named_expression_rule(p)) // named_expression && @@ -6057,7 +6126,7 @@ elif_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (a = named_expression_rule(p)) // named_expression && @@ -6139,7 +6208,7 @@ else_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword = _PyPegen_expect_token(p, 645)) // token='else' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -6219,7 +6288,7 @@ while_stmt_rule(Parser *p) asdl_stmt_seq* b; void *c; if ( - (_keyword = _PyPegen_expect_token(p, 646)) // token='while' + (_keyword = _PyPegen_expect_token(p, 647)) // token='while' && (a = named_expression_rule(p)) // named_expression && @@ -6320,11 +6389,11 @@ for_stmt_rule(Parser *p) expr_ty t; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (t = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && @@ -6384,11 +6453,11 @@ for_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (t = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && @@ -6517,11 +6586,11 @@ with_stmt_rule(Parser *p) asdl_withitem_seq* a; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_51_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_52_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6566,9 +6635,9 @@ with_stmt_rule(Parser *p) asdl_stmt_seq* b; void *tc; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (a = (asdl_withitem_seq*)_gather_53_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_54_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6617,11 +6686,11 @@ with_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = (asdl_withitem_seq*)_gather_55_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_56_rule(p)) // ','.with_item+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -6669,9 +6738,9 @@ with_stmt_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (a = (asdl_withitem_seq*)_gather_57_rule(p)) // ','.with_item+ + (a = (asdl_withitem_seq*)_gather_58_rule(p)) // ','.with_item+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -6756,11 +6825,11 @@ with_item_rule(Parser *p) if ( (e = expression_rule(p)) // expression && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (t = star_target_rule(p)) // star_target && - _PyPegen_lookahead(1, _tmp_59_rule, p) + _PyPegen_lookahead(1, _tmp_60_rule, p) ) { D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); @@ -6882,7 +6951,7 @@ try_stmt_rule(Parser *p) asdl_stmt_seq* b; asdl_stmt_seq* f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -6926,13 +6995,13 @@ try_stmt_rule(Parser *p) asdl_excepthandler_seq* ex; void *f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_60_rule(p)) // except_block+ + (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -6974,13 +7043,13 @@ try_stmt_rule(Parser *p) asdl_excepthandler_seq* ex; void *f; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && (b = block_rule(p)) // block && - (ex = (asdl_excepthandler_seq*)_loop1_61_rule(p)) // except_star_block+ + (ex = (asdl_excepthandler_seq*)_loop1_62_rule(p)) // except_star_block+ && (el = else_block_rule(p), !p->error_indicator) // else_block? && @@ -7073,11 +7142,11 @@ except_block_rule(Parser *p) expr_ty e; void *t; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (e = expression_rule(p)) // expression && - (t = _tmp_62_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7116,7 +7185,7 @@ except_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* b; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7228,13 +7297,13 @@ except_star_block_rule(Parser *p) expr_ty e; void *t; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && (e = expression_rule(p)) // expression && - (t = _tmp_63_rule(p), !p->error_indicator) // ['as' NAME] + (t = _tmp_64_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -7331,7 +7400,7 @@ finally_block_rule(Parser *p) Token * _literal; asdl_stmt_seq* a; if ( - (_keyword = _PyPegen_expect_token(p, 632)) // token='finally' + (_keyword = _PyPegen_expect_token(p, 633)) // token='finally' && (_literal = _PyPegen_expect_forced_token(p, 11, ":")) // forced_token=':' && @@ -7406,7 +7475,7 @@ match_stmt_rule(Parser *p) && (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' && - (cases = (asdl_match_case_seq*)_loop1_64_rule(p)) // case_block+ + (cases = (asdl_match_case_seq*)_loop1_65_rule(p)) // case_block+ && (dedent_var = _PyPegen_expect_token(p, DEDENT)) // token='DEDENT' ) @@ -7643,7 +7712,7 @@ guard_rule(Parser *p) Token * _keyword; expr_ty guard; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (guard = named_expression_rule(p)) // named_expression ) @@ -7841,7 +7910,7 @@ as_pattern_rule(Parser *p) if ( (pattern = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (target = pattern_capture_target_rule(p)) // pattern_capture_target ) @@ -7924,7 +7993,7 @@ or_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> or_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); asdl_pattern_seq* patterns; if ( - (patterns = (asdl_pattern_seq*)_gather_65_rule(p)) // '|'.closed_pattern+ + (patterns = (asdl_pattern_seq*)_gather_66_rule(p)) // '|'.closed_pattern+ ) { D(fprintf(stderr, "%*c+ or_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|'.closed_pattern+")); @@ -8179,7 +8248,7 @@ literal_pattern_rule(Parser *p) if ( (value = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_67_rule, p) + _PyPegen_lookahead(0, _tmp_68_rule, p) ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -8278,7 +8347,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -8311,7 +8380,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -8344,7 +8413,7 @@ literal_pattern_rule(Parser *p) D(fprintf(stderr, "%*c> literal_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ literal_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -8414,7 +8483,7 @@ literal_expr_rule(Parser *p) if ( (signed_number_var = signed_number_rule(p)) // signed_number && - _PyPegen_lookahead(0, _tmp_68_rule, p) + _PyPegen_lookahead(0, _tmp_69_rule, p) ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "signed_number !('+' | '-')")); @@ -8471,7 +8540,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -8504,7 +8573,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -8537,7 +8606,7 @@ literal_expr_rule(Parser *p) D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -9021,7 +9090,7 @@ pattern_capture_target_rule(Parser *p) && (name = _PyPegen_name_token(p)) // NAME && - _PyPegen_lookahead(0, _tmp_69_rule, p) + _PyPegen_lookahead(0, _tmp_70_rule, p) ) { D(fprintf(stderr, "%*c+ pattern_capture_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!\"_\" NAME !('.' | '(' | '=')")); @@ -9138,7 +9207,7 @@ value_pattern_rule(Parser *p) if ( (attr = attr_rule(p)) // attr && - _PyPegen_lookahead(0, _tmp_70_rule, p) + _PyPegen_lookahead(0, _tmp_71_rule, p) ) { D(fprintf(stderr, "%*c+ value_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr !('.' | '(' | '=')")); @@ -9564,7 +9633,7 @@ maybe_sequence_pattern_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * patterns; if ( - (patterns = _gather_71_rule(p)) // ','.maybe_star_pattern+ + (patterns = _gather_72_rule(p)) // ','.maybe_star_pattern+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -9976,13 +10045,13 @@ items_pattern_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> items_pattern[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - asdl_seq * _gather_73_var; + asdl_seq * _gather_74_var; if ( - (_gather_73_var = _gather_73_rule(p)) // ','.key_value_pattern+ + (_gather_74_var = _gather_74_rule(p)) // ','.key_value_pattern+ ) { D(fprintf(stderr, "%*c+ items_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.key_value_pattern+")); - _res = _gather_73_var; + _res = _gather_74_var; goto done; } p->mark = _mark; @@ -10019,7 +10088,7 @@ key_value_pattern_rule(Parser *p) void *key; pattern_ty pattern; if ( - (key = _tmp_75_rule(p)) // literal_expr | attr + (key = _tmp_76_rule(p)) // literal_expr | attr && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -10350,7 +10419,7 @@ positional_patterns_rule(Parser *p) D(fprintf(stderr, "%*c> positional_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.pattern+")); asdl_pattern_seq* args; if ( - (args = (asdl_pattern_seq*)_gather_76_rule(p)) // ','.pattern+ + (args = (asdl_pattern_seq*)_gather_77_rule(p)) // ','.pattern+ ) { D(fprintf(stderr, "%*c+ positional_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.pattern+")); @@ -10392,13 +10461,13 @@ keyword_patterns_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> keyword_patterns[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - asdl_seq * _gather_78_var; + asdl_seq * _gather_79_var; if ( - (_gather_78_var = _gather_78_rule(p)) // ','.keyword_pattern+ + (_gather_79_var = _gather_79_rule(p)) // ','.keyword_pattern+ ) { D(fprintf(stderr, "%*c+ keyword_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+")); - _res = _gather_78_var; + _res = _gather_79_var; goto done; } p->mark = _mark; @@ -10497,7 +10566,7 @@ expressions_rule(Parser *p) if ( (a = expression_rule(p)) // expression && - (b = _loop1_80_rule(p)) // ((',' expression))+ + (b = _loop1_81_rule(p)) // ((',' expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -10669,11 +10738,11 @@ expression_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - (_keyword_1 = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword_1 = _PyPegen_expect_token(p, 645)) // token='else' && (c = expression_rule(p)) // expression ) @@ -10780,7 +10849,7 @@ yield_expr_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 573)) // token='yield' && - (_keyword_1 = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword_1 = _PyPegen_expect_token(p, 608)) // token='from' && (a = expression_rule(p)) // expression ) @@ -10888,7 +10957,7 @@ star_expressions_rule(Parser *p) if ( (a = star_expression_rule(p)) // star_expression && - (b = _loop1_81_rule(p)) // ((',' star_expression))+ + (b = _loop1_82_rule(p)) // ((',' star_expression))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11089,7 +11158,7 @@ star_named_expressions_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_82_rule(p)) // ','.star_named_expression+ + (a = (asdl_expr_seq*)_gather_83_rule(p)) // ','.star_named_expression+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -11389,7 +11458,7 @@ disjunction_rule(Parser *p) if ( (a = conjunction_rule(p)) // conjunction && - (b = _loop1_84_rule(p)) // (('or' conjunction))+ + (b = _loop1_85_rule(p)) // (('or' conjunction))+ ) { D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); @@ -11478,7 +11547,7 @@ conjunction_rule(Parser *p) if ( (a = inversion_rule(p)) // inversion && - (b = _loop1_85_rule(p)) // (('and' inversion))+ + (b = _loop1_86_rule(p)) // (('and' inversion))+ ) { D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); @@ -11652,7 +11721,7 @@ comparison_rule(Parser *p) if ( (a = bitwise_or_rule(p)) // bitwise_or && - (b = _loop1_86_rule(p)) // compare_op_bitwise_or_pair+ + (b = _loop1_87_rule(p)) // compare_op_bitwise_or_pair+ ) { D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); @@ -11989,10 +12058,10 @@ noteq_bitwise_or_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); - void *_tmp_87_var; + void *_tmp_88_var; expr_ty a; if ( - (_tmp_87_var = _tmp_87_rule(p)) // '!=' + (_tmp_88_var = _tmp_88_rule(p)) // '!=' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -12230,7 +12299,7 @@ notin_bitwise_or_rule(Parser *p) if ( (_keyword = _PyPegen_expect_token(p, 581)) // token='not' && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -12277,7 +12346,7 @@ in_bitwise_or_rule(Parser *p) Token * _keyword; expr_ty a; if ( - (_keyword = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword = _PyPegen_expect_token(p, 651)) // token='in' && (a = bitwise_or_rule(p)) // bitwise_or ) @@ -14027,7 +14096,7 @@ slices_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_88_rule(p)) // ','.(slice | starred_expression)+ + (a = (asdl_expr_seq*)_gather_89_rule(p)) // ','.(slice | starred_expression)+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -14100,7 +14169,7 @@ slice_rule(Parser *p) && (b = expression_rule(p), !p->error_indicator) // expression? && - (c = _tmp_90_rule(p), !p->error_indicator) // [':' expression?] + (c = _tmp_91_rule(p), !p->error_indicator) // [':' expression?] ) { D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); @@ -14160,7 +14229,7 @@ slice_rule(Parser *p) // | 'True' // | 'False' // | 'None' -// | &STRING strings +// | &(STRING | FSTRING_START) strings // | NUMBER // | &'(' (tuple | group | genexp) // | &'[' (list | listcomp) @@ -14215,7 +14284,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); @@ -14248,7 +14317,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); @@ -14281,7 +14350,7 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); @@ -14306,26 +14375,26 @@ atom_rule(Parser *p) D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } - { // &STRING strings + { // &(STRING | FSTRING_START) strings if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings")); expr_ty strings_var; if ( - _PyPegen_lookahead(1, _PyPegen_string_token, p) + _PyPegen_lookahead(1, _tmp_92_rule, p) && (strings_var = strings_rule(p)) // strings ) { - D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings")); _res = strings_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&STRING strings")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&(STRING | FSTRING_START) strings")); } { // NUMBER if (p->error_indicator) { @@ -14352,15 +14421,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - void *_tmp_91_var; + void *_tmp_93_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' && - (_tmp_91_var = _tmp_91_rule(p)) // tuple | group | genexp + (_tmp_93_var = _tmp_93_rule(p)) // tuple | group | genexp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); - _res = _tmp_91_var; + _res = _tmp_93_var; goto done; } p->mark = _mark; @@ -14373,15 +14442,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - void *_tmp_92_var; + void *_tmp_94_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' && - (_tmp_92_var = _tmp_92_rule(p)) // list | listcomp + (_tmp_94_var = _tmp_94_rule(p)) // list | listcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); - _res = _tmp_92_var; + _res = _tmp_94_var; goto done; } p->mark = _mark; @@ -14394,15 +14463,15 @@ atom_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - void *_tmp_93_var; + void *_tmp_95_var; if ( _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' && - (_tmp_93_var = _tmp_93_rule(p)) // dict | set | dictcomp | setcomp + (_tmp_95_var = _tmp_95_rule(p)) // dict | set | dictcomp | setcomp ) { D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); - _res = _tmp_93_var; + _res = _tmp_95_var; goto done; } p->mark = _mark; @@ -14474,7 +14543,7 @@ group_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_94_rule(p)) // yield_expr | named_expression + (a = _tmp_96_rule(p)) // yield_expr | named_expression && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -14551,7 +14620,7 @@ lambdef_rule(Parser *p) void *a; expr_ty b; if ( - (_keyword = _PyPegen_expect_token(p, 586)) // token='lambda' + (_keyword = _PyPegen_expect_token(p, 600)) // token='lambda' && (a = lambda_params_rule(p), !p->error_indicator) // lambda_params? && @@ -14678,9 +14747,9 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default && - (b = (asdl_arg_seq*)_loop0_95_rule(p)) // lambda_param_no_default* + (b = (asdl_arg_seq*)_loop0_97_rule(p)) // lambda_param_no_default* && - (c = _loop0_96_rule(p)) // lambda_param_with_default* + (c = _loop0_98_rule(p)) // lambda_param_with_default* && (d = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14710,7 +14779,7 @@ lambda_parameters_rule(Parser *p) if ( (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default && - (b = _loop0_97_rule(p)) // lambda_param_with_default* + (b = _loop0_99_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14738,9 +14807,9 @@ lambda_parameters_rule(Parser *p) asdl_seq * b; void *c; if ( - (a = (asdl_arg_seq*)_loop1_98_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_100_rule(p)) // lambda_param_no_default+ && - (b = _loop0_99_rule(p)) // lambda_param_with_default* + (b = _loop0_101_rule(p)) // lambda_param_with_default* && (c = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14767,7 +14836,7 @@ lambda_parameters_rule(Parser *p) asdl_seq * a; void *b; if ( - (a = _loop1_100_rule(p)) // lambda_param_with_default+ + (a = _loop1_102_rule(p)) // lambda_param_with_default+ && (b = lambda_star_etc_rule(p), !p->error_indicator) // lambda_star_etc? ) @@ -14841,7 +14910,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal_1; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_101_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_103_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14870,7 +14939,7 @@ lambda_slash_no_default_rule(Parser *p) Token * _literal; asdl_arg_seq* a; if ( - (a = (asdl_arg_seq*)_loop1_102_rule(p)) // lambda_param_no_default+ + (a = (asdl_arg_seq*)_loop1_104_rule(p)) // lambda_param_no_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14923,9 +14992,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_103_rule(p)) // lambda_param_no_default* + (a = _loop0_105_rule(p)) // lambda_param_no_default* && - (b = _loop1_104_rule(p)) // lambda_param_with_default+ + (b = _loop1_106_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -14955,9 +15024,9 @@ lambda_slash_with_default_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _loop0_105_rule(p)) // lambda_param_no_default* + (a = _loop0_107_rule(p)) // lambda_param_no_default* && - (b = _loop1_106_rule(p)) // lambda_param_with_default+ + (b = _loop1_108_rule(p)) // lambda_param_with_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -15035,7 +15104,7 @@ lambda_star_etc_rule(Parser *p) && (a = lambda_param_no_default_rule(p)) // lambda_param_no_default && - (b = _loop0_107_rule(p)) // lambda_param_maybe_default* + (b = _loop0_109_rule(p)) // lambda_param_maybe_default* && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15068,7 +15137,7 @@ lambda_star_etc_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _loop1_108_rule(p)) // lambda_param_maybe_default+ + (b = _loop1_110_rule(p)) // lambda_param_maybe_default+ && (c = lambda_kwds_rule(p), !p->error_indicator) // lambda_kwds? ) @@ -15475,7 +15544,387 @@ lambda_param_rule(Parser *p) return _res; } -// strings: STRING+ +// fstring_middle: fstring_replacement_field | FSTRING_MIDDLE +static expr_ty +fstring_middle_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_middle[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_middle[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_middle[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_middle[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * t; + if ( + (t = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ fstring_middle[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = _PyPegen_constant_from_token ( p , t ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_middle[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_replacement_field: +// | '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' +// | invalid_replacement_field +static expr_ty +fstring_replacement_field_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' (yield_expr | star_expressions) "="? fstring_conversion? fstring_full_format_spec? '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + Token * _literal; + Token * _literal_1; + void *a; + void *conversion; + void *debug_expr; + void *format; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _tmp_111_rule(p)) // yield_expr | star_expressions + && + (debug_expr = _PyPegen_expect_token(p, 22), !p->error_indicator) // "="? + && + (conversion = fstring_conversion_rule(p), !p->error_indicator) // fstring_conversion? + && + (format = fstring_full_format_spec_rule(p), !p->error_indicator) // fstring_full_format_spec? + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_formatted_value ( p , a , debug_expr , conversion , format , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) \"=\"? fstring_conversion? fstring_full_format_spec? '}'")); + } + if (p->call_invalid_rules) { // invalid_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_replacement_field")); + void *invalid_replacement_field_var; + if ( + (invalid_replacement_field_var = invalid_replacement_field_rule(p)) // invalid_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_replacement_field")); + _res = invalid_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_conversion: "!" NAME +static expr_ty +fstring_conversion_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // "!" NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_conversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "\"!\" NAME")); + expr_ty conv; + Token * conv_token; + if ( + (conv_token = _PyPegen_expect_token(p, 54)) // token='!' + && + (conv = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ fstring_conversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "\"!\" NAME")); + _res = _PyPegen_check_fstring_conversion ( p , conv_token , conv ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_conversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "\"!\" NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_full_format_spec: ':' fstring_format_spec* +static expr_ty +fstring_full_format_spec_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ':' fstring_format_spec* + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_full_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' fstring_format_spec*")); + Token * _literal; + asdl_seq * spec; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (spec = _loop0_112_rule(p)) // fstring_format_spec* + ) + { + D(fprintf(stderr, "%*c+ fstring_full_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' fstring_format_spec*")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = spec ? _PyAST_JoinedStr ( ( asdl_expr_seq* ) spec , EXTRA ) : NULL; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_full_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' fstring_format_spec*")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// fstring_format_spec: FSTRING_MIDDLE | fstring_replacement_field +static expr_ty +fstring_format_spec_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * t; + if ( + (t = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ fstring_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = _PyPegen_constant_from_token ( p , t ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> fstring_format_spec[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ fstring_format_spec[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring_format_spec[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// string: STRING +static expr_ty +string_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // STRING + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> string[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + Token* s; + if ( + (s = (Token*)_PyPegen_string_token(p)) // STRING + ) + { + D(fprintf(stderr, "%*c+ string[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); + _res = _PyPegen_constant_from_string ( p , s ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s string[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// strings: ((fstring | string))+ static expr_ty strings_rule(Parser *p) { @@ -15493,19 +15942,37 @@ strings_rule(Parser *p) return _res; } int _mark = p->mark; - { // STRING+ + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + p->level--; + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ((fstring | string))+ if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING+")); - asdl_seq * a; + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); + asdl_expr_seq* a; if ( - (a = _loop1_109_rule(p)) // STRING+ + (a = (asdl_expr_seq*)_loop1_113_rule(p)) // ((fstring | string))+ ) { - D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING+")); - _res = _PyPegen_concatenate_strings ( p , a ); + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + p->level--; + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_concatenate_strings ( p , a , EXTRA ); if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; p->level--; @@ -15515,7 +15982,7 @@ strings_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING+")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string))+")); } _res = NULL; done: @@ -15627,7 +16094,7 @@ tuple_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_110_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] + (a = _tmp_114_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?] && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) @@ -15845,7 +16312,7 @@ double_starred_kvpairs_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_seq * a; if ( - (a = _gather_111_rule(p)) // ','.double_starred_kvpair+ + (a = _gather_115_rule(p)) // ','.double_starred_kvpair+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -16007,7 +16474,7 @@ for_if_clauses_rule(Parser *p) D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); asdl_comprehension_seq* a; if ( - (a = (asdl_comprehension_seq*)_loop1_113_rule(p)) // for_if_clause+ + (a = (asdl_comprehension_seq*)_loop1_117_rule(p)) // for_if_clause+ ) { D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); @@ -16062,17 +16529,17 @@ for_if_clause_rule(Parser *p) if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_114_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_118_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -16105,17 +16572,17 @@ for_if_clause_rule(Parser *p) expr_ty b; asdl_expr_seq* c; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (_cut_var = 1) && (b = disjunction_rule(p)) // disjunction && - (c = (asdl_expr_seq*)_loop0_115_rule(p)) // (('if' disjunction))* + (c = (asdl_expr_seq*)_loop0_119_rule(p)) // (('if' disjunction))* ) { D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); @@ -16378,7 +16845,7 @@ genexp_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (a = _tmp_116_rule(p)) // assignment_expression | expression !':=' + (a = _tmp_120_rule(p)) // assignment_expression | expression !':=' && (b = for_if_clauses_rule(p)) // for_if_clauses && @@ -16630,9 +17097,9 @@ args_rule(Parser *p) asdl_expr_seq* a; void *b; if ( - (a = (asdl_expr_seq*)_gather_117_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ + (a = (asdl_expr_seq*)_gather_121_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ && - (b = _tmp_119_rule(p), !p->error_indicator) // [',' kwargs] + (b = _tmp_123_rule(p), !p->error_indicator) // [',' kwargs] ) { D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ [',' kwargs]")); @@ -16723,11 +17190,11 @@ kwargs_rule(Parser *p) asdl_seq * a; asdl_seq * b; if ( - (a = _gather_120_rule(p)) // ','.kwarg_or_starred+ + (a = _gather_124_rule(p)) // ','.kwarg_or_starred+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (b = _gather_122_rule(p)) // ','.kwarg_or_double_starred+ + (b = _gather_126_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); @@ -16749,13 +17216,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - asdl_seq * _gather_124_var; + asdl_seq * _gather_128_var; if ( - (_gather_124_var = _gather_124_rule(p)) // ','.kwarg_or_starred+ + (_gather_128_var = _gather_128_rule(p)) // ','.kwarg_or_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); - _res = _gather_124_var; + _res = _gather_128_var; goto done; } p->mark = _mark; @@ -16768,13 +17235,13 @@ kwargs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - asdl_seq * _gather_126_var; + asdl_seq * _gather_130_var; if ( - (_gather_126_var = _gather_126_rule(p)) // ','.kwarg_or_double_starred+ + (_gather_130_var = _gather_130_rule(p)) // ','.kwarg_or_double_starred+ ) { D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); - _res = _gather_126_var; + _res = _gather_130_var; goto done; } p->mark = _mark; @@ -17167,7 +17634,7 @@ star_targets_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop0_128_rule(p)) // ((',' star_target))* + (b = _loop0_132_rule(p)) // ((',' star_target))* && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17224,7 +17691,7 @@ star_targets_list_seq_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_129_rule(p)) // ','.star_target+ + (a = (asdl_expr_seq*)_gather_133_rule(p)) // ','.star_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17275,7 +17742,7 @@ star_targets_tuple_seq_rule(Parser *p) if ( (a = star_target_rule(p)) // star_target && - (b = _loop1_131_rule(p)) // ((',' star_target))+ + (b = _loop1_135_rule(p)) // ((',' star_target))+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -17364,7 +17831,7 @@ star_target_rule(Parser *p) if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (a = _tmp_132_rule(p)) // !'*' star_target + (a = _tmp_136_rule(p)) // !'*' star_target ) { D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); @@ -18295,7 +18762,7 @@ del_targets_rule(Parser *p) UNUSED(_opt_var); // Silence compiler warnings asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_133_rule(p)) // ','.del_target+ + (a = (asdl_expr_seq*)_gather_137_rule(p)) // ','.del_target+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? ) @@ -18656,7 +19123,7 @@ type_expressions_rule(Parser *p) expr_ty b; expr_ty c; if ( - (a = _gather_135_rule(p)) // ','.expression+ + (a = _gather_139_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18695,7 +19162,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_137_rule(p)) // ','.expression+ + (a = _gather_141_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18728,7 +19195,7 @@ type_expressions_rule(Parser *p) asdl_seq * a; expr_ty b; if ( - (a = _gather_139_rule(p)) // ','.expression+ + (a = _gather_143_rule(p)) // ','.expression+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -18848,7 +19315,7 @@ type_expressions_rule(Parser *p) D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); asdl_expr_seq* a; if ( - (a = (asdl_expr_seq*)_gather_141_rule(p)) // ','.expression+ + (a = (asdl_expr_seq*)_gather_145_rule(p)) // ','.expression+ ) { D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); @@ -18900,7 +19367,7 @@ func_type_comment_rule(Parser *p) && (t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' && - _PyPegen_lookahead(1, _tmp_143_rule, p) + _PyPegen_lookahead(1, _tmp_147_rule, p) ) { D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); @@ -19029,7 +19496,7 @@ invalid_arguments_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_opt_var = _tmp_144_rule(p), !p->error_indicator) // [args | expression for_if_clauses] + (_opt_var = _tmp_148_rule(p), !p->error_indicator) // [args | expression for_if_clauses] ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); @@ -19089,13 +19556,13 @@ invalid_arguments_rule(Parser *p) expr_ty a; Token * b; if ( - (_opt_var = _tmp_145_rule(p), !p->error_indicator) // [(args ',')] + (_opt_var = _tmp_149_rule(p), !p->error_indicator) // [(args ',')] && (a = _PyPegen_name_token(p)) // NAME && (b = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_146_rule, p) + _PyPegen_lookahead(1, _tmp_150_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "[(args ',')] NAME '=' &(',' | ')')")); @@ -19234,7 +19701,7 @@ invalid_kwarg_rule(Parser *p) Token* a; Token * b; if ( - (a = (Token*)_tmp_147_rule(p)) // 'True' | 'False' | 'None' + (a = (Token*)_tmp_151_rule(p)) // 'True' | 'False' | 'None' && (b = _PyPegen_expect_token(p, 22)) // token='=' ) @@ -19294,7 +19761,7 @@ invalid_kwarg_rule(Parser *p) expr_ty a; Token * b; if ( - _PyPegen_lookahead(0, _tmp_148_rule, p) + _PyPegen_lookahead(0, _tmp_152_rule, p) && (a = expression_rule(p)) // expression && @@ -19398,11 +19865,11 @@ expression_without_invalid_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - (_keyword_1 = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword_1 = _PyPegen_expect_token(p, 645)) // token='else' && (c = expression_rule(p)) // expression ) @@ -19530,6 +19997,7 @@ invalid_legacy_expression_rule(Parser *p) // invalid_expression: // | !(NAME STRING | SOFT_KEYWORD) disjunction expression_without_invalid // | disjunction 'if' disjunction !('else' | ':') +// | 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) static void * invalid_expression_rule(Parser *p) { @@ -19552,7 +20020,7 @@ invalid_expression_rule(Parser *p) expr_ty a; expr_ty b; if ( - _PyPegen_lookahead(0, _tmp_149_rule, p) + _PyPegen_lookahead(0, _tmp_153_rule, p) && (a = disjunction_rule(p)) // disjunction && @@ -19584,11 +20052,11 @@ invalid_expression_rule(Parser *p) if ( (a = disjunction_rule(p)) // disjunction && - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (b = disjunction_rule(p)) // disjunction && - _PyPegen_lookahead(0, _tmp_150_rule, p) + _PyPegen_lookahead(0, _tmp_154_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); @@ -19604,6 +20072,39 @@ invalid_expression_rule(Parser *p) D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')")); } + { // 'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + Token * a; + Token * b; + if ( + (a = _PyPegen_expect_token(p, 600)) // token='lambda' + && + (_opt_var = lambda_params_rule(p), !p->error_indicator) // lambda_params? + && + (b = _PyPegen_expect_token(p, 11)) // token=':' + && + _PyPegen_lookahead(1, _tmp_155_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( a , b , "f-string: lambda expressions are not allowed without parentheses" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' &(FSTRING_MIDDLE | fstring_replacement_field)")); + } _res = NULL; done: p->level--; @@ -19677,7 +20178,7 @@ invalid_named_expression_rule(Parser *p) && (b = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_151_rule, p) + _PyPegen_lookahead(0, _tmp_156_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' bitwise_or !('=' | ':=')")); @@ -19703,7 +20204,7 @@ invalid_named_expression_rule(Parser *p) Token * b; expr_ty bitwise_or_var; if ( - _PyPegen_lookahead(0, _tmp_152_rule, p) + _PyPegen_lookahead(0, _tmp_157_rule, p) && (a = bitwise_or_rule(p)) // bitwise_or && @@ -19711,7 +20212,7 @@ invalid_named_expression_rule(Parser *p) && (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or && - _PyPegen_lookahead(0, _tmp_153_rule, p) + _PyPegen_lookahead(0, _tmp_158_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!(list | tuple | genexp | 'True' | 'None' | 'False') bitwise_or '=' bitwise_or !('=' | ':=')")); @@ -19792,7 +20293,7 @@ invalid_assignment_rule(Parser *p) D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); Token * _literal; Token * _literal_1; - asdl_seq * _loop0_154_var; + asdl_seq * _loop0_159_var; expr_ty a; expr_ty expression_var; if ( @@ -19800,7 +20301,7 @@ invalid_assignment_rule(Parser *p) && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_loop0_154_var = _loop0_154_rule(p)) // star_named_expressions* + (_loop0_159_var = _loop0_159_rule(p)) // star_named_expressions* && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -19857,10 +20358,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); Token * _literal; - asdl_seq * _loop0_155_var; + asdl_seq * _loop0_160_var; expr_ty a; if ( - (_loop0_155_var = _loop0_155_rule(p)) // ((star_targets '='))* + (_loop0_160_var = _loop0_160_rule(p)) // ((star_targets '='))* && (a = star_expressions_rule(p)) // star_expressions && @@ -19887,10 +20388,10 @@ invalid_assignment_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); Token * _literal; - asdl_seq * _loop0_156_var; + asdl_seq * _loop0_161_var; expr_ty a; if ( - (_loop0_156_var = _loop0_156_rule(p)) // ((star_targets '='))* + (_loop0_161_var = _loop0_161_rule(p)) // ((star_targets '='))* && (a = yield_expr_rule(p)) // yield_expr && @@ -19916,7 +20417,7 @@ invalid_assignment_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); - void *_tmp_157_var; + void *_tmp_162_var; expr_ty a; AugOperator* augassign_var; if ( @@ -19924,7 +20425,7 @@ invalid_assignment_rule(Parser *p) && (augassign_var = augassign_rule(p)) // augassign && - (_tmp_157_var = _tmp_157_rule(p)) // yield_expr | star_expressions + (_tmp_162_var = _tmp_162_rule(p)) // yield_expr | star_expressions ) { D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); @@ -20057,7 +20558,7 @@ invalid_del_stmt_rule(Parser *p) Token * _keyword; expr_ty a; if ( - (_keyword = _PyPegen_expect_token(p, 603)) // token='del' + (_keyword = _PyPegen_expect_token(p, 604)) // token='del' && (a = star_expressions_rule(p)) // star_expressions ) @@ -20150,11 +20651,11 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); - void *_tmp_158_var; + void *_tmp_163_var; expr_ty a; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_158_var = _tmp_158_rule(p)) // '[' | '(' | '{' + (_tmp_163_var = _tmp_163_rule(p)) // '[' | '(' | '{' && (a = starred_expression_rule(p)) // starred_expression && @@ -20181,12 +20682,12 @@ invalid_comprehension_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' star_named_expressions for_if_clauses")); Token * _literal; - void *_tmp_159_var; + void *_tmp_164_var; expr_ty a; asdl_expr_seq* b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_159_var = _tmp_159_rule(p)) // '[' | '{' + (_tmp_164_var = _tmp_164_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -20216,12 +20717,12 @@ invalid_comprehension_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '{') star_named_expression ',' for_if_clauses")); - void *_tmp_160_var; + void *_tmp_165_var; expr_ty a; Token * b; asdl_comprehension_seq* for_if_clauses_var; if ( - (_tmp_160_var = _tmp_160_rule(p)) // '[' | '{' + (_tmp_165_var = _tmp_165_rule(p)) // '[' | '{' && (a = star_named_expression_rule(p)) // star_named_expression && @@ -20358,13 +20859,13 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slash_no_default | slash_with_default) param_maybe_default* '/'")); - asdl_seq * _loop0_162_var; - void *_tmp_161_var; + asdl_seq * _loop0_167_var; + void *_tmp_166_var; Token * a; if ( - (_tmp_161_var = _tmp_161_rule(p)) // slash_no_default | slash_with_default + (_tmp_166_var = _tmp_166_rule(p)) // slash_no_default | slash_with_default && - (_loop0_162_var = _loop0_162_rule(p)) // param_maybe_default* + (_loop0_167_var = _loop0_167_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20388,7 +20889,7 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default? param_no_default* invalid_parameters_helper param_no_default")); - asdl_seq * _loop0_163_var; + asdl_seq * _loop0_168_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -20396,7 +20897,7 @@ invalid_parameters_rule(Parser *p) if ( (_opt_var = slash_no_default_rule(p), !p->error_indicator) // slash_no_default? && - (_loop0_163_var = _loop0_163_rule(p)) // param_no_default* + (_loop0_168_var = _loop0_168_rule(p)) // param_no_default* && (invalid_parameters_helper_var = invalid_parameters_helper_rule(p)) // invalid_parameters_helper && @@ -20422,18 +20923,18 @@ invalid_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* '(' param_no_default+ ','? ')'")); - asdl_seq * _loop0_164_var; - asdl_seq * _loop1_165_var; + asdl_seq * _loop0_169_var; + asdl_seq * _loop1_170_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_164_var = _loop0_164_rule(p)) // param_no_default* + (_loop0_169_var = _loop0_169_rule(p)) // param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_loop1_165_var = _loop1_165_rule(p)) // param_no_default+ + (_loop1_170_var = _loop1_170_rule(p)) // param_no_default+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -20460,22 +20961,22 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(slash_no_default | slash_with_default)] param_maybe_default* '*' (',' | param_no_default) param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_167_var; - asdl_seq * _loop0_169_var; + asdl_seq * _loop0_172_var; + asdl_seq * _loop0_174_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_168_var; + void *_tmp_173_var; Token * a; if ( - (_opt_var = _tmp_166_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] + (_opt_var = _tmp_171_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)] && - (_loop0_167_var = _loop0_167_rule(p)) // param_maybe_default* + (_loop0_172_var = _loop0_172_rule(p)) // param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_168_var = _tmp_168_rule(p)) // ',' | param_no_default + (_tmp_173_var = _tmp_173_rule(p)) // ',' | param_no_default && - (_loop0_169_var = _loop0_169_rule(p)) // param_maybe_default* + (_loop0_174_var = _loop0_174_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20500,10 +21001,10 @@ invalid_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_170_var; + asdl_seq * _loop1_175_var; Token * a; if ( - (_loop1_170_var = _loop1_170_rule(p)) // param_maybe_default+ + (_loop1_175_var = _loop1_175_rule(p)) // param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -20553,7 +21054,7 @@ invalid_default_rule(Parser *p) if ( (a = _PyPegen_expect_token(p, 22)) // token='=' && - _PyPegen_lookahead(1, _tmp_171_rule, p) + _PyPegen_lookahead(1, _tmp_176_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' &(')' | ',')")); @@ -20599,12 +21100,12 @@ invalid_star_etc_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); - void *_tmp_172_var; + void *_tmp_177_var; Token * a; if ( (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_172_var = _tmp_172_rule(p)) // ')' | ',' (')' | '**') + (_tmp_177_var = _tmp_177_rule(p)) // ')' | ',' (')' | '**') ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); @@ -20687,20 +21188,20 @@ invalid_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_174_var; - void *_tmp_173_var; - void *_tmp_175_var; + asdl_seq * _loop0_179_var; + void *_tmp_178_var; + void *_tmp_180_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_173_var = _tmp_173_rule(p)) // param_no_default | ',' + (_tmp_178_var = _tmp_178_rule(p)) // param_no_default | ',' && - (_loop0_174_var = _loop0_174_rule(p)) // param_maybe_default* + (_loop0_179_var = _loop0_179_rule(p)) // param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_175_var = _tmp_175_rule(p)) // param_no_default | ',' + (_tmp_180_var = _tmp_180_rule(p)) // param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (param_no_default | ',') param_maybe_default* '*' (param_no_default | ',')")); @@ -20816,7 +21317,7 @@ invalid_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_176_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_181_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param ',' ('*' | '**' | '/')")); @@ -20882,13 +21383,13 @@ invalid_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - asdl_seq * _loop1_177_var; + asdl_seq * _loop1_182_var; if ( - (_loop1_177_var = _loop1_177_rule(p)) // param_with_default+ + (_loop1_182_var = _loop1_182_rule(p)) // param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); - _res = _loop1_177_var; + _res = _loop1_182_var; goto done; } p->mark = _mark; @@ -20954,13 +21455,13 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(lambda_slash_no_default | lambda_slash_with_default) lambda_param_maybe_default* '/'")); - asdl_seq * _loop0_179_var; - void *_tmp_178_var; + asdl_seq * _loop0_184_var; + void *_tmp_183_var; Token * a; if ( - (_tmp_178_var = _tmp_178_rule(p)) // lambda_slash_no_default | lambda_slash_with_default + (_tmp_183_var = _tmp_183_rule(p)) // lambda_slash_no_default | lambda_slash_with_default && - (_loop0_179_var = _loop0_179_rule(p)) // lambda_param_maybe_default* + (_loop0_184_var = _loop0_184_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -20984,7 +21485,7 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default? lambda_param_no_default* invalid_lambda_parameters_helper lambda_param_no_default")); - asdl_seq * _loop0_180_var; + asdl_seq * _loop0_185_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings arg_ty a; @@ -20992,7 +21493,7 @@ invalid_lambda_parameters_rule(Parser *p) if ( (_opt_var = lambda_slash_no_default_rule(p), !p->error_indicator) // lambda_slash_no_default? && - (_loop0_180_var = _loop0_180_rule(p)) // lambda_param_no_default* + (_loop0_185_var = _loop0_185_rule(p)) // lambda_param_no_default* && (invalid_lambda_parameters_helper_var = invalid_lambda_parameters_helper_rule(p)) // invalid_lambda_parameters_helper && @@ -21018,18 +21519,18 @@ invalid_lambda_parameters_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* '(' ','.lambda_param+ ','? ')'")); - asdl_seq * _gather_182_var; - asdl_seq * _loop0_181_var; + asdl_seq * _gather_187_var; + asdl_seq * _loop0_186_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; if ( - (_loop0_181_var = _loop0_181_rule(p)) // lambda_param_no_default* + (_loop0_186_var = _loop0_186_rule(p)) // lambda_param_no_default* && (a = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_182_var = _gather_182_rule(p)) // ','.lambda_param+ + (_gather_187_var = _gather_187_rule(p)) // ','.lambda_param+ && (_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21056,22 +21557,22 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "[(lambda_slash_no_default | lambda_slash_with_default)] lambda_param_maybe_default* '*' (',' | lambda_param_no_default) lambda_param_maybe_default* '/'")); Token * _literal; - asdl_seq * _loop0_185_var; - asdl_seq * _loop0_187_var; + asdl_seq * _loop0_190_var; + asdl_seq * _loop0_192_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings - void *_tmp_186_var; + void *_tmp_191_var; Token * a; if ( - (_opt_var = _tmp_184_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] + (_opt_var = _tmp_189_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)] && - (_loop0_185_var = _loop0_185_rule(p)) // lambda_param_maybe_default* + (_loop0_190_var = _loop0_190_rule(p)) // lambda_param_maybe_default* && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_186_var = _tmp_186_rule(p)) // ',' | lambda_param_no_default + (_tmp_191_var = _tmp_191_rule(p)) // ',' | lambda_param_no_default && - (_loop0_187_var = _loop0_187_rule(p)) // lambda_param_maybe_default* + (_loop0_192_var = _loop0_192_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 17)) // token='/' ) @@ -21096,10 +21597,10 @@ invalid_lambda_parameters_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default+ '/' '*'")); Token * _literal; - asdl_seq * _loop1_188_var; + asdl_seq * _loop1_193_var; Token * a; if ( - (_loop1_188_var = _loop1_188_rule(p)) // lambda_param_maybe_default+ + (_loop1_193_var = _loop1_193_rule(p)) // lambda_param_maybe_default+ && (_literal = _PyPegen_expect_token(p, 17)) // token='/' && @@ -21171,13 +21672,13 @@ invalid_lambda_parameters_helper_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_lambda_parameters_helper[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - asdl_seq * _loop1_189_var; + asdl_seq * _loop1_194_var; if ( - (_loop1_189_var = _loop1_189_rule(p)) // lambda_param_with_default+ + (_loop1_194_var = _loop1_194_rule(p)) // lambda_param_with_default+ ) { D(fprintf(stderr, "%*c+ invalid_lambda_parameters_helper[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); - _res = _loop1_189_var; + _res = _loop1_194_var; goto done; } p->mark = _mark; @@ -21214,11 +21715,11 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); Token * _literal; - void *_tmp_190_var; + void *_tmp_195_var; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_190_var = _tmp_190_rule(p)) // ':' | ',' (':' | '**') + (_tmp_195_var = _tmp_195_rule(p)) // ':' | ',' (':' | '**') ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); @@ -21271,20 +21772,20 @@ invalid_lambda_star_etc_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); Token * _literal; - asdl_seq * _loop0_192_var; - void *_tmp_191_var; - void *_tmp_193_var; + asdl_seq * _loop0_197_var; + void *_tmp_196_var; + void *_tmp_198_var; Token * a; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_191_var = _tmp_191_rule(p)) // lambda_param_no_default | ',' + (_tmp_196_var = _tmp_196_rule(p)) // lambda_param_no_default | ',' && - (_loop0_192_var = _loop0_192_rule(p)) // lambda_param_maybe_default* + (_loop0_197_var = _loop0_197_rule(p)) // lambda_param_maybe_default* && (a = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_193_var = _tmp_193_rule(p)) // lambda_param_no_default | ',' + (_tmp_198_var = _tmp_198_rule(p)) // lambda_param_no_default | ',' ) { D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (lambda_param_no_default | ',') lambda_param_maybe_default* '*' (lambda_param_no_default | ',')")); @@ -21403,7 +21904,7 @@ invalid_lambda_kwds_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' && - (a = (Token*)_tmp_194_rule(p)) // '*' | '**' | '/' + (a = (Token*)_tmp_199_rule(p)) // '*' | '**' | '/' ) { D(fprintf(stderr, "%*c+ invalid_lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param ',' ('*' | '**' | '/')")); @@ -21507,11 +22008,11 @@ invalid_with_item_rule(Parser *p) if ( (expression_var = expression_rule(p)) // expression && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (a = expression_rule(p)) // expression && - _PyPegen_lookahead(1, _tmp_195_rule, p) + _PyPegen_lookahead(1, _tmp_200_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression &(',' | ')' | ':')")); @@ -21560,7 +22061,7 @@ invalid_for_target_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (a = star_expressions_rule(p)) // star_expressions ) @@ -21692,11 +22193,11 @@ invalid_import_rule(Parser *p) expr_ty dotted_name_var; expr_ty dotted_name_var_1; if ( - (a = _PyPegen_expect_token(p, 606)) // token='import' + (a = _PyPegen_expect_token(p, 607)) // token='import' && (dotted_name_var = dotted_name_rule(p)) // dotted_name && - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && (dotted_name_var_1 = dotted_name_rule(p)) // dotted_name ) @@ -21792,7 +22293,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ NEWLINE")); - asdl_seq * _gather_196_var; + asdl_seq * _gather_201_var; Token * _keyword; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -21800,9 +22301,9 @@ invalid_with_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && - (_gather_196_var = _gather_196_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_201_var = _gather_201_rule(p)) // ','.(expression ['as' star_target])+ && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -21826,7 +22327,7 @@ invalid_with_stmt_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE")); - asdl_seq * _gather_198_var; + asdl_seq * _gather_203_var; Token * _keyword; Token * _literal; Token * _literal_1; @@ -21838,11 +22339,11 @@ invalid_with_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_198_var = _gather_198_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_203_var = _gather_203_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -21892,7 +22393,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT")); - asdl_seq * _gather_200_var; + asdl_seq * _gather_205_var; Token * _literal; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings @@ -21901,9 +22402,9 @@ invalid_with_stmt_indent_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 614)) // token='with' + (a = _PyPegen_expect_token(p, 615)) // token='with' && - (_gather_200_var = _gather_200_rule(p)) // ','.(expression ['as' star_target])+ + (_gather_205_var = _gather_205_rule(p)) // ','.(expression ['as' star_target])+ && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -21931,7 +22432,7 @@ invalid_with_stmt_indent_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_with_stmt_indent[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT")); - asdl_seq * _gather_202_var; + asdl_seq * _gather_207_var; Token * _literal; Token * _literal_1; Token * _literal_2; @@ -21944,11 +22445,11 @@ invalid_with_stmt_indent_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 614)) // token='with' + (a = _PyPegen_expect_token(p, 615)) // token='with' && (_literal = _PyPegen_expect_token(p, 7)) // token='(' && - (_gather_202_var = _gather_202_rule(p)) // ','.(expressions ['as' star_target])+ + (_gather_207_var = _gather_207_rule(p)) // ','.(expressions ['as' star_target])+ && (_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','? && @@ -22008,7 +22509,7 @@ invalid_try_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 623)) // token='try' + (a = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22040,13 +22541,13 @@ invalid_try_stmt_rule(Parser *p) Token * _literal; asdl_stmt_seq* block_var; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && (block_var = block_rule(p)) // block && - _PyPegen_lookahead(0, _tmp_204_rule, p) + _PyPegen_lookahead(0, _tmp_209_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block !('except' | 'finally')")); @@ -22071,29 +22572,29 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_205_var; - asdl_seq * _loop1_206_var; + asdl_seq * _loop0_210_var; + asdl_seq * _loop1_211_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; Token * b; expr_ty expression_var; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_205_var = _loop0_205_rule(p)) // block* + (_loop0_210_var = _loop0_210_rule(p)) // block* && - (_loop1_206_var = _loop1_206_rule(p)) // except_block+ + (_loop1_211_var = _loop1_211_rule(p)) // except_block+ && - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (b = _PyPegen_expect_token(p, 16)) // token='*' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_207_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_212_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22120,23 +22621,23 @@ invalid_try_stmt_rule(Parser *p) Token * _keyword; Token * _literal; Token * _literal_1; - asdl_seq * _loop0_208_var; - asdl_seq * _loop1_209_var; + asdl_seq * _loop0_213_var; + asdl_seq * _loop1_214_var; void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings Token * a; if ( - (_keyword = _PyPegen_expect_token(p, 623)) // token='try' + (_keyword = _PyPegen_expect_token(p, 624)) // token='try' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && - (_loop0_208_var = _loop0_208_rule(p)) // block* + (_loop0_213_var = _loop0_213_rule(p)) // block* && - (_loop1_209_var = _loop1_209_rule(p)) // except_star_block+ + (_loop1_214_var = _loop1_214_rule(p)) // except_star_block+ && - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && - (_opt_var = _tmp_210_rule(p), !p->error_indicator) // [expression ['as' NAME]] + (_opt_var = _tmp_215_rule(p), !p->error_indicator) // [expression ['as' NAME]] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22194,7 +22695,7 @@ invalid_except_stmt_rule(Parser *p) expr_ty a; expr_ty expressions_var; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' && (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator) // '*'? && @@ -22204,7 +22705,7 @@ invalid_except_stmt_rule(Parser *p) && (expressions_var = expressions_rule(p)) // expressions && - (_opt_var_1 = _tmp_211_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_216_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' ) @@ -22236,13 +22737,13 @@ invalid_except_stmt_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_opt_var = _PyPegen_expect_token(p, 16), !p->error_indicator) // '*'? && (expression_var = expression_rule(p)) // expression && - (_opt_var_1 = _tmp_212_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var_1 = _tmp_217_rule(p), !p->error_indicator) // ['as' NAME] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -22269,7 +22770,7 @@ invalid_except_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -22294,14 +22795,14 @@ invalid_except_stmt_rule(Parser *p) } D(fprintf(stderr, "%*c> invalid_except_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); Token * _literal; - void *_tmp_213_var; + void *_tmp_218_var; Token * a; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && - (_tmp_213_var = _tmp_213_rule(p)) // NEWLINE | ':' + (_tmp_218_var = _tmp_218_rule(p)) // NEWLINE | ':' ) { D(fprintf(stderr, "%*c+ invalid_except_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')")); @@ -22347,7 +22848,7 @@ invalid_finally_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 632)) // token='finally' + (a = _PyPegen_expect_token(p, 633)) // token='finally' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22404,11 +22905,11 @@ invalid_except_stmt_indent_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_214_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_219_rule(p), !p->error_indicator) // ['as' NAME] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22440,7 +22941,7 @@ invalid_except_stmt_indent_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22497,13 +22998,13 @@ invalid_except_star_stmt_indent_rule(Parser *p) expr_ty expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 636)) // token='except' + (a = _PyPegen_expect_token(p, 637)) // token='except' && (_literal = _PyPegen_expect_token(p, 16)) // token='*' && (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_215_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_220_rule(p), !p->error_indicator) // ['as' NAME] && (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -22739,7 +23240,7 @@ invalid_as_pattern_rule(Parser *p) if ( (or_pattern_var = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (a = _PyPegen_expect_soft_keyword(p, "_")) // soft_keyword='"_"' ) @@ -22769,7 +23270,7 @@ invalid_as_pattern_rule(Parser *p) if ( (or_pattern_var = or_pattern_rule(p)) // or_pattern && - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && _PyPegen_lookahead_with_name(0, _PyPegen_name_token, p) && @@ -22872,7 +23373,7 @@ invalid_class_argument_pattern_rule(Parser *p) asdl_pattern_seq* a; asdl_seq* keyword_patterns_var; if ( - (_opt_var = _tmp_216_rule(p), !p->error_indicator) // [positional_patterns ','] + (_opt_var = _tmp_221_rule(p), !p->error_indicator) // [positional_patterns ','] && (keyword_patterns_var = keyword_patterns_rule(p)) // keyword_patterns && @@ -22926,7 +23427,7 @@ invalid_if_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -22957,7 +23458,7 @@ invalid_if_stmt_rule(Parser *p) expr_ty a_1; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 641)) // token='if' + (a = _PyPegen_expect_token(p, 642)) // token='if' && (a_1 = named_expression_rule(p)) // named_expression && @@ -23013,7 +23514,7 @@ invalid_elif_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 643)) // token='elif' + (_keyword = _PyPegen_expect_token(p, 644)) // token='elif' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23044,7 +23545,7 @@ invalid_elif_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 643)) // token='elif' + (a = _PyPegen_expect_token(p, 644)) // token='elif' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23098,7 +23599,7 @@ invalid_else_stmt_rule(Parser *p) Token * a; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 644)) // token='else' + (a = _PyPegen_expect_token(p, 645)) // token='else' && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23152,7 +23653,7 @@ invalid_while_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 646)) // token='while' + (_keyword = _PyPegen_expect_token(p, 647)) // token='while' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23183,7 +23684,7 @@ invalid_while_stmt_rule(Parser *p) expr_ty named_expression_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 646)) // token='while' + (a = _PyPegen_expect_token(p, 647)) // token='while' && (named_expression_var = named_expression_rule(p)) // named_expression && @@ -23245,11 +23746,11 @@ invalid_for_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' && (star_targets_var = star_targets_rule(p)) // star_targets && - (_keyword_1 = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword_1 = _PyPegen_expect_token(p, 651)) // token='in' && (star_expressions_var = star_expressions_rule(p)) // star_expressions && @@ -23286,11 +23787,11 @@ invalid_for_stmt_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 649)) // token='for' + (a = _PyPegen_expect_token(p, 650)) // token='for' && (star_targets_var = star_targets_rule(p)) // star_targets && - (_keyword = _PyPegen_expect_token(p, 650)) // token='in' + (_keyword = _PyPegen_expect_token(p, 651)) // token='in' && (star_expressions_var = star_expressions_rule(p)) // star_expressions && @@ -23356,7 +23857,7 @@ invalid_def_raw_rule(Parser *p) if ( (_opt_var = _PyPegen_expect_token(p, ASYNC), !p->error_indicator) // ASYNC? && - (a = _PyPegen_expect_token(p, 651)) // token='def' + (a = _PyPegen_expect_token(p, 652)) // token='def' && (name_var = _PyPegen_name_token(p)) // NAME && @@ -23366,7 +23867,7 @@ invalid_def_raw_rule(Parser *p) && (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' && - (_opt_var_2 = _tmp_217_rule(p), !p->error_indicator) // ['->' expression] + (_opt_var_2 = _tmp_222_rule(p), !p->error_indicator) // ['->' expression] && (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23422,11 +23923,11 @@ invalid_class_def_raw_rule(Parser *p) expr_ty name_var; Token * newline_var; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_218_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_223_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) @@ -23457,11 +23958,11 @@ invalid_class_def_raw_rule(Parser *p) expr_ty name_var; Token * newline_var; if ( - (a = _PyPegen_expect_token(p, 653)) // token='class' + (a = _PyPegen_expect_token(p, 654)) // token='class' && (name_var = _PyPegen_name_token(p)) // NAME && - (_opt_var = _tmp_219_rule(p), !p->error_indicator) // ['(' arguments? ')'] + (_opt_var = _tmp_224_rule(p), !p->error_indicator) // ['(' arguments? ')'] && (_literal = _PyPegen_expect_token(p, 11)) // token=':' && @@ -23512,11 +24013,11 @@ invalid_double_starred_kvpairs_rule(Parser *p) return NULL; } D(fprintf(stderr, "%*c> invalid_double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - asdl_seq * _gather_220_var; + asdl_seq * _gather_225_var; Token * _literal; void *invalid_kvpair_var; if ( - (_gather_220_var = _gather_220_rule(p)) // ','.double_starred_kvpair+ + (_gather_225_var = _gather_225_rule(p)) // ','.double_starred_kvpair+ && (_literal = _PyPegen_expect_token(p, 12)) // token=',' && @@ -23524,7 +24025,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ',' invalid_kvpair")); - _res = _PyPegen_dummy_name(p, _gather_220_var, _literal, invalid_kvpair_var); + _res = _PyPegen_dummy_name(p, _gather_225_var, _literal, invalid_kvpair_var); goto done; } p->mark = _mark; @@ -23577,7 +24078,7 @@ invalid_double_starred_kvpairs_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_222_rule, p) + _PyPegen_lookahead(1, _tmp_227_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -23688,7 +24189,7 @@ invalid_kvpair_rule(Parser *p) && (a = _PyPegen_expect_token(p, 11)) // token=':' && - _PyPegen_lookahead(1, _tmp_223_rule, p) + _PyPegen_lookahead(1, _tmp_228_rule, p) ) { D(fprintf(stderr, "%*c+ invalid_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')")); @@ -23763,6 +24264,450 @@ invalid_starred_expression_rule(Parser *p) return _res; } +// invalid_replacement_field: +// | '{' '=' +// | '{' '!' +// | '{' ':' +// | '{' '}' +// | '{' !(yield_expr | star_expressions) +// | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') +// | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') +// | '{' (yield_expr | star_expressions) '='? invalid_conversion_character +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' +// | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' +static void * +invalid_replacement_field_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '{' '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '='")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '='" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '='")); + } + { // '{' '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '!'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '!'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '!'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '!'")); + } + { // '{' ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' ':'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' ':'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before ':'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' ':'")); + } + { // '{' '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '}'")); + Token * _literal; + Token * a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '}'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "f-string: valid expression required before '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '}'")); + } + { // '{' !(yield_expr | star_expressions) + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + _PyPegen_lookahead(0, _tmp_229_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting a valid expression after '{'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' !(yield_expr | star_expressions)")); + } + { // '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + Token * _literal; + void *_tmp_230_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_230_var = _tmp_230_rule(p)) // yield_expr | star_expressions + && + _PyPegen_lookahead(0, _tmp_231_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '=', or '!', or ':', or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + Token * _literal; + Token * _literal_1; + void *_tmp_232_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_232_var = _tmp_232_rule(p)) // yield_expr | star_expressions + && + (_literal_1 = _PyPegen_expect_token(p, 22)) // token='=' + && + _PyPegen_lookahead(0, _tmp_233_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '!', or ':', or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '=' !('!' | ':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '='? invalid_conversion_character + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_tmp_234_var; + void *invalid_conversion_character_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_234_var = _tmp_234_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (invalid_conversion_character_var = invalid_conversion_character_rule(p)) // invalid_conversion_character + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_234_var, _opt_var, invalid_conversion_character_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? invalid_conversion_character")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_235_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_235_var = _tmp_235_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_236_rule(p), !p->error_indicator) // ['!' NAME] + && + _PyPegen_lookahead(0, _tmp_237_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting ':' or '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}')")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + Token * _literal; + Token * _literal_1; + asdl_seq * _loop0_240_var; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_238_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_238_var = _tmp_238_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_239_rule(p), !p->error_indicator) // ['!' NAME] + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + && + (_loop0_240_var = _loop0_240_rule(p)) // fstring_format_spec* + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}', or format specs" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}'")); + } + { // '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + void *_opt_var_1; + UNUSED(_opt_var_1); // Silence compiler warnings + void *_tmp_241_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (_tmp_241_var = _tmp_241_rule(p)) // yield_expr | star_expressions + && + (_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='? + && + (_opt_var_1 = _tmp_242_rule(p), !p->error_indicator) // ['!' NAME] + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 26) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}'" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_replacement_field[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' (yield_expr | star_expressions) '='? ['!' NAME] !'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// invalid_conversion_character: '!' &(':' | '}') | '!' !NAME +static void * +invalid_conversion_character_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' &(':' | '}') + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_conversion_character[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + _PyPegen_lookahead(1, _tmp_243_rule, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' &(':' | '}')")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: missing conversion character" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_conversion_character[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' &(':' | '}')")); + } + { // '!' !NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> invalid_conversion_character[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' !NAME")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + _PyPegen_lookahead_with_name(0, _PyPegen_name_token, p) + ) + { + D(fprintf(stderr, "%*c+ invalid_conversion_character[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' !NAME")); + _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: invalid conversion character" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_conversion_character[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' !NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + // _loop0_1: NEWLINE static asdl_seq * _loop0_1_rule(Parser *p) @@ -23899,9 +24844,77 @@ _loop0_2_rule(Parser *p) return _seq; } -// _loop1_3: statement +// _loop0_3: fstring_middle static asdl_seq * -_loop1_3_rule(Parser *p) +_loop0_3_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // fstring_middle + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle")); + expr_ty fstring_middle_var; + while ( + (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle + ) + { + _res = fstring_middle_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_3[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _loop1_4: statement +static asdl_seq * +_loop1_4_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -23927,7 +24940,7 @@ _loop1_3_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); + D(fprintf(stderr, "%*c> _loop1_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); asdl_stmt_seq* statement_var; while ( (statement_var = statement_rule(p)) // statement @@ -23950,7 +24963,7 @@ _loop1_3_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_3[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_4[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); } if (_n == 0 || p->error_indicator) { @@ -23972,9 +24985,9 @@ _loop1_3_rule(Parser *p) return _seq; } -// _loop0_5: ';' simple_stmt +// _loop0_6: ';' simple_stmt static asdl_seq * -_loop0_5_rule(Parser *p) +_loop0_6_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24000,7 +25013,7 @@ _loop0_5_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); + D(fprintf(stderr, "%*c> _loop0_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' simple_stmt")); Token * _literal; stmt_ty elem; while ( @@ -24032,7 +25045,7 @@ _loop0_5_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_5[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24049,9 +25062,9 @@ _loop0_5_rule(Parser *p) return _seq; } -// _gather_4: simple_stmt _loop0_5 +// _gather_5: simple_stmt _loop0_6 static asdl_seq * -_gather_4_rule(Parser *p) +_gather_5_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24063,27 +25076,27 @@ _gather_4_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // simple_stmt _loop0_5 + { // simple_stmt _loop0_6 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c> _gather_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); stmt_ty elem; asdl_seq * seq; if ( (elem = simple_stmt_rule(p)) // simple_stmt && - (seq = _loop0_5_rule(p)) // _loop0_5 + (seq = _loop0_6_rule(p)) // _loop0_6 ) { - D(fprintf(stderr, "%*c+ _gather_4[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c+ _gather_5[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt _loop0_6")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_4[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_5")); + D(fprintf(stderr, "%*c%s _gather_5[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt _loop0_6")); } _res = NULL; done: @@ -24091,9 +25104,9 @@ _gather_4_rule(Parser *p) return _res; } -// _tmp_6: 'import' | 'from' +// _tmp_7: 'import' | 'from' static void * -_tmp_6_rule(Parser *p) +_tmp_7_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24110,18 +25123,18 @@ _tmp_6_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 606)) // token='import' + (_keyword = _PyPegen_expect_token(p, 607)) // token='import' ) { - D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import'")); } { // 'from' @@ -24129,18 +25142,18 @@ _tmp_6_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' ) { - D(fprintf(stderr, "%*c+ _tmp_6[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); + D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_6[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from'")); } _res = NULL; @@ -24149,9 +25162,9 @@ _tmp_6_rule(Parser *p) return _res; } -// _tmp_7: 'def' | '@' | ASYNC +// _tmp_8: 'def' | '@' | ASYNC static void * -_tmp_7_rule(Parser *p) +_tmp_8_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24168,18 +25181,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 651)) // token='def' + (_keyword = _PyPegen_expect_token(p, 652)) // token='def' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def'")); } { // '@' @@ -24187,18 +25200,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } { // ASYNC @@ -24206,18 +25219,18 @@ _tmp_7_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_7[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24226,9 +25239,9 @@ _tmp_7_rule(Parser *p) return _res; } -// _tmp_8: 'class' | '@' +// _tmp_9: 'class' | '@' static void * -_tmp_8_rule(Parser *p) +_tmp_9_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24245,18 +25258,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 653)) // token='class' + (_keyword = _PyPegen_expect_token(p, 654)) // token='class' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class'")); } { // '@' @@ -24264,18 +25277,18 @@ _tmp_8_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 49)) // token='@' ) { - D(fprintf(stderr, "%*c+ _tmp_8[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_8[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); } _res = NULL; @@ -24284,9 +25297,9 @@ _tmp_8_rule(Parser *p) return _res; } -// _tmp_9: 'with' | ASYNC +// _tmp_10: 'with' | ASYNC static void * -_tmp_9_rule(Parser *p) +_tmp_10_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24303,18 +25316,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 614)) // token='with' + (_keyword = _PyPegen_expect_token(p, 615)) // token='with' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with'")); } { // ASYNC @@ -24322,18 +25335,18 @@ _tmp_9_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_9[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24342,9 +25355,9 @@ _tmp_9_rule(Parser *p) return _res; } -// _tmp_10: 'for' | ASYNC +// _tmp_11: 'for' | ASYNC static void * -_tmp_10_rule(Parser *p) +_tmp_11_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24361,18 +25374,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 649)) // token='for' + (_keyword = _PyPegen_expect_token(p, 650)) // token='for' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); + D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for'")); } { // ASYNC @@ -24380,18 +25393,18 @@ _tmp_10_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); Token * async_var; if ( (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' ) { - D(fprintf(stderr, "%*c+ _tmp_10[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); _res = async_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_10[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); } _res = NULL; @@ -24400,9 +25413,9 @@ _tmp_10_rule(Parser *p) return _res; } -// _tmp_11: '=' annotated_rhs +// _tmp_12: '=' annotated_rhs static void * -_tmp_11_rule(Parser *p) +_tmp_12_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24419,7 +25432,7 @@ _tmp_11_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -24428,7 +25441,7 @@ _tmp_11_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_11[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24438,7 +25451,7 @@ _tmp_11_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_11[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -24447,9 +25460,9 @@ _tmp_11_rule(Parser *p) return _res; } -// _tmp_12: '(' single_target ')' | single_subscript_attribute_target +// _tmp_13: '(' single_target ')' | single_subscript_attribute_target static void * -_tmp_12_rule(Parser *p) +_tmp_13_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24466,7 +25479,7 @@ _tmp_12_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); Token * _literal; Token * _literal_1; expr_ty b; @@ -24478,7 +25491,7 @@ _tmp_12_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); _res = b; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24488,7 +25501,7 @@ _tmp_12_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); } { // single_subscript_attribute_target @@ -24496,18 +25509,18 @@ _tmp_12_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); expr_ty single_subscript_attribute_target_var; if ( (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target ) { - D(fprintf(stderr, "%*c+ _tmp_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); _res = single_subscript_attribute_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_12[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); } _res = NULL; @@ -24516,9 +25529,9 @@ _tmp_12_rule(Parser *p) return _res; } -// _tmp_13: '=' annotated_rhs +// _tmp_14: '=' annotated_rhs static void * -_tmp_13_rule(Parser *p) +_tmp_14_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24535,7 +25548,7 @@ _tmp_13_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); Token * _literal; expr_ty d; if ( @@ -24544,7 +25557,7 @@ _tmp_13_rule(Parser *p) (d = annotated_rhs_rule(p)) // annotated_rhs ) { - D(fprintf(stderr, "%*c+ _tmp_13[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24554,7 +25567,7 @@ _tmp_13_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_13[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); } _res = NULL; @@ -24563,9 +25576,9 @@ _tmp_13_rule(Parser *p) return _res; } -// _loop1_14: (star_targets '=') +// _loop1_15: (star_targets '=') static asdl_seq * -_loop1_14_rule(Parser *p) +_loop1_15_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24591,13 +25604,13 @@ _loop1_14_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_224_var; + D(fprintf(stderr, "%*c> _loop1_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_244_var; while ( - (_tmp_224_var = _tmp_224_rule(p)) // star_targets '=' + (_tmp_244_var = _tmp_244_rule(p)) // star_targets '=' ) { - _res = _tmp_224_var; + _res = _tmp_244_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -24614,7 +25627,7 @@ _loop1_14_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_14[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_15[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } if (_n == 0 || p->error_indicator) { @@ -24636,9 +25649,9 @@ _loop1_14_rule(Parser *p) return _seq; } -// _tmp_15: yield_expr | star_expressions +// _tmp_16: yield_expr | star_expressions static void * -_tmp_15_rule(Parser *p) +_tmp_16_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24655,18 +25668,18 @@ _tmp_15_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -24674,18 +25687,18 @@ _tmp_15_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -24694,9 +25707,9 @@ _tmp_15_rule(Parser *p) return _res; } -// _tmp_16: yield_expr | star_expressions +// _tmp_17: yield_expr | star_expressions static void * -_tmp_16_rule(Parser *p) +_tmp_17_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24713,18 +25726,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -24732,18 +25745,18 @@ _tmp_16_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -24752,9 +25765,9 @@ _tmp_16_rule(Parser *p) return _res; } -// _tmp_17: 'from' expression +// _tmp_18: 'from' expression static void * -_tmp_17_rule(Parser *p) +_tmp_18_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24771,16 +25784,16 @@ _tmp_17_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 607)) // token='from' + (_keyword = _PyPegen_expect_token(p, 608)) // token='from' && (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -24790,7 +25803,7 @@ _tmp_17_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' expression")); } _res = NULL; @@ -24799,9 +25812,9 @@ _tmp_17_rule(Parser *p) return _res; } -// _loop0_19: ',' NAME +// _loop0_20: ',' NAME static asdl_seq * -_loop0_19_rule(Parser *p) +_loop0_20_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24827,7 +25840,7 @@ _loop0_19_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -24859,7 +25872,7 @@ _loop0_19_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_19[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_20[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24876,9 +25889,9 @@ _loop0_19_rule(Parser *p) return _seq; } -// _gather_18: NAME _loop0_19 +// _gather_19: NAME _loop0_20 static asdl_seq * -_gather_18_rule(Parser *p) +_gather_19_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24890,27 +25903,27 @@ _gather_18_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_19 + { // NAME _loop0_20 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c> _gather_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_19_rule(p)) // _loop0_19 + (seq = _loop0_20_rule(p)) // _loop0_20 ) { - D(fprintf(stderr, "%*c+ _gather_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c+ _gather_19[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_20")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_18[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_19")); + D(fprintf(stderr, "%*c%s _gather_19[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_20")); } _res = NULL; done: @@ -24918,9 +25931,9 @@ _gather_18_rule(Parser *p) return _res; } -// _loop0_21: ',' NAME +// _loop0_22: ',' NAME static asdl_seq * -_loop0_21_rule(Parser *p) +_loop0_22_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -24946,7 +25959,7 @@ _loop0_21_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + D(fprintf(stderr, "%*c> _loop0_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); Token * _literal; expr_ty elem; while ( @@ -24978,7 +25991,7 @@ _loop0_21_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_21[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_22[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -24995,9 +26008,9 @@ _loop0_21_rule(Parser *p) return _seq; } -// _gather_20: NAME _loop0_21 +// _gather_21: NAME _loop0_22 static asdl_seq * -_gather_20_rule(Parser *p) +_gather_21_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25009,27 +26022,27 @@ _gather_20_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // NAME _loop0_21 + { // NAME _loop0_22 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c> _gather_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); expr_ty elem; asdl_seq * seq; if ( (elem = _PyPegen_name_token(p)) // NAME && - (seq = _loop0_21_rule(p)) // _loop0_21 + (seq = _loop0_22_rule(p)) // _loop0_22 ) { - D(fprintf(stderr, "%*c+ _gather_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c+ _gather_21[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_22")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_20[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_21")); + D(fprintf(stderr, "%*c%s _gather_21[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_22")); } _res = NULL; done: @@ -25037,9 +26050,9 @@ _gather_20_rule(Parser *p) return _res; } -// _tmp_22: ';' | NEWLINE +// _tmp_23: ';' | NEWLINE static void * -_tmp_22_rule(Parser *p) +_tmp_23_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25056,18 +26069,18 @@ _tmp_22_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 13)) // token=';' ) { - D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); } { // NEWLINE @@ -25075,18 +26088,18 @@ _tmp_22_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_22[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_22[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } _res = NULL; @@ -25095,9 +26108,9 @@ _tmp_22_rule(Parser *p) return _res; } -// _tmp_23: ',' expression +// _tmp_24: ',' expression static void * -_tmp_23_rule(Parser *p) +_tmp_24_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25114,7 +26127,7 @@ _tmp_23_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty z; if ( @@ -25123,7 +26136,7 @@ _tmp_23_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25133,7 +26146,7 @@ _tmp_23_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -25142,9 +26155,9 @@ _tmp_23_rule(Parser *p) return _res; } -// _loop0_24: ('.' | '...') +// _loop0_25: ('.' | '...') static asdl_seq * -_loop0_24_rule(Parser *p) +_loop0_25_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25170,13 +26183,13 @@ _loop0_24_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_225_var; + D(fprintf(stderr, "%*c> _loop0_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_245_var; while ( - (_tmp_225_var = _tmp_225_rule(p)) // '.' | '...' + (_tmp_245_var = _tmp_245_rule(p)) // '.' | '...' ) { - _res = _tmp_225_var; + _res = _tmp_245_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25193,7 +26206,7 @@ _loop0_24_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_24[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_25[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25210,9 +26223,9 @@ _loop0_24_rule(Parser *p) return _seq; } -// _loop1_25: ('.' | '...') +// _loop1_26: ('.' | '...') static asdl_seq * -_loop1_25_rule(Parser *p) +_loop1_26_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25238,13 +26251,13 @@ _loop1_25_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); - void *_tmp_226_var; + D(fprintf(stderr, "%*c> _loop1_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_246_var; while ( - (_tmp_226_var = _tmp_226_rule(p)) // '.' | '...' + (_tmp_246_var = _tmp_246_rule(p)) // '.' | '...' ) { - _res = _tmp_226_var; + _res = _tmp_246_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25261,7 +26274,7 @@ _loop1_25_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_25[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_26[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); } if (_n == 0 || p->error_indicator) { @@ -25283,9 +26296,9 @@ _loop1_25_rule(Parser *p) return _seq; } -// _loop0_27: ',' import_from_as_name +// _loop0_28: ',' import_from_as_name static asdl_seq * -_loop0_27_rule(Parser *p) +_loop0_28_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25311,7 +26324,7 @@ _loop0_27_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); + D(fprintf(stderr, "%*c> _loop0_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); Token * _literal; alias_ty elem; while ( @@ -25343,7 +26356,7 @@ _loop0_27_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_27[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25360,9 +26373,9 @@ _loop0_27_rule(Parser *p) return _seq; } -// _gather_26: import_from_as_name _loop0_27 +// _gather_27: import_from_as_name _loop0_28 static asdl_seq * -_gather_26_rule(Parser *p) +_gather_27_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25374,27 +26387,27 @@ _gather_26_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // import_from_as_name _loop0_27 + { // import_from_as_name _loop0_28 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c> _gather_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); alias_ty elem; asdl_seq * seq; if ( (elem = import_from_as_name_rule(p)) // import_from_as_name && - (seq = _loop0_27_rule(p)) // _loop0_27 + (seq = _loop0_28_rule(p)) // _loop0_28 ) { - D(fprintf(stderr, "%*c+ _gather_26[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c+ _gather_27[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_28")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_26[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_27")); + D(fprintf(stderr, "%*c%s _gather_27[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_28")); } _res = NULL; done: @@ -25402,9 +26415,9 @@ _gather_26_rule(Parser *p) return _res; } -// _tmp_28: 'as' NAME +// _tmp_29: 'as' NAME static void * -_tmp_28_rule(Parser *p) +_tmp_29_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25421,16 +26434,16 @@ _tmp_28_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_28[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25440,7 +26453,7 @@ _tmp_28_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_28[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_29[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -25449,9 +26462,9 @@ _tmp_28_rule(Parser *p) return _res; } -// _loop0_30: ',' dotted_as_name +// _loop0_31: ',' dotted_as_name static asdl_seq * -_loop0_30_rule(Parser *p) +_loop0_31_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25477,7 +26490,7 @@ _loop0_30_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); + D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); Token * _literal; alias_ty elem; while ( @@ -25509,7 +26522,7 @@ _loop0_30_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_30[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25526,9 +26539,9 @@ _loop0_30_rule(Parser *p) return _seq; } -// _gather_29: dotted_as_name _loop0_30 +// _gather_30: dotted_as_name _loop0_31 static asdl_seq * -_gather_29_rule(Parser *p) +_gather_30_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25540,27 +26553,27 @@ _gather_29_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // dotted_as_name _loop0_30 + { // dotted_as_name _loop0_31 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c> _gather_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); alias_ty elem; asdl_seq * seq; if ( (elem = dotted_as_name_rule(p)) // dotted_as_name && - (seq = _loop0_30_rule(p)) // _loop0_30 + (seq = _loop0_31_rule(p)) // _loop0_31 ) { - D(fprintf(stderr, "%*c+ _gather_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c+ _gather_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_31")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_29[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_30")); + D(fprintf(stderr, "%*c%s _gather_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_31")); } _res = NULL; done: @@ -25568,9 +26581,9 @@ _gather_29_rule(Parser *p) return _res; } -// _tmp_31: 'as' NAME +// _tmp_32: 'as' NAME static void * -_tmp_31_rule(Parser *p) +_tmp_32_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25587,16 +26600,16 @@ _tmp_31_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_31[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_32[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25606,7 +26619,7 @@ _tmp_31_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_31[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_32[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -25615,9 +26628,9 @@ _tmp_31_rule(Parser *p) return _res; } -// _loop1_32: ('@' named_expression NEWLINE) +// _loop1_33: ('@' named_expression NEWLINE) static asdl_seq * -_loop1_32_rule(Parser *p) +_loop1_33_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25643,13 +26656,13 @@ _loop1_32_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); - void *_tmp_227_var; + D(fprintf(stderr, "%*c> _loop1_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); + void *_tmp_247_var; while ( - (_tmp_227_var = _tmp_227_rule(p)) // '@' named_expression NEWLINE + (_tmp_247_var = _tmp_247_rule(p)) // '@' named_expression NEWLINE ) { - _res = _tmp_227_var; + _res = _tmp_247_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -25666,7 +26679,7 @@ _loop1_32_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_33[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); } if (_n == 0 || p->error_indicator) { @@ -25688,9 +26701,9 @@ _loop1_32_rule(Parser *p) return _seq; } -// _tmp_33: '(' arguments? ')' +// _tmp_34: '(' arguments? ')' static void * -_tmp_33_rule(Parser *p) +_tmp_34_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25707,7 +26720,7 @@ _tmp_33_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *z; @@ -25719,7 +26732,7 @@ _tmp_33_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_33[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25729,7 +26742,7 @@ _tmp_33_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_33[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -25738,9 +26751,9 @@ _tmp_33_rule(Parser *p) return _res; } -// _tmp_34: '->' expression +// _tmp_35: '->' expression static void * -_tmp_34_rule(Parser *p) +_tmp_35_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25757,7 +26770,7 @@ _tmp_34_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -25766,7 +26779,7 @@ _tmp_34_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_34[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25776,7 +26789,7 @@ _tmp_34_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_34[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -25785,9 +26798,9 @@ _tmp_34_rule(Parser *p) return _res; } -// _tmp_35: '->' expression +// _tmp_36: '->' expression static void * -_tmp_35_rule(Parser *p) +_tmp_36_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25804,7 +26817,7 @@ _tmp_35_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty z; if ( @@ -25813,7 +26826,7 @@ _tmp_35_rule(Parser *p) (z = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_36[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -25823,7 +26836,7 @@ _tmp_35_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_36[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -25832,9 +26845,9 @@ _tmp_35_rule(Parser *p) return _res; } -// _loop0_36: param_no_default +// _loop0_37: param_no_default static asdl_seq * -_loop0_36_rule(Parser *p) +_loop0_37_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25860,7 +26873,7 @@ _loop0_36_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -25883,7 +26896,7 @@ _loop0_36_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_36[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25900,9 +26913,9 @@ _loop0_36_rule(Parser *p) return _seq; } -// _loop0_37: param_with_default +// _loop0_38: param_with_default static asdl_seq * -_loop0_37_rule(Parser *p) +_loop0_38_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25928,7 +26941,7 @@ _loop0_37_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -25951,7 +26964,7 @@ _loop0_37_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -25968,9 +26981,9 @@ _loop0_37_rule(Parser *p) return _seq; } -// _loop0_38: param_with_default +// _loop0_39: param_with_default static asdl_seq * -_loop0_38_rule(Parser *p) +_loop0_39_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -25996,7 +27009,7 @@ _loop0_38_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26019,7 +27032,7 @@ _loop0_38_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_38[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_39[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26036,9 +27049,9 @@ _loop0_38_rule(Parser *p) return _seq; } -// _loop1_39: param_no_default +// _loop1_40: param_no_default static asdl_seq * -_loop1_39_rule(Parser *p) +_loop1_40_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26064,7 +27077,7 @@ _loop1_39_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26087,7 +27100,7 @@ _loop1_39_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_39[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_40[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26109,9 +27122,9 @@ _loop1_39_rule(Parser *p) return _seq; } -// _loop0_40: param_with_default +// _loop0_41: param_with_default static asdl_seq * -_loop0_40_rule(Parser *p) +_loop0_41_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26137,7 +27150,7 @@ _loop0_40_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop0_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26160,7 +27173,7 @@ _loop0_40_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_41[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26177,9 +27190,9 @@ _loop0_40_rule(Parser *p) return _seq; } -// _loop1_41: param_with_default +// _loop1_42: param_with_default static asdl_seq * -_loop1_41_rule(Parser *p) +_loop1_42_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26205,7 +27218,7 @@ _loop1_41_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26228,7 +27241,7 @@ _loop1_41_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_41[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26250,9 +27263,9 @@ _loop1_41_rule(Parser *p) return _seq; } -// _loop1_42: param_no_default +// _loop1_43: param_no_default static asdl_seq * -_loop1_42_rule(Parser *p) +_loop1_43_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26278,7 +27291,7 @@ _loop1_42_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26301,7 +27314,7 @@ _loop1_42_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_42[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26323,9 +27336,9 @@ _loop1_42_rule(Parser *p) return _seq; } -// _loop1_43: param_no_default +// _loop1_44: param_no_default static asdl_seq * -_loop1_43_rule(Parser *p) +_loop1_44_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26351,7 +27364,7 @@ _loop1_43_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26374,7 +27387,7 @@ _loop1_43_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_43[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_44[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -26396,9 +27409,9 @@ _loop1_43_rule(Parser *p) return _seq; } -// _loop0_44: param_no_default +// _loop0_45: param_no_default static asdl_seq * -_loop0_44_rule(Parser *p) +_loop0_45_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26424,7 +27437,7 @@ _loop0_44_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26447,7 +27460,7 @@ _loop0_44_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_45[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26464,9 +27477,9 @@ _loop0_44_rule(Parser *p) return _seq; } -// _loop1_45: param_with_default +// _loop1_46: param_with_default static asdl_seq * -_loop1_45_rule(Parser *p) +_loop1_46_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26492,7 +27505,7 @@ _loop1_45_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26515,7 +27528,7 @@ _loop1_45_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_45[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_46[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26537,9 +27550,9 @@ _loop1_45_rule(Parser *p) return _seq; } -// _loop0_46: param_no_default +// _loop0_47: param_no_default static asdl_seq * -_loop0_46_rule(Parser *p) +_loop0_47_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26565,7 +27578,7 @@ _loop0_46_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -26588,7 +27601,7 @@ _loop0_46_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_47[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26605,9 +27618,9 @@ _loop0_46_rule(Parser *p) return _seq; } -// _loop1_47: param_with_default +// _loop1_48: param_with_default static asdl_seq * -_loop1_47_rule(Parser *p) +_loop1_48_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26633,7 +27646,7 @@ _loop1_47_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -26656,7 +27669,7 @@ _loop1_47_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_47[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_48[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -26678,9 +27691,9 @@ _loop1_47_rule(Parser *p) return _seq; } -// _loop0_48: param_maybe_default +// _loop0_49: param_maybe_default static asdl_seq * -_loop0_48_rule(Parser *p) +_loop0_49_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26706,7 +27719,7 @@ _loop0_48_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26729,7 +27742,7 @@ _loop0_48_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_48[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26746,9 +27759,9 @@ _loop0_48_rule(Parser *p) return _seq; } -// _loop0_49: param_maybe_default +// _loop0_50: param_maybe_default static asdl_seq * -_loop0_49_rule(Parser *p) +_loop0_50_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26774,7 +27787,7 @@ _loop0_49_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26797,7 +27810,7 @@ _loop0_49_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_50[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26814,9 +27827,9 @@ _loop0_49_rule(Parser *p) return _seq; } -// _loop1_50: param_maybe_default +// _loop1_51: param_maybe_default static asdl_seq * -_loop1_50_rule(Parser *p) +_loop1_51_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26842,7 +27855,7 @@ _loop1_50_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -26865,7 +27878,7 @@ _loop1_50_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_50[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_51[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -26887,9 +27900,9 @@ _loop1_50_rule(Parser *p) return _seq; } -// _loop0_52: ',' with_item +// _loop0_53: ',' with_item static asdl_seq * -_loop0_52_rule(Parser *p) +_loop0_53_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26915,7 +27928,7 @@ _loop0_52_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -26947,7 +27960,7 @@ _loop0_52_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_52[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -26964,9 +27977,9 @@ _loop0_52_rule(Parser *p) return _seq; } -// _gather_51: with_item _loop0_52 +// _gather_52: with_item _loop0_53 static asdl_seq * -_gather_51_rule(Parser *p) +_gather_52_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -26978,27 +27991,27 @@ _gather_51_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_52 + { // with_item _loop0_53 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c> _gather_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_52_rule(p)) // _loop0_52 + (seq = _loop0_53_rule(p)) // _loop0_53 ) { - D(fprintf(stderr, "%*c+ _gather_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c+ _gather_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_53")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_51[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_52")); + D(fprintf(stderr, "%*c%s _gather_52[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_53")); } _res = NULL; done: @@ -27006,9 +28019,9 @@ _gather_51_rule(Parser *p) return _res; } -// _loop0_54: ',' with_item +// _loop0_55: ',' with_item static asdl_seq * -_loop0_54_rule(Parser *p) +_loop0_55_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27034,7 +28047,7 @@ _loop0_54_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27066,7 +28079,7 @@ _loop0_54_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27083,9 +28096,9 @@ _loop0_54_rule(Parser *p) return _seq; } -// _gather_53: with_item _loop0_54 +// _gather_54: with_item _loop0_55 static asdl_seq * -_gather_53_rule(Parser *p) +_gather_54_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27097,27 +28110,27 @@ _gather_53_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_54 + { // with_item _loop0_55 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c> _gather_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_54_rule(p)) // _loop0_54 + (seq = _loop0_55_rule(p)) // _loop0_55 ) { - D(fprintf(stderr, "%*c+ _gather_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c+ _gather_54[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_55")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_53[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_54")); + D(fprintf(stderr, "%*c%s _gather_54[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_55")); } _res = NULL; done: @@ -27125,9 +28138,9 @@ _gather_53_rule(Parser *p) return _res; } -// _loop0_56: ',' with_item +// _loop0_57: ',' with_item static asdl_seq * -_loop0_56_rule(Parser *p) +_loop0_57_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27153,7 +28166,7 @@ _loop0_56_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27185,7 +28198,7 @@ _loop0_56_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27202,9 +28215,9 @@ _loop0_56_rule(Parser *p) return _seq; } -// _gather_55: with_item _loop0_56 +// _gather_56: with_item _loop0_57 static asdl_seq * -_gather_55_rule(Parser *p) +_gather_56_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27216,27 +28229,27 @@ _gather_55_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_56 + { // with_item _loop0_57 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c> _gather_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_56_rule(p)) // _loop0_56 + (seq = _loop0_57_rule(p)) // _loop0_57 ) { - D(fprintf(stderr, "%*c+ _gather_55[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c+ _gather_56[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_57")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_55[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_56")); + D(fprintf(stderr, "%*c%s _gather_56[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_57")); } _res = NULL; done: @@ -27244,9 +28257,9 @@ _gather_55_rule(Parser *p) return _res; } -// _loop0_58: ',' with_item +// _loop0_59: ',' with_item static asdl_seq * -_loop0_58_rule(Parser *p) +_loop0_59_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27272,7 +28285,7 @@ _loop0_58_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + D(fprintf(stderr, "%*c> _loop0_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); Token * _literal; withitem_ty elem; while ( @@ -27304,7 +28317,7 @@ _loop0_58_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27321,9 +28334,9 @@ _loop0_58_rule(Parser *p) return _seq; } -// _gather_57: with_item _loop0_58 +// _gather_58: with_item _loop0_59 static asdl_seq * -_gather_57_rule(Parser *p) +_gather_58_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27335,27 +28348,27 @@ _gather_57_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // with_item _loop0_58 + { // with_item _loop0_59 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c> _gather_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); withitem_ty elem; asdl_seq * seq; if ( (elem = with_item_rule(p)) // with_item && - (seq = _loop0_58_rule(p)) // _loop0_58 + (seq = _loop0_59_rule(p)) // _loop0_59 ) { - D(fprintf(stderr, "%*c+ _gather_57[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c+ _gather_58[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_59")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_57[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_58")); + D(fprintf(stderr, "%*c%s _gather_58[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_59")); } _res = NULL; done: @@ -27363,9 +28376,9 @@ _gather_57_rule(Parser *p) return _res; } -// _tmp_59: ',' | ')' | ':' +// _tmp_60: ',' | ')' | ':' static void * -_tmp_59_rule(Parser *p) +_tmp_60_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27382,18 +28395,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -27401,18 +28414,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -27420,18 +28433,18 @@ _tmp_59_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_60[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_59[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -27440,9 +28453,9 @@ _tmp_59_rule(Parser *p) return _res; } -// _loop1_60: except_block +// _loop1_61: except_block static asdl_seq * -_loop1_60_rule(Parser *p) +_loop1_61_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27468,7 +28481,7 @@ _loop1_60_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -27491,7 +28504,7 @@ _loop1_60_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -27513,9 +28526,9 @@ _loop1_60_rule(Parser *p) return _seq; } -// _loop1_61: except_star_block +// _loop1_62: except_star_block static asdl_seq * -_loop1_61_rule(Parser *p) +_loop1_62_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27541,7 +28554,7 @@ _loop1_61_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -27564,7 +28577,7 @@ _loop1_61_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_62[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -27586,9 +28599,9 @@ _loop1_61_rule(Parser *p) return _seq; } -// _tmp_62: 'as' NAME +// _tmp_63: 'as' NAME static void * -_tmp_62_rule(Parser *p) +_tmp_63_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27605,16 +28618,16 @@ _tmp_62_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_62[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -27624,7 +28637,7 @@ _tmp_62_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_62[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -27633,9 +28646,9 @@ _tmp_62_rule(Parser *p) return _res; } -// _tmp_63: 'as' NAME +// _tmp_64: 'as' NAME static void * -_tmp_63_rule(Parser *p) +_tmp_64_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27652,16 +28665,16 @@ _tmp_63_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (z = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_63[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_64[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -27671,7 +28684,7 @@ _tmp_63_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_63[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_64[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -27680,9 +28693,9 @@ _tmp_63_rule(Parser *p) return _res; } -// _loop1_64: case_block +// _loop1_65: case_block static asdl_seq * -_loop1_64_rule(Parser *p) +_loop1_65_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27708,7 +28721,7 @@ _loop1_64_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); + D(fprintf(stderr, "%*c> _loop1_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "case_block")); match_case_ty case_block_var; while ( (case_block_var = case_block_rule(p)) // case_block @@ -27731,7 +28744,7 @@ _loop1_64_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_64[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_65[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "case_block")); } if (_n == 0 || p->error_indicator) { @@ -27753,9 +28766,9 @@ _loop1_64_rule(Parser *p) return _seq; } -// _loop0_66: '|' closed_pattern +// _loop0_67: '|' closed_pattern static asdl_seq * -_loop0_66_rule(Parser *p) +_loop0_67_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27781,7 +28794,7 @@ _loop0_66_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); + D(fprintf(stderr, "%*c> _loop0_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|' closed_pattern")); Token * _literal; pattern_ty elem; while ( @@ -27813,7 +28826,7 @@ _loop0_66_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_67[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|' closed_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -27830,9 +28843,9 @@ _loop0_66_rule(Parser *p) return _seq; } -// _gather_65: closed_pattern _loop0_66 +// _gather_66: closed_pattern _loop0_67 static asdl_seq * -_gather_65_rule(Parser *p) +_gather_66_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -27844,85 +28857,27 @@ _gather_65_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // closed_pattern _loop0_66 + { // closed_pattern _loop0_67 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); + D(fprintf(stderr, "%*c> _gather_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); pattern_ty elem; asdl_seq * seq; if ( (elem = closed_pattern_rule(p)) // closed_pattern && - (seq = _loop0_66_rule(p)) // _loop0_66 + (seq = _loop0_67_rule(p)) // _loop0_67 ) { - D(fprintf(stderr, "%*c+ _gather_65[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_66")); + D(fprintf(stderr, "%*c+ _gather_66[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "closed_pattern _loop0_67")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_65[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_66")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _tmp_67: '+' | '-' -static void * -_tmp_67_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // '+' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 14)) // token='+' - ) - { - D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); - } - { // '-' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 15)) // token='-' - ) - { - D(fprintf(stderr, "%*c+ _tmp_67[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_67[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); + D(fprintf(stderr, "%*c%s _gather_66[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "closed_pattern _loop0_67")); } _res = NULL; done: @@ -27988,7 +28943,7 @@ _tmp_68_rule(Parser *p) return _res; } -// _tmp_69: '.' | '(' | '=' +// _tmp_69: '+' | '-' static void * _tmp_69_rule(Parser *p) { @@ -28002,62 +28957,43 @@ _tmp_69_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // '.' - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); - Token * _literal; - if ( - (_literal = _PyPegen_expect_token(p, 23)) // token='.' - ) - { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); - _res = _literal; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); - } - { // '(' + { // '+' if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 7)) // token='(' + (_literal = _PyPegen_expect_token(p, 14)) // token='+' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'")); _res = _literal; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'")); } - { // '=' + { // '-' if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'")); Token * _literal; if ( - (_literal = _PyPegen_expect_token(p, 22)) // token='=' + (_literal = _PyPegen_expect_token(p, 15)) // token='-' ) { - D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'")); _res = _literal; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'")); } _res = NULL; done: @@ -28142,9 +29078,86 @@ _tmp_70_rule(Parser *p) return _res; } -// _loop0_72: ',' maybe_star_pattern +// _tmp_71: '.' | '(' | '=' +static void * +_tmp_71_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '(' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_73: ',' maybe_star_pattern static asdl_seq * -_loop0_72_rule(Parser *p) +_loop0_73_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28170,7 +29183,7 @@ _loop0_72_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); + D(fprintf(stderr, "%*c> _loop0_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern")); Token * _literal; pattern_ty elem; while ( @@ -28202,7 +29215,7 @@ _loop0_72_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_73[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' maybe_star_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28219,9 +29232,9 @@ _loop0_72_rule(Parser *p) return _seq; } -// _gather_71: maybe_star_pattern _loop0_72 +// _gather_72: maybe_star_pattern _loop0_73 static asdl_seq * -_gather_71_rule(Parser *p) +_gather_72_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28233,27 +29246,27 @@ _gather_71_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // maybe_star_pattern _loop0_72 + { // maybe_star_pattern _loop0_73 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c> _gather_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); pattern_ty elem; asdl_seq * seq; if ( (elem = maybe_star_pattern_rule(p)) // maybe_star_pattern && - (seq = _loop0_72_rule(p)) // _loop0_72 + (seq = _loop0_73_rule(p)) // _loop0_73 ) { - D(fprintf(stderr, "%*c+ _gather_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c+ _gather_72[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_73")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_71[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_72")); + D(fprintf(stderr, "%*c%s _gather_72[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_73")); } _res = NULL; done: @@ -28261,9 +29274,9 @@ _gather_71_rule(Parser *p) return _res; } -// _loop0_74: ',' key_value_pattern +// _loop0_75: ',' key_value_pattern static asdl_seq * -_loop0_74_rule(Parser *p) +_loop0_75_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28289,7 +29302,7 @@ _loop0_74_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); + D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -28321,7 +29334,7 @@ _loop0_74_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' key_value_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28338,9 +29351,9 @@ _loop0_74_rule(Parser *p) return _seq; } -// _gather_73: key_value_pattern _loop0_74 +// _gather_74: key_value_pattern _loop0_75 static asdl_seq * -_gather_73_rule(Parser *p) +_gather_74_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28352,27 +29365,27 @@ _gather_73_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // key_value_pattern _loop0_74 + { // key_value_pattern _loop0_75 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c> _gather_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = key_value_pattern_rule(p)) // key_value_pattern && - (seq = _loop0_74_rule(p)) // _loop0_74 + (seq = _loop0_75_rule(p)) // _loop0_75 ) { - D(fprintf(stderr, "%*c+ _gather_73[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c+ _gather_74[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_75")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_73[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_74")); + D(fprintf(stderr, "%*c%s _gather_74[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_75")); } _res = NULL; done: @@ -28380,9 +29393,9 @@ _gather_73_rule(Parser *p) return _res; } -// _tmp_75: literal_expr | attr +// _tmp_76: literal_expr | attr static void * -_tmp_75_rule(Parser *p) +_tmp_76_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28399,18 +29412,18 @@ _tmp_75_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr")); expr_ty literal_expr_var; if ( (literal_expr_var = literal_expr_rule(p)) // literal_expr ) { - D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); + D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr")); _res = literal_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "literal_expr")); } { // attr @@ -28418,18 +29431,18 @@ _tmp_75_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c> _tmp_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr")); expr_ty attr_var; if ( (attr_var = attr_rule(p)) // attr ) { - D(fprintf(stderr, "%*c+ _tmp_75[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); + D(fprintf(stderr, "%*c+ _tmp_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr")); _res = attr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_75[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "attr")); } _res = NULL; @@ -28438,9 +29451,9 @@ _tmp_75_rule(Parser *p) return _res; } -// _loop0_77: ',' pattern +// _loop0_78: ',' pattern static asdl_seq * -_loop0_77_rule(Parser *p) +_loop0_78_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28466,7 +29479,7 @@ _loop0_77_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); + D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern")); Token * _literal; pattern_ty elem; while ( @@ -28498,7 +29511,7 @@ _loop0_77_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28515,9 +29528,9 @@ _loop0_77_rule(Parser *p) return _seq; } -// _gather_76: pattern _loop0_77 +// _gather_77: pattern _loop0_78 static asdl_seq * -_gather_76_rule(Parser *p) +_gather_77_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28529,27 +29542,27 @@ _gather_76_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // pattern _loop0_77 + { // pattern _loop0_78 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c> _gather_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); pattern_ty elem; asdl_seq * seq; if ( (elem = pattern_rule(p)) // pattern && - (seq = _loop0_77_rule(p)) // _loop0_77 + (seq = _loop0_78_rule(p)) // _loop0_78 ) { - D(fprintf(stderr, "%*c+ _gather_76[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c+ _gather_77[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_78")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_76[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_77")); + D(fprintf(stderr, "%*c%s _gather_77[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_78")); } _res = NULL; done: @@ -28557,9 +29570,9 @@ _gather_76_rule(Parser *p) return _res; } -// _loop0_79: ',' keyword_pattern +// _loop0_80: ',' keyword_pattern static asdl_seq * -_loop0_79_rule(Parser *p) +_loop0_80_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28585,7 +29598,7 @@ _loop0_79_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); + D(fprintf(stderr, "%*c> _loop0_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern")); Token * _literal; KeyPatternPair* elem; while ( @@ -28617,7 +29630,7 @@ _loop0_79_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' keyword_pattern")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28634,9 +29647,9 @@ _loop0_79_rule(Parser *p) return _seq; } -// _gather_78: keyword_pattern _loop0_79 +// _gather_79: keyword_pattern _loop0_80 static asdl_seq * -_gather_78_rule(Parser *p) +_gather_79_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28648,27 +29661,27 @@ _gather_78_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // keyword_pattern _loop0_79 + { // keyword_pattern _loop0_80 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c> _gather_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); KeyPatternPair* elem; asdl_seq * seq; if ( (elem = keyword_pattern_rule(p)) // keyword_pattern && - (seq = _loop0_79_rule(p)) // _loop0_79 + (seq = _loop0_80_rule(p)) // _loop0_80 ) { - D(fprintf(stderr, "%*c+ _gather_78[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c+ _gather_79[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_80")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_78[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_79")); + D(fprintf(stderr, "%*c%s _gather_79[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_80")); } _res = NULL; done: @@ -28676,9 +29689,9 @@ _gather_78_rule(Parser *p) return _res; } -// _loop1_80: (',' expression) +// _loop1_81: (',' expression) static asdl_seq * -_loop1_80_rule(Parser *p) +_loop1_81_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28704,13 +29717,13 @@ _loop1_80_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); - void *_tmp_228_var; + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + void *_tmp_248_var; while ( - (_tmp_228_var = _tmp_228_rule(p)) // ',' expression + (_tmp_248_var = _tmp_248_rule(p)) // ',' expression ) { - _res = _tmp_228_var; + _res = _tmp_248_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28727,7 +29740,7 @@ _loop1_80_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); } if (_n == 0 || p->error_indicator) { @@ -28749,9 +29762,9 @@ _loop1_80_rule(Parser *p) return _seq; } -// _loop1_81: (',' star_expression) +// _loop1_82: (',' star_expression) static asdl_seq * -_loop1_81_rule(Parser *p) +_loop1_82_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28777,13 +29790,13 @@ _loop1_81_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); - void *_tmp_229_var; + D(fprintf(stderr, "%*c> _loop1_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_249_var; while ( - (_tmp_229_var = _tmp_229_rule(p)) // ',' star_expression + (_tmp_249_var = _tmp_249_rule(p)) // ',' star_expression ) { - _res = _tmp_229_var; + _res = _tmp_249_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28800,7 +29813,7 @@ _loop1_81_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); } if (_n == 0 || p->error_indicator) { @@ -28822,9 +29835,9 @@ _loop1_81_rule(Parser *p) return _seq; } -// _loop0_83: ',' star_named_expression +// _loop0_84: ',' star_named_expression static asdl_seq * -_loop0_83_rule(Parser *p) +_loop0_84_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28850,7 +29863,7 @@ _loop0_83_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); Token * _literal; expr_ty elem; while ( @@ -28882,7 +29895,7 @@ _loop0_83_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_83[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -28899,9 +29912,9 @@ _loop0_83_rule(Parser *p) return _seq; } -// _gather_82: star_named_expression _loop0_83 +// _gather_83: star_named_expression _loop0_84 static asdl_seq * -_gather_82_rule(Parser *p) +_gather_83_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28913,27 +29926,27 @@ _gather_82_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_named_expression _loop0_83 + { // star_named_expression _loop0_84 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c> _gather_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_84")); expr_ty elem; asdl_seq * seq; if ( (elem = star_named_expression_rule(p)) // star_named_expression && - (seq = _loop0_83_rule(p)) // _loop0_83 + (seq = _loop0_84_rule(p)) // _loop0_84 ) { - D(fprintf(stderr, "%*c+ _gather_82[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c+ _gather_83[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_84")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_82[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_83")); + D(fprintf(stderr, "%*c%s _gather_83[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_84")); } _res = NULL; done: @@ -28941,9 +29954,9 @@ _gather_82_rule(Parser *p) return _res; } -// _loop1_84: ('or' conjunction) +// _loop1_85: ('or' conjunction) static asdl_seq * -_loop1_84_rule(Parser *p) +_loop1_85_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -28969,13 +29982,13 @@ _loop1_84_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); - void *_tmp_230_var; + D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + void *_tmp_250_var; while ( - (_tmp_230_var = _tmp_230_rule(p)) // 'or' conjunction + (_tmp_250_var = _tmp_250_rule(p)) // 'or' conjunction ) { - _res = _tmp_230_var; + _res = _tmp_250_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -28992,7 +30005,7 @@ _loop1_84_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); } if (_n == 0 || p->error_indicator) { @@ -29014,9 +30027,9 @@ _loop1_84_rule(Parser *p) return _seq; } -// _loop1_85: ('and' inversion) +// _loop1_86: ('and' inversion) static asdl_seq * -_loop1_85_rule(Parser *p) +_loop1_86_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29042,13 +30055,13 @@ _loop1_85_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); - void *_tmp_231_var; + D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + void *_tmp_251_var; while ( - (_tmp_231_var = _tmp_231_rule(p)) // 'and' inversion + (_tmp_251_var = _tmp_251_rule(p)) // 'and' inversion ) { - _res = _tmp_231_var; + _res = _tmp_251_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29065,7 +30078,7 @@ _loop1_85_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); } if (_n == 0 || p->error_indicator) { @@ -29087,9 +30100,9 @@ _loop1_85_rule(Parser *p) return _seq; } -// _loop1_86: compare_op_bitwise_or_pair +// _loop1_87: compare_op_bitwise_or_pair static asdl_seq * -_loop1_86_rule(Parser *p) +_loop1_87_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29115,7 +30128,7 @@ _loop1_86_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); CmpopExprPair* compare_op_bitwise_or_pair_var; while ( (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair @@ -29138,7 +30151,7 @@ _loop1_86_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_86[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); } if (_n == 0 || p->error_indicator) { @@ -29160,9 +30173,9 @@ _loop1_86_rule(Parser *p) return _seq; } -// _tmp_87: '!=' +// _tmp_88: '!=' static void * -_tmp_87_rule(Parser *p) +_tmp_88_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29179,13 +30192,13 @@ _tmp_87_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c> _tmp_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); Token * tok; if ( (tok = _PyPegen_expect_token(p, 28)) // token='!=' ) { - D(fprintf(stderr, "%*c+ _tmp_87[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + D(fprintf(stderr, "%*c+ _tmp_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -29195,7 +30208,7 @@ _tmp_87_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_87[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); } _res = NULL; @@ -29204,9 +30217,9 @@ _tmp_87_rule(Parser *p) return _res; } -// _loop0_89: ',' (slice | starred_expression) +// _loop0_90: ',' (slice | starred_expression) static asdl_seq * -_loop0_89_rule(Parser *p) +_loop0_90_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29232,13 +30245,13 @@ _loop0_89_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); + D(fprintf(stderr, "%*c> _loop0_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_232_rule(p)) // slice | starred_expression + (elem = _tmp_252_rule(p)) // slice | starred_expression ) { _res = elem; @@ -29264,7 +30277,7 @@ _loop0_89_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_89[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_90[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -29281,9 +30294,9 @@ _loop0_89_rule(Parser *p) return _seq; } -// _gather_88: (slice | starred_expression) _loop0_89 +// _gather_89: (slice | starred_expression) _loop0_90 static asdl_seq * -_gather_88_rule(Parser *p) +_gather_89_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29295,27 +30308,27 @@ _gather_88_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (slice | starred_expression) _loop0_89 + { // (slice | starred_expression) _loop0_90 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c> _gather_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_90")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_232_rule(p)) // slice | starred_expression + (elem = _tmp_252_rule(p)) // slice | starred_expression && - (seq = _loop0_89_rule(p)) // _loop0_89 + (seq = _loop0_90_rule(p)) // _loop0_90 ) { - D(fprintf(stderr, "%*c+ _gather_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c+ _gather_89[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_90")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_88[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_89")); + D(fprintf(stderr, "%*c%s _gather_89[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_90")); } _res = NULL; done: @@ -29323,9 +30336,9 @@ _gather_88_rule(Parser *p) return _res; } -// _tmp_90: ':' expression? +// _tmp_91: ':' expression? static void * -_tmp_90_rule(Parser *p) +_tmp_91_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29342,7 +30355,7 @@ _tmp_90_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); Token * _literal; void *d; if ( @@ -29351,7 +30364,7 @@ _tmp_90_rule(Parser *p) (d = expression_rule(p), !p->error_indicator) // expression? ) { - D(fprintf(stderr, "%*c+ _tmp_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); _res = d; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -29361,7 +30374,7 @@ _tmp_90_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_90[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); } _res = NULL; @@ -29370,9 +30383,67 @@ _tmp_90_rule(Parser *p) return _res; } -// _tmp_91: tuple | group | genexp +// _tmp_92: STRING | FSTRING_START static void * -_tmp_91_rule(Parser *p) +_tmp_92_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // STRING + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + expr_ty string_var; + if ( + (string_var = _PyPegen_string_token(p)) // STRING + ) + { + D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING")); + _res = string_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + { // FSTRING_START + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + Token * fstring_start_var; + if ( + (fstring_start_var = _PyPegen_expect_token(p, FSTRING_START)) // token='FSTRING_START' + ) + { + D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_START")); + _res = fstring_start_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_93: tuple | group | genexp +static void * +_tmp_93_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29389,18 +30460,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // group @@ -29408,18 +30479,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); expr_ty group_var; if ( (group_var = group_rule(p)) // group ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); _res = group_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); } { // genexp @@ -29427,18 +30498,18 @@ _tmp_91_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } _res = NULL; @@ -29447,9 +30518,9 @@ _tmp_91_rule(Parser *p) return _res; } -// _tmp_92: list | listcomp +// _tmp_94: list | listcomp static void * -_tmp_92_rule(Parser *p) +_tmp_94_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29466,18 +30537,18 @@ _tmp_92_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // listcomp @@ -29485,18 +30556,18 @@ _tmp_92_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); expr_ty listcomp_var; if ( (listcomp_var = listcomp_rule(p)) // listcomp ) { - D(fprintf(stderr, "%*c+ _tmp_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); _res = listcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_92[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); } _res = NULL; @@ -29505,9 +30576,9 @@ _tmp_92_rule(Parser *p) return _res; } -// _tmp_93: dict | set | dictcomp | setcomp +// _tmp_95: dict | set | dictcomp | setcomp static void * -_tmp_93_rule(Parser *p) +_tmp_95_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29524,18 +30595,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); expr_ty dict_var; if ( (dict_var = dict_rule(p)) // dict ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); _res = dict_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); } { // set @@ -29543,18 +30614,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); expr_ty set_var; if ( (set_var = set_rule(p)) // set ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); _res = set_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); } { // dictcomp @@ -29562,18 +30633,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); expr_ty dictcomp_var; if ( (dictcomp_var = dictcomp_rule(p)) // dictcomp ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); _res = dictcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); } { // setcomp @@ -29581,18 +30652,18 @@ _tmp_93_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); expr_ty setcomp_var; if ( (setcomp_var = setcomp_rule(p)) // setcomp ) { - D(fprintf(stderr, "%*c+ _tmp_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); _res = setcomp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_93[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); } _res = NULL; @@ -29601,9 +30672,9 @@ _tmp_93_rule(Parser *p) return _res; } -// _tmp_94: yield_expr | named_expression +// _tmp_96: yield_expr | named_expression static void * -_tmp_94_rule(Parser *p) +_tmp_96_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29620,18 +30691,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // named_expression @@ -29639,18 +30710,18 @@ _tmp_94_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); expr_ty named_expression_var; if ( (named_expression_var = named_expression_rule(p)) // named_expression ) { - D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); _res = named_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); } _res = NULL; @@ -29659,143 +30730,7 @@ _tmp_94_rule(Parser *p) return _res; } -// _loop0_95: lambda_param_no_default -static asdl_seq * -_loop0_95_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // lambda_param_no_default - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; - while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default - ) - { - _res = lambda_param_no_default_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop0_96: lambda_param_with_default -static asdl_seq * -_loop0_96_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // lambda_param_with_default - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _loop0_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; - while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default - ) - { - _res = lambda_param_with_default_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); - p->level--; - return _seq; -} - -// _loop0_97: lambda_param_with_default +// _loop0_97: lambda_param_no_default static asdl_seq * _loop0_97_rule(Parser *p) { @@ -29818,18 +30753,18 @@ _loop0_97_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop0_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29847,7 +30782,7 @@ _loop0_97_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_97[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29863,9 +30798,9 @@ _loop0_97_rule(Parser *p) return _seq; } -// _loop1_98: lambda_param_no_default +// _loop0_98: lambda_param_with_default static asdl_seq * -_loop1_98_rule(Parser *p) +_loop0_98_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -29886,18 +30821,18 @@ _loop1_98_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop0_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -29914,13 +30849,8 @@ _loop1_98_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_98[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30004,7 +30934,7 @@ _loop0_99_rule(Parser *p) return _seq; } -// _loop1_100: lambda_param_with_default +// _loop1_100: lambda_param_no_default static asdl_seq * _loop1_100_rule(Parser *p) { @@ -30027,18 +30957,18 @@ _loop1_100_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop1_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30056,7 +30986,7 @@ _loop1_100_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_100[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30077,9 +31007,9 @@ _loop1_100_rule(Parser *p) return _seq; } -// _loop1_101: lambda_param_no_default +// _loop0_101: lambda_param_with_default static asdl_seq * -_loop1_101_rule(Parser *p) +_loop0_101_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30100,18 +31030,18 @@ _loop1_101_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop0_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30128,13 +31058,8 @@ _loop1_101_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_101[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30150,7 +31075,7 @@ _loop1_101_rule(Parser *p) return _seq; } -// _loop1_102: lambda_param_no_default +// _loop1_102: lambda_param_with_default static asdl_seq * _loop1_102_rule(Parser *p) { @@ -30173,18 +31098,18 @@ _loop1_102_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_no_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); - arg_ty lambda_param_no_default_var; + D(fprintf(stderr, "%*c> _loop1_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_no_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30202,7 +31127,7 @@ _loop1_102_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_102[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30223,9 +31148,9 @@ _loop1_102_rule(Parser *p) return _seq; } -// _loop0_103: lambda_param_no_default +// _loop1_103: lambda_param_no_default static asdl_seq * -_loop0_103_rule(Parser *p) +_loop1_103_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30251,7 +31176,7 @@ _loop0_103_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop1_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -30274,9 +31199,14 @@ _loop0_103_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { PyMem_Free(_children); @@ -30291,7 +31221,7 @@ _loop0_103_rule(Parser *p) return _seq; } -// _loop1_104: lambda_param_with_default +// _loop1_104: lambda_param_no_default static asdl_seq * _loop1_104_rule(Parser *p) { @@ -30314,18 +31244,18 @@ _loop1_104_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_with_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); - NameDefaultPair* lambda_param_with_default_var; + D(fprintf(stderr, "%*c> _loop1_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_with_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30343,7 +31273,7 @@ _loop1_104_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_104[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30505,7 +31435,7 @@ _loop1_106_rule(Parser *p) return _seq; } -// _loop0_107: lambda_param_maybe_default +// _loop0_107: lambda_param_no_default static asdl_seq * _loop0_107_rule(Parser *p) { @@ -30528,18 +31458,18 @@ _loop0_107_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_maybe_default + { // lambda_param_no_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); - NameDefaultPair* lambda_param_maybe_default_var; + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; while ( - (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - _res = lambda_param_maybe_default_var; + _res = lambda_param_no_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30557,7 +31487,7 @@ _loop0_107_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30573,7 +31503,7 @@ _loop0_107_rule(Parser *p) return _seq; } -// _loop1_108: lambda_param_maybe_default +// _loop1_108: lambda_param_with_default static asdl_seq * _loop1_108_rule(Parser *p) { @@ -30596,18 +31526,18 @@ _loop1_108_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // lambda_param_maybe_default + { // lambda_param_with_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); - NameDefaultPair* lambda_param_maybe_default_var; + D(fprintf(stderr, "%*c> _loop1_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; while ( - (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default ) { - _res = lambda_param_maybe_default_var; + _res = lambda_param_with_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30625,7 +31555,7 @@ _loop1_108_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_108[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30646,9 +31576,9 @@ _loop1_108_rule(Parser *p) return _seq; } -// _loop1_109: STRING +// _loop0_109: lambda_param_maybe_default static asdl_seq * -_loop1_109_rule(Parser *p) +_loop0_109_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30669,18 +31599,18 @@ _loop1_109_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // STRING + { // lambda_param_maybe_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); - expr_ty string_var; + D(fprintf(stderr, "%*c> _loop0_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; while ( - (string_var = _PyPegen_string_token(p)) // STRING + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default ) { - _res = string_var; + _res = lambda_param_maybe_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30697,13 +31627,8 @@ _loop1_109_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_109[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _loop0_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30719,59 +31644,9 @@ _loop1_109_rule(Parser *p) return _seq; } -// _tmp_110: star_named_expression ',' star_named_expressions? -static void * -_tmp_110_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void * _res = NULL; - int _mark = p->mark; - { // star_named_expression ',' star_named_expressions? - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - Token * _literal; - expr_ty y; - void *z; - if ( - (y = star_named_expression_rule(p)) // star_named_expression - && - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions? - ) - { - D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - _res = _PyPegen_seq_insert_in_front ( p , y , z ); - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - p->level--; - return NULL; - } - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _loop0_112: ',' double_starred_kvpair +// _loop1_110: lambda_param_maybe_default static asdl_seq * -_loop0_112_rule(Parser *p) +_loop1_110_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30792,27 +31667,18 @@ _loop0_112_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' double_starred_kvpair + { // lambda_param_maybe_default if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); - Token * _literal; - KeyValuePair* elem; + D(fprintf(stderr, "%*c> _loop1_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default ) { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - p->level--; - return NULL; - } + _res = lambda_param_maybe_default_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -30829,8 +31695,13 @@ _loop0_112_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c%s _loop1_110[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30846,9 +31717,9 @@ _loop0_112_rule(Parser *p) return _seq; } -// _gather_111: double_starred_kvpair _loop0_112 -static asdl_seq * -_gather_111_rule(Parser *p) +// _tmp_111: yield_expr | star_expressions +static void * +_tmp_111_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30858,112 +31729,55 @@ _gather_111_rule(Parser *p) p->level--; return NULL; } - asdl_seq * _res = NULL; + void * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_112 + { // yield_expr if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_112")); - KeyValuePair* elem; - asdl_seq * seq; + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; if ( - (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair - && - (seq = _loop0_112_rule(p)) // _loop0_112 + (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_112")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_112")); - } - _res = NULL; - done: - p->level--; - return _res; -} - -// _loop1_113: for_if_clause -static asdl_seq * -_loop1_113_rule(Parser *p) -{ - if (p->level++ == MAXSTACK) { - p->error_indicator = 1; - PyErr_NoMemory(); - } - if (p->error_indicator) { - p->level--; - return NULL; - } - void *_res = NULL; - int _mark = p->mark; - void **_children = PyMem_Malloc(sizeof(void *)); - if (!_children) { - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } - Py_ssize_t _children_capacity = 1; - Py_ssize_t _n = 0; - { // for_if_clause + { // star_expressions if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); - comprehension_ty for_if_clause_var; - while ( - (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause + D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - _res = for_if_clause_var; - if (_n == _children_capacity) { - _children_capacity *= 2; - void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); - if (!_new_children) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; - } - _children = _new_children; - } - _children[_n++] = _res; - _mark = p->mark; + D(fprintf(stderr, "%*c+ _tmp_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); - } - if (_n == 0 || p->error_indicator) { - PyMem_Free(_children); - p->level--; - return NULL; - } - asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); - if (!_seq) { - PyMem_Free(_children); - p->error_indicator = 1; - PyErr_NoMemory(); - p->level--; - return NULL; + D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } - for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); - PyMem_Free(_children); + _res = NULL; + done: p->level--; - return _seq; + return _res; } -// _loop0_114: ('if' disjunction) +// _loop0_112: fstring_format_spec static asdl_seq * -_loop0_114_rule(Parser *p) +_loop0_112_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -30984,18 +31798,18 @@ _loop0_114_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ('if' disjunction) + { // fstring_format_spec if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_233_var; + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + expr_ty fstring_format_spec_var; while ( - (_tmp_233_var = _tmp_233_rule(p)) // 'if' disjunction + (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec ) { - _res = _tmp_233_var; + _res = fstring_format_spec_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31012,8 +31826,8 @@ _loop0_114_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31029,9 +31843,9 @@ _loop0_114_rule(Parser *p) return _seq; } -// _loop0_115: ('if' disjunction) +// _loop1_113: (fstring | string) static asdl_seq * -_loop0_115_rule(Parser *p) +_loop1_113_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31052,18 +31866,18 @@ _loop0_115_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ('if' disjunction) + { // (fstring | string) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); - void *_tmp_234_var; + D(fprintf(stderr, "%*c> _loop1_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string)")); + void *_tmp_253_var; while ( - (_tmp_234_var = _tmp_234_rule(p)) // 'if' disjunction + (_tmp_253_var = _tmp_253_rule(p)) // fstring | string ) { - _res = _tmp_234_var; + _res = _tmp_253_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31080,8 +31894,13 @@ _loop0_115_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_115[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31097,9 +31916,9 @@ _loop0_115_rule(Parser *p) return _seq; } -// _tmp_116: assignment_expression | expression !':=' +// _tmp_114: star_named_expression ',' star_named_expressions? static void * -_tmp_116_rule(Parser *p) +_tmp_114_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31111,45 +31930,35 @@ _tmp_116_rule(Parser *p) } void * _res = NULL; int _mark = p->mark; - { // assignment_expression - if (p->error_indicator) { - p->level--; - return NULL; - } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); - expr_ty assignment_expression_var; - if ( - (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression - ) - { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); - _res = assignment_expression_var; - goto done; - } - p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); - } - { // expression !':=' + { // star_named_expression ',' star_named_expressions? if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); - expr_ty expression_var; + D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + Token * _literal; + expr_ty y; + void *z; if ( - (expression_var = expression_rule(p)) // expression + (y = star_named_expression_rule(p)) // star_named_expression && - _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions? ) { - D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); - _res = expression_var; + D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + _res = _PyPegen_seq_insert_in_front ( p , y , z ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); } _res = NULL; done: @@ -31157,9 +31966,9 @@ _tmp_116_rule(Parser *p) return _res; } -// _loop0_118: ',' (starred_expression | (assignment_expression | expression !':=') !'=') +// _loop0_116: ',' double_starred_kvpair static asdl_seq * -_loop0_118_rule(Parser *p) +_loop0_116_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31180,18 +31989,18 @@ _loop0_118_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' (starred_expression | (assignment_expression | expression !':=') !'=') + { // ',' double_starred_kvpair if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; - void *elem; + KeyValuePair* elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_235_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair ) { _res = elem; @@ -31217,8 +32026,8 @@ _loop0_118_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31234,10 +32043,9 @@ _loop0_118_rule(Parser *p) return _seq; } -// _gather_117: -// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118 +// _gather_115: double_starred_kvpair _loop0_116 static asdl_seq * -_gather_117_rule(Parser *p) +_gather_115_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31249,27 +32057,27 @@ _gather_117_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118 + { // double_starred_kvpair _loop0_116 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); - void *elem; + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_116")); + KeyValuePair* elem; asdl_seq * seq; if ( - (elem = _tmp_235_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_118_rule(p)) // _loop0_118 + (seq = _loop0_116_rule(p)) // _loop0_116 ) { - D(fprintf(stderr, "%*c+ _gather_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_116")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_117[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_118")); + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_116")); } _res = NULL; done: @@ -31277,9 +32085,9 @@ _gather_117_rule(Parser *p) return _res; } -// _tmp_119: ',' kwargs -static void * -_tmp_119_rule(Parser *p) +// _loop1_117: for_if_clause +static asdl_seq * +_loop1_117_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31289,44 +32097,70 @@ _tmp_119_rule(Parser *p) p->level--; return NULL; } - void * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // ',' kwargs + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // for_if_clause if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); - Token * _literal; - asdl_seq* k; - if ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (k = kwargs_rule(p)) // kwargs + D(fprintf(stderr, "%*c> _loop1_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + comprehension_ty for_if_clause_var; + while ( + (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause ) { - D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); - _res = k; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - p->level--; - return NULL; + _res = for_if_clause_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; } - goto done; + _children[_n++] = _res; + _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); + D(fprintf(stderr, "%*c%s _loop1_117[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); } - _res = NULL; - done: + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); p->level--; - return _res; + return _seq; } -// _loop0_121: ',' kwarg_or_starred +// _loop0_118: ('if' disjunction) static asdl_seq * -_loop0_121_rule(Parser *p) +_loop0_118_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31347,27 +32181,18 @@ _loop0_121_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' kwarg_or_starred + { // ('if' disjunction) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); - Token * _literal; - KeywordOrStarred* elem; + D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_254_var; while ( - (_literal = _PyPegen_expect_token(p, 12)) // token=',' - && - (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + (_tmp_254_var = _tmp_254_rule(p)) // 'if' disjunction ) { - _res = elem; - if (_res == NULL && PyErr_Occurred()) { - p->error_indicator = 1; - PyMem_Free(_children); - p->level--; - return NULL; - } + _res = _tmp_254_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31384,8 +32209,8 @@ _loop0_121_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + D(fprintf(stderr, "%*c%s _loop0_118[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31401,9 +32226,9 @@ _loop0_121_rule(Parser *p) return _seq; } -// _gather_120: kwarg_or_starred _loop0_121 +// _loop0_119: ('if' disjunction) static asdl_seq * -_gather_120_rule(Parser *p) +_loop0_119_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31413,29 +32238,115 @@ _gather_120_rule(Parser *p) p->level--; return NULL; } - asdl_seq * _res = NULL; + void *_res = NULL; int _mark = p->mark; - { // kwarg_or_starred _loop0_121 + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ('if' disjunction) if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_121")); - KeywordOrStarred* elem; - asdl_seq * seq; + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_255_var; + while ( + (_tmp_255_var = _tmp_255_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_255_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _tmp_120: assignment_expression | expression !':=' +static void * +_tmp_120_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // assignment_expression + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + expr_ty assignment_expression_var; if ( - (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + _res = assignment_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); + } + { // expression !':=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression && - (seq = _loop0_121_rule(p)) // _loop0_121 + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _gather_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_121")); - _res = _PyPegen_seq_insert_in_front(p, elem, seq); + D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_120[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_121")); + D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; done: @@ -31443,9 +32354,9 @@ _gather_120_rule(Parser *p) return _res; } -// _loop0_123: ',' kwarg_or_double_starred +// _loop0_122: ',' (starred_expression | (assignment_expression | expression !':=') !'=') static asdl_seq * -_loop0_123_rule(Parser *p) +_loop0_122_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31466,18 +32377,18 @@ _loop0_123_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' kwarg_or_double_starred + { // ',' (starred_expression | (assignment_expression | expression !':=') !'=') if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c> _loop0_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); Token * _literal; - KeywordOrStarred* elem; + void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + (elem = _tmp_256_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' ) { _res = elem; @@ -31503,8 +32414,8 @@ _loop0_123_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + D(fprintf(stderr, "%*c%s _loop0_122[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31520,9 +32431,10 @@ _loop0_123_rule(Parser *p) return _seq; } -// _gather_122: kwarg_or_double_starred _loop0_123 +// _gather_121: +// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122 static asdl_seq * -_gather_122_rule(Parser *p) +_gather_121_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31534,27 +32446,74 @@ _gather_122_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // kwarg_or_double_starred _loop0_123 + { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_123")); - KeywordOrStarred* elem; + D(fprintf(stderr, "%*c> _gather_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); + void *elem; asdl_seq * seq; if ( - (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + (elem = _tmp_256_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'=' && - (seq = _loop0_123_rule(p)) // _loop0_123 + (seq = _loop0_122_rule(p)) // _loop0_122 ) { - D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_123")); + D(fprintf(stderr, "%*c+ _gather_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_122[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_123")); + D(fprintf(stderr, "%*c%s _gather_121[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_122")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_123: ',' kwargs +static void * +_tmp_123_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' kwargs + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + Token * _literal; + asdl_seq* k; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (k = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + _res = k; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + p->level--; + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); } _res = NULL; done: @@ -31800,9 +32759,247 @@ _gather_126_rule(Parser *p) return _res; } -// _loop0_128: (',' star_target) +// _loop0_129: ',' kwarg_or_starred static asdl_seq * -_loop0_128_rule(Parser *p) +_loop0_129_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + p->level--; + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _gather_128: kwarg_or_starred _loop0_129 +static asdl_seq * +_gather_128_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_129 + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _gather_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_129")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_129_rule(p)) // _loop0_129 + ) + { + D(fprintf(stderr, "%*c+ _gather_128[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_129")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_128[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_129")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_131: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_131_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + p->level--; + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _gather_130: kwarg_or_double_starred _loop0_131 +static asdl_seq * +_gather_130_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_131 + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _gather_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_131_rule(p)) // _loop0_131 + ) + { + D(fprintf(stderr, "%*c+ _gather_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_130[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_131")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_132: (',' star_target) +static asdl_seq * +_loop0_132_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31828,13 +33025,13 @@ _loop0_128_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_236_var; + D(fprintf(stderr, "%*c> _loop0_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_257_var; while ( - (_tmp_236_var = _tmp_236_rule(p)) // ',' star_target + (_tmp_257_var = _tmp_257_rule(p)) // ',' star_target ) { - _res = _tmp_236_var; + _res = _tmp_257_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -31851,7 +33048,7 @@ _loop0_128_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31868,9 +33065,9 @@ _loop0_128_rule(Parser *p) return _seq; } -// _loop0_130: ',' star_target +// _loop0_134: ',' star_target static asdl_seq * -_loop0_130_rule(Parser *p) +_loop0_134_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31896,7 +33093,7 @@ _loop0_130_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty elem; while ( @@ -31928,7 +33125,7 @@ _loop0_130_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_130[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -31945,9 +33142,9 @@ _loop0_130_rule(Parser *p) return _seq; } -// _gather_129: star_target _loop0_130 +// _gather_133: star_target _loop0_134 static asdl_seq * -_gather_129_rule(Parser *p) +_gather_133_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -31959,27 +33156,27 @@ _gather_129_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // star_target _loop0_130 + { // star_target _loop0_134 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c> _gather_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_134")); expr_ty elem; asdl_seq * seq; if ( (elem = star_target_rule(p)) // star_target && - (seq = _loop0_130_rule(p)) // _loop0_130 + (seq = _loop0_134_rule(p)) // _loop0_134 ) { - D(fprintf(stderr, "%*c+ _gather_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c+ _gather_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_134")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_129[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_130")); + D(fprintf(stderr, "%*c%s _gather_133[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_134")); } _res = NULL; done: @@ -31987,9 +33184,9 @@ _gather_129_rule(Parser *p) return _res; } -// _loop1_131: (',' star_target) +// _loop1_135: (',' star_target) static asdl_seq * -_loop1_131_rule(Parser *p) +_loop1_135_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32015,13 +33212,13 @@ _loop1_131_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); - void *_tmp_237_var; + D(fprintf(stderr, "%*c> _loop1_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_258_var; while ( - (_tmp_237_var = _tmp_237_rule(p)) // ',' star_target + (_tmp_258_var = _tmp_258_rule(p)) // ',' star_target ) { - _res = _tmp_237_var; + _res = _tmp_258_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -32038,7 +33235,7 @@ _loop1_131_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_131[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); } if (_n == 0 || p->error_indicator) { @@ -32060,9 +33257,9 @@ _loop1_131_rule(Parser *p) return _seq; } -// _tmp_132: !'*' star_target +// _tmp_136: !'*' star_target static void * -_tmp_132_rule(Parser *p) +_tmp_136_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32079,7 +33276,7 @@ _tmp_132_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); expr_ty star_target_var; if ( _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' @@ -32087,12 +33284,12 @@ _tmp_132_rule(Parser *p) (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); _res = star_target_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); } _res = NULL; @@ -32101,9 +33298,9 @@ _tmp_132_rule(Parser *p) return _res; } -// _loop0_134: ',' del_target +// _loop0_138: ',' del_target static asdl_seq * -_loop0_134_rule(Parser *p) +_loop0_138_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32129,7 +33326,7 @@ _loop0_134_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + D(fprintf(stderr, "%*c> _loop0_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); Token * _literal; expr_ty elem; while ( @@ -32161,7 +33358,7 @@ _loop0_134_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_138[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32178,9 +33375,9 @@ _loop0_134_rule(Parser *p) return _seq; } -// _gather_133: del_target _loop0_134 +// _gather_137: del_target _loop0_138 static asdl_seq * -_gather_133_rule(Parser *p) +_gather_137_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32192,27 +33389,27 @@ _gather_133_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // del_target _loop0_134 + { // del_target _loop0_138 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_138")); expr_ty elem; asdl_seq * seq; if ( (elem = del_target_rule(p)) // del_target && - (seq = _loop0_134_rule(p)) // _loop0_134 + (seq = _loop0_138_rule(p)) // _loop0_138 ) { - D(fprintf(stderr, "%*c+ _gather_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_138")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_133[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_134")); + D(fprintf(stderr, "%*c%s _gather_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_138")); } _res = NULL; done: @@ -32220,9 +33417,9 @@ _gather_133_rule(Parser *p) return _res; } -// _loop0_136: ',' expression +// _loop0_140: ',' expression static asdl_seq * -_loop0_136_rule(Parser *p) +_loop0_140_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32248,7 +33445,7 @@ _loop0_136_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32280,7 +33477,7 @@ _loop0_136_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_136[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32297,9 +33494,9 @@ _loop0_136_rule(Parser *p) return _seq; } -// _gather_135: expression _loop0_136 +// _gather_139: expression _loop0_140 static asdl_seq * -_gather_135_rule(Parser *p) +_gather_139_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32311,27 +33508,27 @@ _gather_135_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_136 + { // expression _loop0_140 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c> _gather_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_136_rule(p)) // _loop0_136 + (seq = _loop0_140_rule(p)) // _loop0_140 ) { - D(fprintf(stderr, "%*c+ _gather_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c+ _gather_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_135[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_136")); + D(fprintf(stderr, "%*c%s _gather_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_140")); } _res = NULL; done: @@ -32339,9 +33536,9 @@ _gather_135_rule(Parser *p) return _res; } -// _loop0_138: ',' expression +// _loop0_142: ',' expression static asdl_seq * -_loop0_138_rule(Parser *p) +_loop0_142_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32367,7 +33564,7 @@ _loop0_138_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32399,7 +33596,7 @@ _loop0_138_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_138[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32416,9 +33613,9 @@ _loop0_138_rule(Parser *p) return _seq; } -// _gather_137: expression _loop0_138 +// _gather_141: expression _loop0_142 static asdl_seq * -_gather_137_rule(Parser *p) +_gather_141_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32430,27 +33627,27 @@ _gather_137_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_138 + { // expression _loop0_142 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c> _gather_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_138_rule(p)) // _loop0_138 + (seq = _loop0_142_rule(p)) // _loop0_142 ) { - D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c+ _gather_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_137[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_138")); + D(fprintf(stderr, "%*c%s _gather_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_142")); } _res = NULL; done: @@ -32458,9 +33655,9 @@ _gather_137_rule(Parser *p) return _res; } -// _loop0_140: ',' expression +// _loop0_144: ',' expression static asdl_seq * -_loop0_140_rule(Parser *p) +_loop0_144_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32486,7 +33683,7 @@ _loop0_140_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32518,7 +33715,7 @@ _loop0_140_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_144[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32535,9 +33732,9 @@ _loop0_140_rule(Parser *p) return _seq; } -// _gather_139: expression _loop0_140 +// _gather_143: expression _loop0_144 static asdl_seq * -_gather_139_rule(Parser *p) +_gather_143_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32549,27 +33746,27 @@ _gather_139_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_140 + { // expression _loop0_144 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c> _gather_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_144")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_140_rule(p)) // _loop0_140 + (seq = _loop0_144_rule(p)) // _loop0_144 ) { - D(fprintf(stderr, "%*c+ _gather_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c+ _gather_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_144")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_139[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_140")); + D(fprintf(stderr, "%*c%s _gather_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_144")); } _res = NULL; done: @@ -32577,9 +33774,9 @@ _gather_139_rule(Parser *p) return _res; } -// _loop0_142: ',' expression +// _loop0_146: ',' expression static asdl_seq * -_loop0_142_rule(Parser *p) +_loop0_146_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32605,7 +33802,7 @@ _loop0_142_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _loop0_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty elem; while ( @@ -32637,7 +33834,7 @@ _loop0_142_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_146[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -32654,9 +33851,9 @@ _loop0_142_rule(Parser *p) return _seq; } -// _gather_141: expression _loop0_142 +// _gather_145: expression _loop0_146 static asdl_seq * -_gather_141_rule(Parser *p) +_gather_145_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32668,27 +33865,27 @@ _gather_141_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // expression _loop0_142 + { // expression _loop0_146 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c> _gather_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_146")); expr_ty elem; asdl_seq * seq; if ( (elem = expression_rule(p)) // expression && - (seq = _loop0_142_rule(p)) // _loop0_142 + (seq = _loop0_146_rule(p)) // _loop0_146 ) { - D(fprintf(stderr, "%*c+ _gather_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c+ _gather_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_146")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_141[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_142")); + D(fprintf(stderr, "%*c%s _gather_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_146")); } _res = NULL; done: @@ -32696,9 +33893,9 @@ _gather_141_rule(Parser *p) return _res; } -// _tmp_143: NEWLINE INDENT +// _tmp_147: NEWLINE INDENT static void * -_tmp_143_rule(Parser *p) +_tmp_147_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32715,7 +33912,7 @@ _tmp_143_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); Token * indent_var; Token * newline_var; if ( @@ -32724,12 +33921,12 @@ _tmp_143_rule(Parser *p) (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' ) { - D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); _res = _PyPegen_dummy_name(p, newline_var, indent_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT")); } _res = NULL; @@ -32738,9 +33935,9 @@ _tmp_143_rule(Parser *p) return _res; } -// _tmp_144: args | expression for_if_clauses +// _tmp_148: args | expression for_if_clauses static void * -_tmp_144_rule(Parser *p) +_tmp_148_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32757,18 +33954,18 @@ _tmp_144_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); expr_ty args_var; if ( (args_var = args_rule(p)) // args ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); _res = args_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); } { // expression for_if_clauses @@ -32776,7 +33973,7 @@ _tmp_144_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); expr_ty expression_var; asdl_comprehension_seq* for_if_clauses_var; if ( @@ -32785,12 +33982,12 @@ _tmp_144_rule(Parser *p) (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses ) { - D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); } _res = NULL; @@ -32799,9 +33996,9 @@ _tmp_144_rule(Parser *p) return _res; } -// _tmp_145: args ',' +// _tmp_149: args ',' static void * -_tmp_145_rule(Parser *p) +_tmp_149_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32818,7 +34015,7 @@ _tmp_145_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','")); Token * _literal; expr_ty args_var; if ( @@ -32827,12 +34024,12 @@ _tmp_145_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','")); _res = _PyPegen_dummy_name(p, args_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','")); } _res = NULL; @@ -32841,9 +34038,9 @@ _tmp_145_rule(Parser *p) return _res; } -// _tmp_146: ',' | ')' +// _tmp_150: ',' | ')' static void * -_tmp_146_rule(Parser *p) +_tmp_150_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32860,18 +34057,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -32879,18 +34076,18 @@ _tmp_146_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } _res = NULL; @@ -32899,9 +34096,9 @@ _tmp_146_rule(Parser *p) return _res; } -// _tmp_147: 'True' | 'False' | 'None' +// _tmp_151: 'True' | 'False' | 'None' static void * -_tmp_147_rule(Parser *p) +_tmp_151_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32918,18 +34115,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'False' @@ -32937,18 +34134,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } { // 'None' @@ -32956,18 +34153,18 @@ _tmp_147_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } _res = NULL; @@ -32976,9 +34173,9 @@ _tmp_147_rule(Parser *p) return _res; } -// _tmp_148: NAME '=' +// _tmp_152: NAME '=' static void * -_tmp_148_rule(Parser *p) +_tmp_152_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -32995,7 +34192,7 @@ _tmp_148_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='")); Token * _literal; expr_ty name_var; if ( @@ -33004,12 +34201,12 @@ _tmp_148_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='")); _res = _PyPegen_dummy_name(p, name_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '='")); } _res = NULL; @@ -33018,9 +34215,9 @@ _tmp_148_rule(Parser *p) return _res; } -// _tmp_149: NAME STRING | SOFT_KEYWORD +// _tmp_153: NAME STRING | SOFT_KEYWORD static void * -_tmp_149_rule(Parser *p) +_tmp_153_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33037,7 +34234,7 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING")); expr_ty name_var; expr_ty string_var; if ( @@ -33046,12 +34243,12 @@ _tmp_149_rule(Parser *p) (string_var = _PyPegen_string_token(p)) // STRING ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING")); _res = _PyPegen_dummy_name(p, name_var, string_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME STRING")); } { // SOFT_KEYWORD @@ -33059,18 +34256,18 @@ _tmp_149_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); expr_ty soft_keyword_var; if ( (soft_keyword_var = _PyPegen_soft_keyword_token(p)) // SOFT_KEYWORD ) { - D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); + D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD")); _res = soft_keyword_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "SOFT_KEYWORD")); } _res = NULL; @@ -33079,9 +34276,9 @@ _tmp_149_rule(Parser *p) return _res; } -// _tmp_150: 'else' | ':' +// _tmp_154: 'else' | ':' static void * -_tmp_150_rule(Parser *p) +_tmp_154_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33098,18 +34295,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 644)) // token='else' + (_keyword = _PyPegen_expect_token(p, 645)) // token='else' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else'")); } { // ':' @@ -33117,18 +34314,18 @@ _tmp_150_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -33137,9 +34334,67 @@ _tmp_150_rule(Parser *p) return _res; } -// _tmp_151: '=' | ':=' +// _tmp_155: FSTRING_MIDDLE | fstring_replacement_field static void * -_tmp_151_rule(Parser *p) +_tmp_155_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // FSTRING_MIDDLE + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + Token * fstring_middle_var; + if ( + (fstring_middle_var = _PyPegen_expect_token(p, FSTRING_MIDDLE)) // token='FSTRING_MIDDLE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "FSTRING_MIDDLE")); + _res = fstring_middle_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE")); + } + { // fstring_replacement_field + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + expr_ty fstring_replacement_field_var; + if ( + (fstring_replacement_field_var = fstring_replacement_field_rule(p)) // fstring_replacement_field + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring_replacement_field")); + _res = fstring_replacement_field_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_replacement_field")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_156: '=' | ':=' +static void * +_tmp_156_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33156,18 +34411,18 @@ _tmp_151_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -33175,18 +34430,18 @@ _tmp_151_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -33195,9 +34450,9 @@ _tmp_151_rule(Parser *p) return _res; } -// _tmp_152: list | tuple | genexp | 'True' | 'None' | 'False' +// _tmp_157: list | tuple | genexp | 'True' | 'None' | 'False' static void * -_tmp_152_rule(Parser *p) +_tmp_157_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33214,18 +34469,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); expr_ty list_var; if ( (list_var = list_rule(p)) // list ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); _res = list_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); } { // tuple @@ -33233,18 +34488,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); expr_ty tuple_var; if ( (tuple_var = tuple_rule(p)) // tuple ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); _res = tuple_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); } { // genexp @@ -33252,18 +34507,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); expr_ty genexp_var; if ( (genexp_var = genexp_rule(p)) // genexp ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); _res = genexp_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); } { // 'True' @@ -33271,18 +34526,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 600)) // token='True' + (_keyword = _PyPegen_expect_token(p, 601)) // token='True' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); } { // 'None' @@ -33290,18 +34545,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 601)) // token='None' + (_keyword = _PyPegen_expect_token(p, 602)) // token='None' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); } { // 'False' @@ -33309,18 +34564,18 @@ _tmp_152_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 602)) // token='False' + (_keyword = _PyPegen_expect_token(p, 603)) // token='False' ) { - D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); } _res = NULL; @@ -33329,9 +34584,9 @@ _tmp_152_rule(Parser *p) return _res; } -// _tmp_153: '=' | ':=' +// _tmp_158: '=' | ':=' static void * -_tmp_153_rule(Parser *p) +_tmp_158_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33348,18 +34603,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); } { // ':=' @@ -33367,18 +34622,18 @@ _tmp_153_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 53)) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); + D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_153[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='")); } _res = NULL; @@ -33387,9 +34642,9 @@ _tmp_153_rule(Parser *p) return _res; } -// _loop0_154: star_named_expressions +// _loop0_159: star_named_expressions static asdl_seq * -_loop0_154_rule(Parser *p) +_loop0_159_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33415,7 +34670,7 @@ _loop0_154_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + D(fprintf(stderr, "%*c> _loop0_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); asdl_expr_seq* star_named_expressions_var; while ( (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions @@ -33438,7 +34693,7 @@ _loop0_154_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_154[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_159[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33455,9 +34710,9 @@ _loop0_154_rule(Parser *p) return _seq; } -// _loop0_155: (star_targets '=') +// _loop0_160: (star_targets '=') static asdl_seq * -_loop0_155_rule(Parser *p) +_loop0_160_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33483,13 +34738,13 @@ _loop0_155_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_238_var; + D(fprintf(stderr, "%*c> _loop0_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_259_var; while ( - (_tmp_238_var = _tmp_238_rule(p)) // star_targets '=' + (_tmp_259_var = _tmp_259_rule(p)) // star_targets '=' ) { - _res = _tmp_238_var; + _res = _tmp_259_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33506,7 +34761,7 @@ _loop0_155_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_155[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_160[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33523,9 +34778,9 @@ _loop0_155_rule(Parser *p) return _seq; } -// _loop0_156: (star_targets '=') +// _loop0_161: (star_targets '=') static asdl_seq * -_loop0_156_rule(Parser *p) +_loop0_161_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33551,13 +34806,13 @@ _loop0_156_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); - void *_tmp_239_var; + D(fprintf(stderr, "%*c> _loop0_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_260_var; while ( - (_tmp_239_var = _tmp_239_rule(p)) // star_targets '=' + (_tmp_260_var = _tmp_260_rule(p)) // star_targets '=' ) { - _res = _tmp_239_var; + _res = _tmp_260_var; if (_n == _children_capacity) { _children_capacity *= 2; void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); @@ -33574,7 +34829,7 @@ _loop0_156_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_156[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_161[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33591,9 +34846,9 @@ _loop0_156_rule(Parser *p) return _seq; } -// _tmp_157: yield_expr | star_expressions +// _tmp_162: yield_expr | star_expressions static void * -_tmp_157_rule(Parser *p) +_tmp_162_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33610,18 +34865,18 @@ _tmp_157_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); expr_ty yield_expr_var; if ( (yield_expr_var = yield_expr_rule(p)) // yield_expr ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); _res = yield_expr_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); } { // star_expressions @@ -33629,18 +34884,18 @@ _tmp_157_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); expr_ty star_expressions_var; if ( (star_expressions_var = star_expressions_rule(p)) // star_expressions ) { - D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); _res = star_expressions_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_157[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_162[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); } _res = NULL; @@ -33649,9 +34904,9 @@ _tmp_157_rule(Parser *p) return _res; } -// _tmp_158: '[' | '(' | '{' +// _tmp_163: '[' | '(' | '{' static void * -_tmp_158_rule(Parser *p) +_tmp_163_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33668,18 +34923,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '(' @@ -33687,18 +34942,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 7)) // token='(' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); } { // '{' @@ -33706,18 +34961,18 @@ _tmp_158_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_158[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_163[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33726,9 +34981,9 @@ _tmp_158_rule(Parser *p) return _res; } -// _tmp_159: '[' | '{' +// _tmp_164: '[' | '{' static void * -_tmp_159_rule(Parser *p) +_tmp_164_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33745,18 +35000,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -33764,18 +35019,18 @@ _tmp_159_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33784,9 +35039,9 @@ _tmp_159_rule(Parser *p) return _res; } -// _tmp_160: '[' | '{' +// _tmp_165: '[' | '{' static void * -_tmp_160_rule(Parser *p) +_tmp_165_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33803,18 +35058,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 9)) // token='[' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); } { // '{' @@ -33822,18 +35077,18 @@ _tmp_160_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 25)) // token='{' ) { - D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_165[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); } _res = NULL; @@ -33842,9 +35097,9 @@ _tmp_160_rule(Parser *p) return _res; } -// _tmp_161: slash_no_default | slash_with_default +// _tmp_166: slash_no_default | slash_with_default static void * -_tmp_161_rule(Parser *p) +_tmp_166_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33861,18 +35116,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -33880,18 +35135,18 @@ _tmp_161_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_161[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -33900,9 +35155,9 @@ _tmp_161_rule(Parser *p) return _res; } -// _loop0_162: param_maybe_default +// _loop0_167: param_maybe_default static asdl_seq * -_loop0_162_rule(Parser *p) +_loop0_167_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33928,7 +35183,7 @@ _loop0_162_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -33951,7 +35206,7 @@ _loop0_162_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_162[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_167[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -33968,9 +35223,9 @@ _loop0_162_rule(Parser *p) return _seq; } -// _loop0_163: param_no_default +// _loop0_168: param_no_default static asdl_seq * -_loop0_163_rule(Parser *p) +_loop0_168_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -33996,7 +35251,7 @@ _loop0_163_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34019,7 +35274,7 @@ _loop0_163_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_163[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_168[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34036,9 +35291,9 @@ _loop0_163_rule(Parser *p) return _seq; } -// _loop0_164: param_no_default +// _loop0_169: param_no_default static asdl_seq * -_loop0_164_rule(Parser *p) +_loop0_169_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34064,7 +35319,7 @@ _loop0_164_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34087,7 +35342,7 @@ _loop0_164_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_164[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34104,9 +35359,9 @@ _loop0_164_rule(Parser *p) return _seq; } -// _loop1_165: param_no_default +// _loop1_170: param_no_default static asdl_seq * -_loop1_165_rule(Parser *p) +_loop1_170_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34132,7 +35387,7 @@ _loop1_165_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _loop1_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; while ( (param_no_default_var = param_no_default_rule(p)) // param_no_default @@ -34155,7 +35410,7 @@ _loop1_165_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_165[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_170[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } if (_n == 0 || p->error_indicator) { @@ -34177,9 +35432,9 @@ _loop1_165_rule(Parser *p) return _seq; } -// _tmp_166: slash_no_default | slash_with_default +// _tmp_171: slash_no_default | slash_with_default static void * -_tmp_166_rule(Parser *p) +_tmp_171_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34196,18 +35451,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default")); asdl_arg_seq* slash_no_default_var; if ( (slash_no_default_var = slash_no_default_rule(p)) // slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default")); _res = slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default")); } { // slash_with_default @@ -34215,18 +35470,18 @@ _tmp_166_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); SlashWithDefault* slash_with_default_var; if ( (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); _res = slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_166[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); } _res = NULL; @@ -34235,9 +35490,9 @@ _tmp_166_rule(Parser *p) return _res; } -// _loop0_167: param_maybe_default +// _loop0_172: param_maybe_default static asdl_seq * -_loop0_167_rule(Parser *p) +_loop0_172_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34263,7 +35518,7 @@ _loop0_167_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34286,7 +35541,7 @@ _loop0_167_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_167[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34303,9 +35558,9 @@ _loop0_167_rule(Parser *p) return _seq; } -// _tmp_168: ',' | param_no_default +// _tmp_173: ',' | param_no_default static void * -_tmp_168_rule(Parser *p) +_tmp_173_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34322,18 +35577,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // param_no_default @@ -34341,18 +35596,18 @@ _tmp_168_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } _res = NULL; @@ -34361,9 +35616,9 @@ _tmp_168_rule(Parser *p) return _res; } -// _loop0_169: param_maybe_default +// _loop0_174: param_maybe_default static asdl_seq * -_loop0_169_rule(Parser *p) +_loop0_174_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34389,7 +35644,7 @@ _loop0_169_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34412,7 +35667,7 @@ _loop0_169_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_169[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34429,9 +35684,9 @@ _loop0_169_rule(Parser *p) return _seq; } -// _loop1_170: param_maybe_default +// _loop1_175: param_maybe_default static asdl_seq * -_loop1_170_rule(Parser *p) +_loop1_175_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34457,7 +35712,7 @@ _loop1_170_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34480,7 +35735,7 @@ _loop1_170_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_170[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_175[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -34502,9 +35757,9 @@ _loop1_170_rule(Parser *p) return _seq; } -// _tmp_171: ')' | ',' +// _tmp_176: ')' | ',' static void * -_tmp_171_rule(Parser *p) +_tmp_176_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34521,18 +35776,18 @@ _tmp_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' @@ -34540,18 +35795,18 @@ _tmp_171_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_171[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34560,9 +35815,9 @@ _tmp_171_rule(Parser *p) return _res; } -// _tmp_172: ')' | ',' (')' | '**') +// _tmp_177: ')' | ',' (')' | '**') static void * -_tmp_172_rule(Parser *p) +_tmp_177_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34579,18 +35834,18 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ',' (')' | '**') @@ -34598,21 +35853,21 @@ _tmp_172_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + D(fprintf(stderr, "%*c> _tmp_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); Token * _literal; - void *_tmp_240_var; + void *_tmp_261_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_240_var = _tmp_240_rule(p)) // ')' | '**' + (_tmp_261_var = _tmp_261_rule(p)) // ')' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_240_var); + D(fprintf(stderr, "%*c+ _tmp_177[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_261_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_172[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_177[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); } _res = NULL; @@ -34621,9 +35876,9 @@ _tmp_172_rule(Parser *p) return _res; } -// _tmp_173: param_no_default | ',' +// _tmp_178: param_no_default | ',' static void * -_tmp_173_rule(Parser *p) +_tmp_178_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34640,18 +35895,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -34659,18 +35914,18 @@ _tmp_173_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_173[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_173[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34679,9 +35934,9 @@ _tmp_173_rule(Parser *p) return _res; } -// _loop0_174: param_maybe_default +// _loop0_179: param_maybe_default static asdl_seq * -_loop0_174_rule(Parser *p) +_loop0_179_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34707,7 +35962,7 @@ _loop0_174_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_174[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); NameDefaultPair* param_maybe_default_var; while ( (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default @@ -34730,7 +35985,7 @@ _loop0_174_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_179[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -34747,9 +36002,9 @@ _loop0_174_rule(Parser *p) return _seq; } -// _tmp_175: param_no_default | ',' +// _tmp_180: param_no_default | ',' static void * -_tmp_175_rule(Parser *p) +_tmp_180_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34766,18 +36021,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); arg_ty param_no_default_var; if ( (param_no_default_var = param_no_default_rule(p)) // param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default")); _res = param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); } { // ',' @@ -34785,18 +36040,18 @@ _tmp_175_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_180[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_180[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -34805,9 +36060,9 @@ _tmp_175_rule(Parser *p) return _res; } -// _tmp_176: '*' | '**' | '/' +// _tmp_181: '*' | '**' | '/' static void * -_tmp_176_rule(Parser *p) +_tmp_181_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34824,18 +36079,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -34843,18 +36098,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -34862,18 +36117,18 @@ _tmp_176_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_176[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_176[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_181[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_176[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_181[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -34882,9 +36137,9 @@ _tmp_176_rule(Parser *p) return _res; } -// _loop1_177: param_with_default +// _loop1_182: param_with_default static asdl_seq * -_loop1_177_rule(Parser *p) +_loop1_182_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34910,7 +36165,7 @@ _loop1_177_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_177[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + D(fprintf(stderr, "%*c> _loop1_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); NameDefaultPair* param_with_default_var; while ( (param_with_default_var = param_with_default_rule(p)) // param_with_default @@ -34933,7 +36188,7 @@ _loop1_177_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_177[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_182[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -34955,9 +36210,9 @@ _loop1_177_rule(Parser *p) return _seq; } -// _tmp_178: lambda_slash_no_default | lambda_slash_with_default +// _tmp_183: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_178_rule(Parser *p) +_tmp_183_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -34974,18 +36229,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -34993,18 +36248,18 @@ _tmp_178_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_178[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_178[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_183[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_178[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_183[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -35013,9 +36268,9 @@ _tmp_178_rule(Parser *p) return _res; } -// _loop0_179: lambda_param_maybe_default +// _loop0_184: lambda_param_maybe_default static asdl_seq * -_loop0_179_rule(Parser *p) +_loop0_184_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35041,7 +36296,7 @@ _loop0_179_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_179[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35064,7 +36319,7 @@ _loop0_179_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_179[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_184[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35081,9 +36336,9 @@ _loop0_179_rule(Parser *p) return _seq; } -// _loop0_180: lambda_param_no_default +// _loop0_185: lambda_param_no_default static asdl_seq * -_loop0_180_rule(Parser *p) +_loop0_185_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35109,7 +36364,7 @@ _loop0_180_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_180[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -35132,7 +36387,7 @@ _loop0_180_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_180[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_185[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35149,9 +36404,9 @@ _loop0_180_rule(Parser *p) return _seq; } -// _loop0_181: lambda_param_no_default +// _loop0_186: lambda_param_no_default static asdl_seq * -_loop0_181_rule(Parser *p) +_loop0_186_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35177,7 +36432,7 @@ _loop0_181_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_181[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _loop0_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; while ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default @@ -35200,7 +36455,7 @@ _loop0_181_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_181[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_186[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35217,9 +36472,9 @@ _loop0_181_rule(Parser *p) return _seq; } -// _loop0_183: ',' lambda_param +// _loop0_188: ',' lambda_param static asdl_seq * -_loop0_183_rule(Parser *p) +_loop0_188_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35245,7 +36500,7 @@ _loop0_183_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_183[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); + D(fprintf(stderr, "%*c> _loop0_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param")); Token * _literal; arg_ty elem; while ( @@ -35277,7 +36532,7 @@ _loop0_183_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_183[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_188[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35294,9 +36549,9 @@ _loop0_183_rule(Parser *p) return _seq; } -// _gather_182: lambda_param _loop0_183 +// _gather_187: lambda_param _loop0_188 static asdl_seq * -_gather_182_rule(Parser *p) +_gather_187_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35308,27 +36563,27 @@ _gather_182_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // lambda_param _loop0_183 + { // lambda_param _loop0_188 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_182[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c> _gather_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_188")); arg_ty elem; asdl_seq * seq; if ( (elem = lambda_param_rule(p)) // lambda_param && - (seq = _loop0_183_rule(p)) // _loop0_183 + (seq = _loop0_188_rule(p)) // _loop0_188 ) { - D(fprintf(stderr, "%*c+ _gather_182[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c+ _gather_187[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_188")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_182[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_183")); + D(fprintf(stderr, "%*c%s _gather_187[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_188")); } _res = NULL; done: @@ -35336,9 +36591,9 @@ _gather_182_rule(Parser *p) return _res; } -// _tmp_184: lambda_slash_no_default | lambda_slash_with_default +// _tmp_189: lambda_slash_no_default | lambda_slash_with_default static void * -_tmp_184_rule(Parser *p) +_tmp_189_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35355,18 +36610,18 @@ _tmp_184_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c> _tmp_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); asdl_arg_seq* lambda_slash_no_default_var; if ( (lambda_slash_no_default_var = lambda_slash_no_default_rule(p)) // lambda_slash_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); + D(fprintf(stderr, "%*c+ _tmp_189[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default")); _res = lambda_slash_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_189[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default")); } { // lambda_slash_with_default @@ -35374,18 +36629,18 @@ _tmp_184_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c> _tmp_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); SlashWithDefault* lambda_slash_with_default_var; if ( (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default ) { - D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + D(fprintf(stderr, "%*c+ _tmp_189[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); _res = lambda_slash_with_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_184[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_189[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); } _res = NULL; @@ -35394,9 +36649,9 @@ _tmp_184_rule(Parser *p) return _res; } -// _loop0_185: lambda_param_maybe_default +// _loop0_190: lambda_param_maybe_default static asdl_seq * -_loop0_185_rule(Parser *p) +_loop0_190_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35422,7 +36677,7 @@ _loop0_185_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35445,7 +36700,7 @@ _loop0_185_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_185[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_190[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35462,9 +36717,9 @@ _loop0_185_rule(Parser *p) return _seq; } -// _tmp_186: ',' | lambda_param_no_default +// _tmp_191: ',' | lambda_param_no_default static void * -_tmp_186_rule(Parser *p) +_tmp_191_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35481,18 +36736,18 @@ _tmp_186_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_186[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_186[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // lambda_param_no_default @@ -35500,18 +36755,18 @@ _tmp_186_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_186[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_186[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_186[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } _res = NULL; @@ -35520,9 +36775,9 @@ _tmp_186_rule(Parser *p) return _res; } -// _loop0_187: lambda_param_maybe_default +// _loop0_192: lambda_param_maybe_default static asdl_seq * -_loop0_187_rule(Parser *p) +_loop0_192_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35548,7 +36803,7 @@ _loop0_187_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_187[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35571,7 +36826,7 @@ _loop0_187_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_187[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_192[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35588,9 +36843,9 @@ _loop0_187_rule(Parser *p) return _seq; } -// _loop1_188: lambda_param_maybe_default +// _loop1_193: lambda_param_maybe_default static asdl_seq * -_loop1_188_rule(Parser *p) +_loop1_193_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35616,7 +36871,7 @@ _loop1_188_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_188[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop1_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35639,7 +36894,7 @@ _loop1_188_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_188[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_193[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } if (_n == 0 || p->error_indicator) { @@ -35661,9 +36916,9 @@ _loop1_188_rule(Parser *p) return _seq; } -// _loop1_189: lambda_param_with_default +// _loop1_194: lambda_param_with_default static asdl_seq * -_loop1_189_rule(Parser *p) +_loop1_194_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35689,7 +36944,7 @@ _loop1_189_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_189[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + D(fprintf(stderr, "%*c> _loop1_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); NameDefaultPair* lambda_param_with_default_var; while ( (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default @@ -35712,7 +36967,7 @@ _loop1_189_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_189[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_194[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); } if (_n == 0 || p->error_indicator) { @@ -35734,9 +36989,9 @@ _loop1_189_rule(Parser *p) return _seq; } -// _tmp_190: ':' | ',' (':' | '**') +// _tmp_195: ':' | ',' (':' | '**') static void * -_tmp_190_rule(Parser *p) +_tmp_195_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35753,18 +37008,18 @@ _tmp_190_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // ',' (':' | '**') @@ -35772,21 +37027,21 @@ _tmp_190_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_190[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); Token * _literal; - void *_tmp_241_var; + void *_tmp_262_var; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (_tmp_241_var = _tmp_241_rule(p)) // ':' | '**' + (_tmp_262_var = _tmp_262_rule(p)) // ':' | '**' ) { - D(fprintf(stderr, "%*c+ _tmp_190[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); - _res = _PyPegen_dummy_name(p, _literal, _tmp_241_var); + D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_262_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_190[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); } _res = NULL; @@ -35795,9 +37050,9 @@ _tmp_190_rule(Parser *p) return _res; } -// _tmp_191: lambda_param_no_default | ',' +// _tmp_196: lambda_param_no_default | ',' static void * -_tmp_191_rule(Parser *p) +_tmp_196_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35814,18 +37069,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -35833,18 +37088,18 @@ _tmp_191_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_191[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_191[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_191[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_196[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35853,9 +37108,9 @@ _tmp_191_rule(Parser *p) return _res; } -// _loop0_192: lambda_param_maybe_default +// _loop0_197: lambda_param_maybe_default static asdl_seq * -_loop0_192_rule(Parser *p) +_loop0_197_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35881,7 +37136,7 @@ _loop0_192_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_192[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + D(fprintf(stderr, "%*c> _loop0_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); NameDefaultPair* lambda_param_maybe_default_var; while ( (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default @@ -35904,7 +37159,7 @@ _loop0_192_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_192[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_197[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -35921,9 +37176,9 @@ _loop0_192_rule(Parser *p) return _seq; } -// _tmp_193: lambda_param_no_default | ',' +// _tmp_198: lambda_param_no_default | ',' static void * -_tmp_193_rule(Parser *p) +_tmp_198_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35940,18 +37195,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); arg_ty lambda_param_no_default_var; if ( (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); _res = lambda_param_no_default_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); } { // ',' @@ -35959,18 +37214,18 @@ _tmp_193_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_193[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_193[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_193[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_198[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -35979,9 +37234,9 @@ _tmp_193_rule(Parser *p) return _res; } -// _tmp_194: '*' | '**' | '/' +// _tmp_199: '*' | '**' | '/' static void * -_tmp_194_rule(Parser *p) +_tmp_199_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -35998,18 +37253,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 16)) // token='*' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); } { // '**' @@ -36017,18 +37272,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } { // '/' @@ -36036,18 +37291,18 @@ _tmp_194_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_194[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c> _tmp_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 17)) // token='/' ) { - D(fprintf(stderr, "%*c+ _tmp_194[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); + D(fprintf(stderr, "%*c+ _tmp_199[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_194[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_199[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'")); } _res = NULL; @@ -36056,9 +37311,9 @@ _tmp_194_rule(Parser *p) return _res; } -// _tmp_195: ',' | ')' | ':' +// _tmp_200: ',' | ')' | ':' static void * -_tmp_195_rule(Parser *p) +_tmp_200_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36075,18 +37330,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } { // ')' @@ -36094,18 +37349,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // ':' @@ -36113,18 +37368,18 @@ _tmp_195_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_195[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_195[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_195[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_200[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -36133,9 +37388,9 @@ _tmp_195_rule(Parser *p) return _res; } -// _loop0_197: ',' (expression ['as' star_target]) +// _loop0_202: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_197_rule(Parser *p) +_loop0_202_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36161,13 +37416,13 @@ _loop0_197_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_197[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_242_rule(p)) // expression ['as' star_target] + (elem = _tmp_263_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -36193,7 +37448,7 @@ _loop0_197_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_197[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_202[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36210,9 +37465,9 @@ _loop0_197_rule(Parser *p) return _seq; } -// _gather_196: (expression ['as' star_target]) _loop0_197 +// _gather_201: (expression ['as' star_target]) _loop0_202 static asdl_seq * -_gather_196_rule(Parser *p) +_gather_201_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36224,27 +37479,27 @@ _gather_196_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_197 + { // (expression ['as' star_target]) _loop0_202 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_196[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c> _gather_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_242_rule(p)) // expression ['as' star_target] + (elem = _tmp_263_rule(p)) // expression ['as' star_target] && - (seq = _loop0_197_rule(p)) // _loop0_197 + (seq = _loop0_202_rule(p)) // _loop0_202 ) { - D(fprintf(stderr, "%*c+ _gather_196[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c+ _gather_201[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_196[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_197")); + D(fprintf(stderr, "%*c%s _gather_201[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_202")); } _res = NULL; done: @@ -36252,9 +37507,9 @@ _gather_196_rule(Parser *p) return _res; } -// _loop0_199: ',' (expressions ['as' star_target]) +// _loop0_204: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_199_rule(Parser *p) +_loop0_204_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36280,13 +37535,13 @@ _loop0_199_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_199[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_243_rule(p)) // expressions ['as' star_target] + (elem = _tmp_264_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -36312,7 +37567,7 @@ _loop0_199_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_199[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_204[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36329,9 +37584,9 @@ _loop0_199_rule(Parser *p) return _seq; } -// _gather_198: (expressions ['as' star_target]) _loop0_199 +// _gather_203: (expressions ['as' star_target]) _loop0_204 static asdl_seq * -_gather_198_rule(Parser *p) +_gather_203_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36343,27 +37598,27 @@ _gather_198_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_199 + { // (expressions ['as' star_target]) _loop0_204 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_198[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c> _gather_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_243_rule(p)) // expressions ['as' star_target] + (elem = _tmp_264_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_199_rule(p)) // _loop0_199 + (seq = _loop0_204_rule(p)) // _loop0_204 ) { - D(fprintf(stderr, "%*c+ _gather_198[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c+ _gather_203[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_198[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_199")); + D(fprintf(stderr, "%*c%s _gather_203[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_204")); } _res = NULL; done: @@ -36371,9 +37626,9 @@ _gather_198_rule(Parser *p) return _res; } -// _loop0_201: ',' (expression ['as' star_target]) +// _loop0_206: ',' (expression ['as' star_target]) static asdl_seq * -_loop0_201_rule(Parser *p) +_loop0_206_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36399,13 +37654,13 @@ _loop0_201_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_201[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expression ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_244_rule(p)) // expression ['as' star_target] + (elem = _tmp_265_rule(p)) // expression ['as' star_target] ) { _res = elem; @@ -36431,7 +37686,7 @@ _loop0_201_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_201[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_206[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36448,9 +37703,9 @@ _loop0_201_rule(Parser *p) return _seq; } -// _gather_200: (expression ['as' star_target]) _loop0_201 +// _gather_205: (expression ['as' star_target]) _loop0_206 static asdl_seq * -_gather_200_rule(Parser *p) +_gather_205_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36462,27 +37717,27 @@ _gather_200_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expression ['as' star_target]) _loop0_201 + { // (expression ['as' star_target]) _loop0_206 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_200[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c> _gather_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_244_rule(p)) // expression ['as' star_target] + (elem = _tmp_265_rule(p)) // expression ['as' star_target] && - (seq = _loop0_201_rule(p)) // _loop0_201 + (seq = _loop0_206_rule(p)) // _loop0_206 ) { - D(fprintf(stderr, "%*c+ _gather_200[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c+ _gather_205[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_200[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_201")); + D(fprintf(stderr, "%*c%s _gather_205[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_206")); } _res = NULL; done: @@ -36490,9 +37745,9 @@ _gather_200_rule(Parser *p) return _res; } -// _loop0_203: ',' (expressions ['as' star_target]) +// _loop0_208: ',' (expressions ['as' star_target]) static asdl_seq * -_loop0_203_rule(Parser *p) +_loop0_208_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36518,13 +37773,13 @@ _loop0_203_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_203[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); + D(fprintf(stderr, "%*c> _loop0_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_245_rule(p)) // expressions ['as' star_target] + (elem = _tmp_266_rule(p)) // expressions ['as' star_target] ) { _res = elem; @@ -36550,7 +37805,7 @@ _loop0_203_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_203[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_208[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36567,9 +37822,9 @@ _loop0_203_rule(Parser *p) return _seq; } -// _gather_202: (expressions ['as' star_target]) _loop0_203 +// _gather_207: (expressions ['as' star_target]) _loop0_208 static asdl_seq * -_gather_202_rule(Parser *p) +_gather_207_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36581,27 +37836,27 @@ _gather_202_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (expressions ['as' star_target]) _loop0_203 + { // (expressions ['as' star_target]) _loop0_208 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_202[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c> _gather_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_245_rule(p)) // expressions ['as' star_target] + (elem = _tmp_266_rule(p)) // expressions ['as' star_target] && - (seq = _loop0_203_rule(p)) // _loop0_203 + (seq = _loop0_208_rule(p)) // _loop0_208 ) { - D(fprintf(stderr, "%*c+ _gather_202[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c+ _gather_207[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_202[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_203")); + D(fprintf(stderr, "%*c%s _gather_207[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_208")); } _res = NULL; done: @@ -36609,9 +37864,9 @@ _gather_202_rule(Parser *p) return _res; } -// _tmp_204: 'except' | 'finally' +// _tmp_209: 'except' | 'finally' static void * -_tmp_204_rule(Parser *p) +_tmp_209_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36628,18 +37883,18 @@ _tmp_204_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c> _tmp_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 636)) // token='except' + (_keyword = _PyPegen_expect_token(p, 637)) // token='except' ) { - D(fprintf(stderr, "%*c+ _tmp_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); + D(fprintf(stderr, "%*c+ _tmp_209[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_204[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_209[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except'")); } { // 'finally' @@ -36647,18 +37902,18 @@ _tmp_204_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_204[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c> _tmp_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'")); Token * _keyword; if ( - (_keyword = _PyPegen_expect_token(p, 632)) // token='finally' + (_keyword = _PyPegen_expect_token(p, 633)) // token='finally' ) { - D(fprintf(stderr, "%*c+ _tmp_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); + D(fprintf(stderr, "%*c+ _tmp_209[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'")); _res = _keyword; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_204[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_209[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally'")); } _res = NULL; @@ -36667,9 +37922,9 @@ _tmp_204_rule(Parser *p) return _res; } -// _loop0_205: block +// _loop0_210: block static asdl_seq * -_loop0_205_rule(Parser *p) +_loop0_210_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36695,7 +37950,7 @@ _loop0_205_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_205[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -36718,7 +37973,7 @@ _loop0_205_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_205[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_210[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36735,9 +37990,9 @@ _loop0_205_rule(Parser *p) return _seq; } -// _loop1_206: except_block +// _loop1_211: except_block static asdl_seq * -_loop1_206_rule(Parser *p) +_loop1_211_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36763,7 +38018,7 @@ _loop1_206_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_206[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + D(fprintf(stderr, "%*c> _loop1_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); excepthandler_ty except_block_var; while ( (except_block_var = except_block_rule(p)) // except_block @@ -36786,7 +38041,7 @@ _loop1_206_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_206[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_211[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); } if (_n == 0 || p->error_indicator) { @@ -36808,9 +38063,9 @@ _loop1_206_rule(Parser *p) return _seq; } -// _tmp_207: 'as' NAME +// _tmp_212: 'as' NAME static void * -_tmp_207_rule(Parser *p) +_tmp_212_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36827,21 +38082,21 @@ _tmp_207_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_207[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_207[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_207[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -36850,9 +38105,9 @@ _tmp_207_rule(Parser *p) return _res; } -// _loop0_208: block +// _loop0_213: block static asdl_seq * -_loop0_208_rule(Parser *p) +_loop0_213_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36878,7 +38133,7 @@ _loop0_208_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_208[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); + D(fprintf(stderr, "%*c> _loop0_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block")); asdl_stmt_seq* block_var; while ( (block_var = block_rule(p)) // block @@ -36901,7 +38156,7 @@ _loop0_208_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_208[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_213[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -36918,9 +38173,9 @@ _loop0_208_rule(Parser *p) return _seq; } -// _loop1_209: except_star_block +// _loop1_214: except_star_block static asdl_seq * -_loop1_209_rule(Parser *p) +_loop1_214_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -36946,7 +38201,7 @@ _loop1_209_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop1_209[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); + D(fprintf(stderr, "%*c> _loop1_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_star_block")); excepthandler_ty except_star_block_var; while ( (except_star_block_var = except_star_block_rule(p)) // except_star_block @@ -36969,7 +38224,7 @@ _loop1_209_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop1_209[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop1_214[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); } if (_n == 0 || p->error_indicator) { @@ -36991,9 +38246,9 @@ _loop1_209_rule(Parser *p) return _seq; } -// _tmp_210: expression ['as' NAME] +// _tmp_215: expression ['as' NAME] static void * -_tmp_210_rule(Parser *p) +_tmp_215_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37010,22 +38265,22 @@ _tmp_210_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_210[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c> _tmp_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_246_rule(p), !p->error_indicator) // ['as' NAME] + (_opt_var = _tmp_267_rule(p), !p->error_indicator) // ['as' NAME] ) { - D(fprintf(stderr, "%*c+ _tmp_210[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); + D(fprintf(stderr, "%*c+ _tmp_215[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_210[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_215[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' NAME]")); } _res = NULL; @@ -37034,9 +38289,9 @@ _tmp_210_rule(Parser *p) return _res; } -// _tmp_211: 'as' NAME +// _tmp_216: 'as' NAME static void * -_tmp_211_rule(Parser *p) +_tmp_216_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37053,21 +38308,21 @@ _tmp_211_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_211[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_211[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_211[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_216[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37076,9 +38331,9 @@ _tmp_211_rule(Parser *p) return _res; } -// _tmp_212: 'as' NAME +// _tmp_217: 'as' NAME static void * -_tmp_212_rule(Parser *p) +_tmp_217_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37095,21 +38350,21 @@ _tmp_212_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_212[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_212[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_217[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_212[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_217[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37118,9 +38373,9 @@ _tmp_212_rule(Parser *p) return _res; } -// _tmp_213: NEWLINE | ':' +// _tmp_218: NEWLINE | ':' static void * -_tmp_213_rule(Parser *p) +_tmp_218_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37137,18 +38392,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); Token * newline_var; if ( (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); _res = newline_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); } { // ':' @@ -37156,18 +38411,18 @@ _tmp_213_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_213[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_213[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_213[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } _res = NULL; @@ -37176,9 +38431,9 @@ _tmp_213_rule(Parser *p) return _res; } -// _tmp_214: 'as' NAME +// _tmp_219: 'as' NAME static void * -_tmp_214_rule(Parser *p) +_tmp_219_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37195,21 +38450,21 @@ _tmp_214_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_214[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_214[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_214[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37218,9 +38473,9 @@ _tmp_214_rule(Parser *p) return _res; } -// _tmp_215: 'as' NAME +// _tmp_220: 'as' NAME static void * -_tmp_215_rule(Parser *p) +_tmp_220_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37237,21 +38492,21 @@ _tmp_215_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_215[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_215[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_215[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_220[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -37260,9 +38515,9 @@ _tmp_215_rule(Parser *p) return _res; } -// _tmp_216: positional_patterns ',' +// _tmp_221: positional_patterns ',' static void * -_tmp_216_rule(Parser *p) +_tmp_221_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37279,7 +38534,7 @@ _tmp_216_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_216[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c> _tmp_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); Token * _literal; asdl_pattern_seq* positional_patterns_var; if ( @@ -37288,12 +38543,12 @@ _tmp_216_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_216[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); + D(fprintf(stderr, "%*c+ _tmp_221[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','")); _res = _PyPegen_dummy_name(p, positional_patterns_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_216[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_221[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "positional_patterns ','")); } _res = NULL; @@ -37302,9 +38557,9 @@ _tmp_216_rule(Parser *p) return _res; } -// _tmp_217: '->' expression +// _tmp_222: '->' expression static void * -_tmp_217_rule(Parser *p) +_tmp_222_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37321,7 +38576,7 @@ _tmp_217_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_217[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); Token * _literal; expr_ty expression_var; if ( @@ -37330,12 +38585,12 @@ _tmp_217_rule(Parser *p) (expression_var = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_217[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); _res = _PyPegen_dummy_name(p, _literal, expression_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_217[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); } _res = NULL; @@ -37344,9 +38599,9 @@ _tmp_217_rule(Parser *p) return _res; } -// _tmp_218: '(' arguments? ')' +// _tmp_223: '(' arguments? ')' static void * -_tmp_218_rule(Parser *p) +_tmp_223_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37363,7 +38618,7 @@ _tmp_218_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_218[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -37376,12 +38631,12 @@ _tmp_218_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_218[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_218[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -37390,9 +38645,9 @@ _tmp_218_rule(Parser *p) return _res; } -// _tmp_219: '(' arguments? ')' +// _tmp_224: '(' arguments? ')' static void * -_tmp_219_rule(Parser *p) +_tmp_224_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37409,7 +38664,7 @@ _tmp_219_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_219[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); Token * _literal; Token * _literal_1; void *_opt_var; @@ -37422,12 +38677,12 @@ _tmp_219_rule(Parser *p) (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_219[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); _res = _PyPegen_dummy_name(p, _literal, _opt_var, _literal_1); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_219[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); } _res = NULL; @@ -37436,9 +38691,9 @@ _tmp_219_rule(Parser *p) return _res; } -// _loop0_221: ',' double_starred_kvpair +// _loop0_226: ',' double_starred_kvpair static asdl_seq * -_loop0_221_rule(Parser *p) +_loop0_226_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37464,7 +38719,7 @@ _loop0_221_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _loop0_221[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + D(fprintf(stderr, "%*c> _loop0_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); Token * _literal; KeyValuePair* elem; while ( @@ -37496,7 +38751,7 @@ _loop0_221_rule(Parser *p) _mark = p->mark; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _loop0_221[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _loop0_226[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); @@ -37513,9 +38768,9 @@ _loop0_221_rule(Parser *p) return _seq; } -// _gather_220: double_starred_kvpair _loop0_221 +// _gather_225: double_starred_kvpair _loop0_226 static asdl_seq * -_gather_220_rule(Parser *p) +_gather_225_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37527,27 +38782,27 @@ _gather_220_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // double_starred_kvpair _loop0_221 + { // double_starred_kvpair _loop0_226 if (p->error_indicator) { p->level--; return NULL; } - D(fprintf(stderr, "%*c> _gather_220[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c> _gather_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_226")); KeyValuePair* elem; asdl_seq * seq; if ( (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair && - (seq = _loop0_221_rule(p)) // _loop0_221 + (seq = _loop0_226_rule(p)) // _loop0_226 ) { - D(fprintf(stderr, "%*c+ _gather_220[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c+ _gather_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_226")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _gather_220[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_221")); + D(fprintf(stderr, "%*c%s _gather_225[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_226")); } _res = NULL; done: @@ -37555,9 +38810,9 @@ _gather_220_rule(Parser *p) return _res; } -// _tmp_222: '}' | ',' +// _tmp_227: '}' | ',' static void * -_tmp_222_rule(Parser *p) +_tmp_227_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37574,18 +38829,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -37593,18 +38848,18 @@ _tmp_222_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_222[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_222[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_222[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37613,9 +38868,9 @@ _tmp_222_rule(Parser *p) return _res; } -// _tmp_223: '}' | ',' +// _tmp_228: '}' | ',' static void * -_tmp_223_rule(Parser *p) +_tmp_228_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37632,18 +38887,18 @@ _tmp_223_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 26)) // token='}' ) { - D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); } { // ',' @@ -37651,18 +38906,18 @@ _tmp_223_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_223[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' ) { - D(fprintf(stderr, "%*c+ _tmp_223[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_223[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); } _res = NULL; @@ -37671,9 +38926,898 @@ _tmp_223_rule(Parser *p) return _res; } -// _tmp_224: star_targets '=' +// _tmp_229: yield_expr | star_expressions static void * -_tmp_224_rule(Parser *p) +_tmp_229_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_230: yield_expr | star_expressions +static void * +_tmp_230_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_231: '=' | '!' | ':' | '}' +static void * +_tmp_231_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='")); + } + { // '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); + } + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_232: yield_expr | star_expressions +static void * +_tmp_232_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_233: '!' | ':' | '}' +static void * +_tmp_233_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'")); + } + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_234: yield_expr | star_expressions +static void * +_tmp_234_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_235: yield_expr | star_expressions +static void * +_tmp_235_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_236: '!' NAME +static void * +_tmp_236_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_237: ':' | '}' +static void * +_tmp_237_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_238: yield_expr | star_expressions +static void * +_tmp_238_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_239: '!' NAME +static void * +_tmp_239_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _loop0_240: fstring_format_spec +static asdl_seq * +_loop0_240_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + Py_ssize_t _children_capacity = 1; + Py_ssize_t _n = 0; + { // fstring_format_spec + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec")); + expr_ty fstring_format_spec_var; + while ( + (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec + ) + { + _res = fstring_format_spec_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_240[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); + } + asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + p->level--; + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]); + PyMem_Free(_children); + p->level--; + return _seq; +} + +// _tmp_241: yield_expr | star_expressions +static void * +_tmp_241_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_242: '!' NAME +static void * +_tmp_242_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!' NAME + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + Token * _literal; + expr_ty name_var; + if ( + (_literal = _PyPegen_expect_token(p, 54)) // token='!' + && + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME")); + _res = _PyPegen_dummy_name(p, _literal, name_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!' NAME")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_243: ':' | '}' +static void * +_tmp_243_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '}' + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_244: star_targets '=' +static void * +_tmp_244_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37690,7 +39834,7 @@ _tmp_224_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_224[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty z; if ( @@ -37699,7 +39843,7 @@ _tmp_224_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_224[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37709,7 +39853,7 @@ _tmp_224_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_224[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -37718,9 +39862,9 @@ _tmp_224_rule(Parser *p) return _res; } -// _tmp_225: '.' | '...' +// _tmp_245: '.' | '...' static void * -_tmp_225_rule(Parser *p) +_tmp_245_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37737,18 +39881,18 @@ _tmp_225_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -37756,18 +39900,18 @@ _tmp_225_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_225[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_225[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_225[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -37776,9 +39920,9 @@ _tmp_225_rule(Parser *p) return _res; } -// _tmp_226: '.' | '...' +// _tmp_246: '.' | '...' static void * -_tmp_226_rule(Parser *p) +_tmp_246_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37795,18 +39939,18 @@ _tmp_226_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 23)) // token='.' ) { - D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); } { // '...' @@ -37814,18 +39958,18 @@ _tmp_226_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_226[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 52)) // token='...' ) { - D(fprintf(stderr, "%*c+ _tmp_226[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_226[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); } _res = NULL; @@ -37834,9 +39978,9 @@ _tmp_226_rule(Parser *p) return _res; } -// _tmp_227: '@' named_expression NEWLINE +// _tmp_247: '@' named_expression NEWLINE static void * -_tmp_227_rule(Parser *p) +_tmp_247_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37853,7 +39997,7 @@ _tmp_227_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_227[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); Token * _literal; expr_ty f; Token * newline_var; @@ -37865,7 +40009,7 @@ _tmp_227_rule(Parser *p) (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' ) { - D(fprintf(stderr, "%*c+ _tmp_227[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); _res = f; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37875,7 +40019,7 @@ _tmp_227_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_227[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); } _res = NULL; @@ -37884,9 +40028,9 @@ _tmp_227_rule(Parser *p) return _res; } -// _tmp_228: ',' expression +// _tmp_248: ',' expression static void * -_tmp_228_rule(Parser *p) +_tmp_248_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37903,7 +40047,7 @@ _tmp_228_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_228[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); Token * _literal; expr_ty c; if ( @@ -37912,7 +40056,7 @@ _tmp_228_rule(Parser *p) (c = expression_rule(p)) // expression ) { - D(fprintf(stderr, "%*c+ _tmp_228[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37922,7 +40066,7 @@ _tmp_228_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_228[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); } _res = NULL; @@ -37931,9 +40075,9 @@ _tmp_228_rule(Parser *p) return _res; } -// _tmp_229: ',' star_expression +// _tmp_249: ',' star_expression static void * -_tmp_229_rule(Parser *p) +_tmp_249_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37950,7 +40094,7 @@ _tmp_229_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_229[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); Token * _literal; expr_ty c; if ( @@ -37959,7 +40103,7 @@ _tmp_229_rule(Parser *p) (c = star_expression_rule(p)) // star_expression ) { - D(fprintf(stderr, "%*c+ _tmp_229[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -37969,7 +40113,7 @@ _tmp_229_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_229[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); } _res = NULL; @@ -37978,9 +40122,9 @@ _tmp_229_rule(Parser *p) return _res; } -// _tmp_230: 'or' conjunction +// _tmp_250: 'or' conjunction static void * -_tmp_230_rule(Parser *p) +_tmp_250_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -37997,7 +40141,7 @@ _tmp_230_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_230[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); Token * _keyword; expr_ty c; if ( @@ -38006,7 +40150,7 @@ _tmp_230_rule(Parser *p) (c = conjunction_rule(p)) // conjunction ) { - D(fprintf(stderr, "%*c+ _tmp_230[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38016,7 +40160,7 @@ _tmp_230_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_230[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); } _res = NULL; @@ -38025,9 +40169,9 @@ _tmp_230_rule(Parser *p) return _res; } -// _tmp_231: 'and' inversion +// _tmp_251: 'and' inversion static void * -_tmp_231_rule(Parser *p) +_tmp_251_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38044,7 +40188,7 @@ _tmp_231_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_231[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); Token * _keyword; expr_ty c; if ( @@ -38053,7 +40197,7 @@ _tmp_231_rule(Parser *p) (c = inversion_rule(p)) // inversion ) { - D(fprintf(stderr, "%*c+ _tmp_231[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38063,7 +40207,7 @@ _tmp_231_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_231[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); } _res = NULL; @@ -38072,9 +40216,9 @@ _tmp_231_rule(Parser *p) return _res; } -// _tmp_232: slice | starred_expression +// _tmp_252: slice | starred_expression static void * -_tmp_232_rule(Parser *p) +_tmp_252_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38091,18 +40235,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice")); expr_ty slice_var; if ( (slice_var = slice_rule(p)) // slice ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); + D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice")); _res = slice_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice")); } { // starred_expression @@ -38110,18 +40254,18 @@ _tmp_232_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_232[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_252[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_232[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_252[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_232[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_252[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } _res = NULL; @@ -38130,9 +40274,67 @@ _tmp_232_rule(Parser *p) return _res; } -// _tmp_233: 'if' disjunction +// _tmp_253: fstring | string static void * -_tmp_233_rule(Parser *p) +_tmp_253_rule(Parser *p) +{ + if (p->level++ == MAXSTACK) { + p->error_indicator = 1; + PyErr_NoMemory(); + } + if (p->error_indicator) { + p->level--; + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // fstring + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring")); + expr_ty fstring_var; + if ( + (fstring_var = fstring_rule(p)) // fstring + ) + { + D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring")); + _res = fstring_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring")); + } + { // string + if (p->error_indicator) { + p->level--; + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_253[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string")); + expr_ty string_var; + if ( + (string_var = string_rule(p)) // string + ) + { + D(fprintf(stderr, "%*c+ _tmp_253[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string")); + _res = string_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_253[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string")); + } + _res = NULL; + done: + p->level--; + return _res; +} + +// _tmp_254: 'if' disjunction +static void * +_tmp_254_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38149,16 +40351,16 @@ _tmp_233_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_233[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_254[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_233[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_254[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38168,7 +40370,7 @@ _tmp_233_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_233[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_254[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -38177,9 +40379,9 @@ _tmp_233_rule(Parser *p) return _res; } -// _tmp_234: 'if' disjunction +// _tmp_255: 'if' disjunction static void * -_tmp_234_rule(Parser *p) +_tmp_255_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38196,16 +40398,16 @@ _tmp_234_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_234[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c> _tmp_255[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); Token * _keyword; expr_ty z; if ( - (_keyword = _PyPegen_expect_token(p, 641)) // token='if' + (_keyword = _PyPegen_expect_token(p, 642)) // token='if' && (z = disjunction_rule(p)) // disjunction ) { - D(fprintf(stderr, "%*c+ _tmp_234[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + D(fprintf(stderr, "%*c+ _tmp_255[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); _res = z; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38215,7 +40417,7 @@ _tmp_234_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_234[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_255[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); } _res = NULL; @@ -38224,9 +40426,9 @@ _tmp_234_rule(Parser *p) return _res; } -// _tmp_235: starred_expression | (assignment_expression | expression !':=') !'=' +// _tmp_256: starred_expression | (assignment_expression | expression !':=') !'=' static void * -_tmp_235_rule(Parser *p) +_tmp_256_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38243,18 +40445,18 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); expr_ty starred_expression_var; if ( (starred_expression_var = starred_expression_rule(p)) // starred_expression ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); _res = starred_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } { // (assignment_expression | expression !':=') !'=' @@ -38262,20 +40464,20 @@ _tmp_235_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_235[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - void *_tmp_247_var; + D(fprintf(stderr, "%*c> _tmp_256[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + void *_tmp_268_var; if ( - (_tmp_247_var = _tmp_247_rule(p)) // assignment_expression | expression !':=' + (_tmp_268_var = _tmp_268_rule(p)) // assignment_expression | expression !':=' && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_235[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); - _res = _tmp_247_var; + D(fprintf(stderr, "%*c+ _tmp_256[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='")); + _res = _tmp_268_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_235[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_256[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(assignment_expression | expression !':=') !'='")); } _res = NULL; @@ -38284,9 +40486,9 @@ _tmp_235_rule(Parser *p) return _res; } -// _tmp_236: ',' star_target +// _tmp_257: ',' star_target static void * -_tmp_236_rule(Parser *p) +_tmp_257_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38303,7 +40505,7 @@ _tmp_236_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_236[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_257[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -38312,7 +40514,7 @@ _tmp_236_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_236[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_257[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38322,7 +40524,7 @@ _tmp_236_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_236[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_257[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -38331,9 +40533,9 @@ _tmp_236_rule(Parser *p) return _res; } -// _tmp_237: ',' star_target +// _tmp_258: ',' star_target static void * -_tmp_237_rule(Parser *p) +_tmp_258_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38350,7 +40552,7 @@ _tmp_237_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_237[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c> _tmp_258[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); Token * _literal; expr_ty c; if ( @@ -38359,7 +40561,7 @@ _tmp_237_rule(Parser *p) (c = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_237[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + D(fprintf(stderr, "%*c+ _tmp_258[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); _res = c; if (_res == NULL && PyErr_Occurred()) { p->error_indicator = 1; @@ -38369,7 +40571,7 @@ _tmp_237_rule(Parser *p) goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_237[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_258[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); } _res = NULL; @@ -38378,9 +40580,9 @@ _tmp_237_rule(Parser *p) return _res; } -// _tmp_238: star_targets '=' +// _tmp_259: star_targets '=' static void * -_tmp_238_rule(Parser *p) +_tmp_259_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38397,7 +40599,7 @@ _tmp_238_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_238[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_259[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -38406,12 +40608,12 @@ _tmp_238_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_238[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_259[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_238[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_259[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -38420,9 +40622,9 @@ _tmp_238_rule(Parser *p) return _res; } -// _tmp_239: star_targets '=' +// _tmp_260: star_targets '=' static void * -_tmp_239_rule(Parser *p) +_tmp_260_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38439,7 +40641,7 @@ _tmp_239_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_239[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c> _tmp_260[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); Token * _literal; expr_ty star_targets_var; if ( @@ -38448,12 +40650,12 @@ _tmp_239_rule(Parser *p) (_literal = _PyPegen_expect_token(p, 22)) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_239[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + D(fprintf(stderr, "%*c+ _tmp_260[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); _res = _PyPegen_dummy_name(p, star_targets_var, _literal); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_239[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_260[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); } _res = NULL; @@ -38462,9 +40664,9 @@ _tmp_239_rule(Parser *p) return _res; } -// _tmp_240: ')' | '**' +// _tmp_261: ')' | '**' static void * -_tmp_240_rule(Parser *p) +_tmp_261_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38481,18 +40683,18 @@ _tmp_240_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 8)) // token=')' ) { - D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); } { // '**' @@ -38500,18 +40702,18 @@ _tmp_240_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_240[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_261[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_240[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_261[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_240[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_261[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -38520,9 +40722,9 @@ _tmp_240_rule(Parser *p) return _res; } -// _tmp_241: ':' | '**' +// _tmp_262: ':' | '**' static void * -_tmp_241_rule(Parser *p) +_tmp_262_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38539,18 +40741,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 11)) // token=':' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); } { // '**' @@ -38558,18 +40760,18 @@ _tmp_241_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_241[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c> _tmp_262[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); Token * _literal; if ( (_literal = _PyPegen_expect_token(p, 35)) // token='**' ) { - D(fprintf(stderr, "%*c+ _tmp_241[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + D(fprintf(stderr, "%*c+ _tmp_262[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); _res = _literal; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_241[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_262[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); } _res = NULL; @@ -38578,9 +40780,9 @@ _tmp_241_rule(Parser *p) return _res; } -// _tmp_242: expression ['as' star_target] +// _tmp_263: expression ['as' star_target] static void * -_tmp_242_rule(Parser *p) +_tmp_263_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38597,22 +40799,22 @@ _tmp_242_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_242[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_263[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_248_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_269_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_242[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_263[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_242[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_263[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -38621,9 +40823,9 @@ _tmp_242_rule(Parser *p) return _res; } -// _tmp_243: expressions ['as' star_target] +// _tmp_264: expressions ['as' star_target] static void * -_tmp_243_rule(Parser *p) +_tmp_264_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38640,22 +40842,22 @@ _tmp_243_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_243[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_264[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_249_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_270_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_243[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_264[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_243[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_264[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -38664,9 +40866,9 @@ _tmp_243_rule(Parser *p) return _res; } -// _tmp_244: expression ['as' star_target] +// _tmp_265: expression ['as' star_target] static void * -_tmp_244_rule(Parser *p) +_tmp_265_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38683,22 +40885,22 @@ _tmp_244_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_244[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_265[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression && - (_opt_var = _tmp_250_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_271_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_244[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_265[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]")); _res = _PyPegen_dummy_name(p, expression_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_244[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_265[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]")); } _res = NULL; @@ -38707,9 +40909,9 @@ _tmp_244_rule(Parser *p) return _res; } -// _tmp_245: expressions ['as' star_target] +// _tmp_266: expressions ['as' star_target] static void * -_tmp_245_rule(Parser *p) +_tmp_266_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38726,22 +40928,22 @@ _tmp_245_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_245[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c> _tmp_266[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); void *_opt_var; UNUSED(_opt_var); // Silence compiler warnings expr_ty expressions_var; if ( (expressions_var = expressions_rule(p)) // expressions && - (_opt_var = _tmp_251_rule(p), !p->error_indicator) // ['as' star_target] + (_opt_var = _tmp_272_rule(p), !p->error_indicator) // ['as' star_target] ) { - D(fprintf(stderr, "%*c+ _tmp_245[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); + D(fprintf(stderr, "%*c+ _tmp_266[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]")); _res = _PyPegen_dummy_name(p, expressions_var, _opt_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_245[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_266[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions ['as' star_target]")); } _res = NULL; @@ -38750,9 +40952,9 @@ _tmp_245_rule(Parser *p) return _res; } -// _tmp_246: 'as' NAME +// _tmp_267: 'as' NAME static void * -_tmp_246_rule(Parser *p) +_tmp_267_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38769,21 +40971,21 @@ _tmp_246_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_246[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c> _tmp_267[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); Token * _keyword; expr_ty name_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (name_var = _PyPegen_name_token(p)) // NAME ) { - D(fprintf(stderr, "%*c+ _tmp_246[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + D(fprintf(stderr, "%*c+ _tmp_267[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); _res = _PyPegen_dummy_name(p, _keyword, name_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_246[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_267[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); } _res = NULL; @@ -38792,9 +40994,9 @@ _tmp_246_rule(Parser *p) return _res; } -// _tmp_247: assignment_expression | expression !':=' +// _tmp_268: assignment_expression | expression !':=' static void * -_tmp_247_rule(Parser *p) +_tmp_268_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38811,18 +41013,18 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression")); expr_ty assignment_expression_var; if ( (assignment_expression_var = assignment_expression_rule(p)) // assignment_expression ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); + D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression")); _res = assignment_expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression")); } { // expression !':=' @@ -38830,7 +41032,7 @@ _tmp_247_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_247[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c> _tmp_268[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); expr_ty expression_var; if ( (expression_var = expression_rule(p)) // expression @@ -38838,12 +41040,12 @@ _tmp_247_rule(Parser *p) _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' ) { - D(fprintf(stderr, "%*c+ _tmp_247[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + D(fprintf(stderr, "%*c+ _tmp_268[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); _res = expression_var; goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_247[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_268[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); } _res = NULL; @@ -38852,9 +41054,9 @@ _tmp_247_rule(Parser *p) return _res; } -// _tmp_248: 'as' star_target +// _tmp_269: 'as' star_target static void * -_tmp_248_rule(Parser *p) +_tmp_269_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38871,21 +41073,21 @@ _tmp_248_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_248[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_269[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_248[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_269[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_248[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_269[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38894,9 +41096,9 @@ _tmp_248_rule(Parser *p) return _res; } -// _tmp_249: 'as' star_target +// _tmp_270: 'as' star_target static void * -_tmp_249_rule(Parser *p) +_tmp_270_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38913,21 +41115,21 @@ _tmp_249_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_249[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_270[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_249[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_270[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_249[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_270[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38936,9 +41138,9 @@ _tmp_249_rule(Parser *p) return _res; } -// _tmp_250: 'as' star_target +// _tmp_271: 'as' star_target static void * -_tmp_250_rule(Parser *p) +_tmp_271_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38955,21 +41157,21 @@ _tmp_250_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_250[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_271[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_250[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_271[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_250[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_271[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; @@ -38978,9 +41180,9 @@ _tmp_250_rule(Parser *p) return _res; } -// _tmp_251: 'as' star_target +// _tmp_272: 'as' star_target static void * -_tmp_251_rule(Parser *p) +_tmp_272_rule(Parser *p) { if (p->level++ == MAXSTACK) { p->error_indicator = 1; @@ -38997,21 +41199,21 @@ _tmp_251_rule(Parser *p) p->level--; return NULL; } - D(fprintf(stderr, "%*c> _tmp_251[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c> _tmp_272[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target")); Token * _keyword; expr_ty star_target_var; if ( - (_keyword = _PyPegen_expect_token(p, 639)) // token='as' + (_keyword = _PyPegen_expect_token(p, 640)) // token='as' && (star_target_var = star_target_rule(p)) // star_target ) { - D(fprintf(stderr, "%*c+ _tmp_251[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); + D(fprintf(stderr, "%*c+ _tmp_272[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target")); _res = _PyPegen_dummy_name(p, _keyword, star_target_var); goto done; } p->mark = _mark; - D(fprintf(stderr, "%*c%s _tmp_251[%d-%d]: %s failed!\n", p->level, ' ', + D(fprintf(stderr, "%*c%s _tmp_272[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' star_target")); } _res = NULL; diff --git a/Parser/pegen.c b/Parser/pegen.c index b79ae4cb1fb370..262bfabfba7a25 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -359,7 +359,7 @@ _PyPegen_expect_token(Parser *p, int type) } Token *t = p->tokens[p->mark]; if (t->type != type) { - return NULL; + return NULL; } p->mark += 1; return t; diff --git a/Parser/pegen.h b/Parser/pegen.h index ad5c97f5f7e5d1..6962013c2d18b4 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -138,6 +138,7 @@ void* _PyPegen_expect_forced_result(Parser *p, void* result, const char* expecte Token *_PyPegen_expect_forced_token(Parser *p, int type, const char* expected); expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); expr_ty _PyPegen_soft_keyword_token(Parser *p); +expr_ty _PyPegen_fstring_middle_token(Parser* p); Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); int _PyPegen_fill_token(Parser *p); expr_ty _PyPegen_name_token(Parser *p); @@ -155,7 +156,7 @@ typedef enum { int _Pypegen_raise_decode_error(Parser *p); void _PyPegen_raise_tokenizer_init_error(PyObject *filename); int _Pypegen_tokenizer_error(Parser *p); -void *_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...); +void *_PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *errmsg, ...); void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, Py_ssize_t lineno, Py_ssize_t col_offset, Py_ssize_t end_lineno, Py_ssize_t end_col_offset, @@ -175,8 +176,9 @@ RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, va_end(va); return NULL; } -#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, msg, ##__VA_ARGS__) -#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 0, msg, ##__VA_ARGS__) +#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, 0, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 1, msg, ##__VA_ARGS__) #define RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, msg, ...) \ RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, (b)->end_lineno, (b)->end_col_offset, msg, ##__VA_ARGS__) #define RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, msg, ...) \ @@ -308,6 +310,7 @@ StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty); arguments_ty _PyPegen_make_arguments(Parser *, asdl_arg_seq *, SlashWithDefault *, asdl_arg_seq *, asdl_seq *, StarEtc *); arguments_ty _PyPegen_empty_arguments(Parser *); +expr_ty _PyPegen_formatted_value(Parser *, expr_ty, Token *, expr_ty, expr_ty, int, int, int, int, PyArena *); AugOperator *_PyPegen_augoperator(Parser*, operator_ty type); stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_expr_seq *, stmt_ty); @@ -317,12 +320,16 @@ asdl_keyword_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); +expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok); +expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok); +expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *, int, int, int, int, PyArena *); +expr_ty _PyPegen_FetchRawForm(Parser *p, int, int, int, int); expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty); expr_ty _PyPegen_ensure_real(Parser *p, expr_ty); asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); int _PyPegen_check_barry_as_flufl(Parser *, Token *); int _PyPegen_check_legacy_stmt(Parser *p, expr_ty t); +expr_ty _PyPegen_check_fstring_conversion(Parser *p, Token *, expr_ty t); mod_ty _PyPegen_make_module(Parser *, asdl_stmt_seq *); void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); expr_ty _PyPegen_get_last_comprehension_item(comprehension_ty comprehension); @@ -338,6 +345,9 @@ void *_PyPegen_run_parser(Parser *); mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); asdl_stmt_seq *_PyPegen_interactive_exit(Parser *); +// TODO: move to the correct place in this file +expr_ty _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b); + // Generated function in parse.c - function definition in python.gram void *_PyPegen_parse(Parser *); diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index 6ea7600119b643..e26bad20a27575 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -192,7 +192,10 @@ _PyPegen_tokenize_full_source_to_check_for_errors(Parser *p) { exit: - if (PyErr_Occurred()) { + // If we're in an f-string, we want the syntax error in the expression part + // to propagate, so that tokenizer errors (like expecting '}') that happen afterwards + // do not swallow it. + if (PyErr_Occurred() && p->tok->tok_mode_stack_index <= 0) { Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(traceback); @@ -205,7 +208,7 @@ _PyPegen_tokenize_full_source_to_check_for_errors(Parser *p) { // PARSER ERRORS void * -_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) +_PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *errmsg, ...) { if (p->fill == 0) { va_list va; @@ -214,8 +217,13 @@ _PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) va_end(va); return NULL; } - - Token *t = p->known_err_token != NULL ? p->known_err_token : p->tokens[p->fill - 1]; + if (use_mark && p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + Token *t = p->known_err_token != NULL + ? p->known_err_token + : p->tokens[use_mark ? p->mark : p->fill - 1]; Py_ssize_t col_offset; Py_ssize_t end_col_offset = -1; if (t->col_offset == -1) { diff --git a/Parser/string_parser.c b/Parser/string_parser.c index c096bea7426e5c..be5f0c4a60a663 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -135,7 +135,9 @@ decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t) const char *first_invalid_escape; v = _PyUnicode_DecodeUnicodeEscapeInternal(s, len, NULL, NULL, &first_invalid_escape); - if (v != NULL && first_invalid_escape != NULL) { + // HACK: later we can simply pass the line no, since we don't preserve the tokens + // when we are decoding the string but we preserve the line numbers. + if (v != NULL && first_invalid_escape != NULL && t != NULL) { if (warn_invalid_escape_sequence(parser, first_invalid_escape, t) < 0) { /* We have not decref u before because first_invalid_escape points inside u. */ @@ -166,43 +168,43 @@ decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t) return result; } -/* s must include the bracketing quote characters, and r, b, u, - &/or f prefixes (if any), and embedded escape sequences (if any). - _PyPegen_parsestr parses it, and sets *result to decoded Python string object. - If the string is an f-string, set *fstr and *fstrlen to the unparsed - string object. Return 0 if no errors occurred. */ -int -_PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, - const char **fstr, Py_ssize_t *fstrlen, Token *t) +PyObject * +_PyPegen_decode_string(Parser *p, int raw, const char *s, size_t len, Token *t) +{ + if (raw) { + return PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); + } + return decode_unicode_with_escapes(p, s, len, t); +} + +/* s must include the bracketing quote characters, and r, b &/or f prefixes + (if any), and embedded escape sequences (if any). (f-strings are handled by the parser) + _PyPegen_parse_string parses it, and returns the decoded Python string object. */ +PyObject * +_PyPegen_parse_string(Parser *p, Token *t) { const char *s = PyBytes_AsString(t->bytes); if (s == NULL) { - return -1; + return NULL; } size_t len; int quote = Py_CHARMASK(*s); - int fmode = 0; - *bytesmode = 0; - *rawmode = 0; - *result = NULL; - *fstr = NULL; + int bytesmode = 0; + int rawmode = 0; + if (Py_ISALPHA(quote)) { - while (!*bytesmode || !*rawmode) { + while (!bytesmode || !rawmode) { if (quote == 'b' || quote == 'B') { quote =(unsigned char)*++s; - *bytesmode = 1; + bytesmode = 1; } else if (quote == 'u' || quote == 'U') { quote = (unsigned char)*++s; } else if (quote == 'r' || quote == 'R') { quote = (unsigned char)*++s; - *rawmode = 1; - } - else if (quote == 'f' || quote == 'F') { - quote = (unsigned char)*++s; - fmode = 1; + rawmode = 1; } else { break; @@ -210,32 +212,21 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, } } - /* fstrings are only allowed in Python 3.6 and greater */ - if (fmode && p->feature_version < 6) { - p->error_indicator = 1; - RAISE_SYNTAX_ERROR("Format strings are only supported in Python 3.6 and greater"); - return -1; - } - - if (fmode && *bytesmode) { - PyErr_BadInternalCall(); - return -1; - } if (quote != '\'' && quote != '\"') { PyErr_BadInternalCall(); - return -1; + return NULL; } /* Skip the leading quote char. */ s++; len = strlen(s); if (len > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); - return -1; + return NULL; } if (s[--len] != quote) { /* Last quote char must match the first. */ PyErr_BadInternalCall(); - return -1; + return NULL; } if (len >= 4 && s[0] == quote && s[1] == quote) { /* A triple quoted string. We've already skipped one quote at @@ -246,22 +237,13 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, /* And check that the last two match. */ if (s[--len] != quote || s[--len] != quote) { PyErr_BadInternalCall(); - return -1; + return NULL; } } - if (fmode) { - /* Just return the bytes. The caller will parse the resulting - string. */ - *fstr = s; - *fstrlen = len; - return 0; - } - - /* Not an f-string. */ /* Avoid invoking escape decoding routines if possible. */ - *rawmode = *rawmode || strchr(s, '\\') == NULL; - if (*bytesmode) { + rawmode = rawmode || strchr(s, '\\') == NULL; + if (bytesmode) { /* Disallow non-ASCII characters. */ const char *ch; for (ch = s; *ch; ch++) { @@ -269,1014 +251,13 @@ _PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, RAISE_SYNTAX_ERROR( "bytes can only contain ASCII " "literal characters"); - return -1; - } - } - if (*rawmode) { - *result = PyBytes_FromStringAndSize(s, len); - } - else { - *result = decode_bytes_with_escapes(p, s, len, t); - } - } - else { - if (*rawmode) { - *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); - } - else { - *result = decode_unicode_with_escapes(p, s, len, t); - } - } - return *result == NULL ? -1 : 0; -} - - - -// FSTRING STUFF - -/* Fix locations for the given node and its children. - - `parent` is the enclosing node. - `expr_start` is the starting position of the expression (pointing to the open brace). - `n` is the node which locations are going to be fixed relative to parent. - `expr_str` is the child node's string representation, including braces. -*/ -static bool -fstring_find_expr_location(Token *parent, const char* expr_start, char *expr_str, int *p_lines, int *p_cols) -{ - *p_lines = 0; - *p_cols = 0; - assert(expr_start != NULL && *expr_start == '{'); - if (parent && parent->bytes) { - const char *parent_str = PyBytes_AsString(parent->bytes); - if (!parent_str) { - return false; - } - // The following is needed, in order to correctly shift the column - // offset, in the case that (disregarding any whitespace) a newline - // immediately follows the opening curly brace of the fstring expression. - bool newline_after_brace = 1; - const char *start = expr_start + 1; - while (start && *start != '}' && *start != '\n') { - if (*start != ' ' && *start != '\t' && *start != '\f') { - newline_after_brace = 0; - break; - } - start++; - } - - // Account for the characters from the last newline character to our - // left until the beginning of expr_start. - if (!newline_after_brace) { - start = expr_start; - while (start > parent_str && *start != '\n') { - start--; - } - *p_cols += (int)(expr_start - start); - if (*start == '\n') { - *p_cols -= 1; - } - } - /* adjust the start based on the number of newlines encountered - before the f-string expression */ - for (const char *p = parent_str; p < expr_start; p++) { - if (*p == '\n') { - (*p_lines)++; - } - } - } - return true; -} - - -/* Compile this expression in to an expr_ty. Add parens around the - expression, in order to allow leading spaces in the expression. */ -static expr_ty -fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end, - Token *t) -{ - expr_ty expr = NULL; - char *str; - Py_ssize_t len; - const char *s; - expr_ty result = NULL; - - assert(expr_end >= expr_start); - assert(*(expr_start-1) == '{'); - assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' || - *expr_end == '='); - - /* If the substring is all whitespace, it's an error. We need to catch this - here, and not when we call PyParser_SimpleParseStringFlagsFilename, - because turning the expression '' in to '()' would go from being invalid - to valid. */ - for (s = expr_start; s != expr_end; s++) { - char c = *s; - /* The Python parser ignores only the following whitespace - characters (\r already is converted to \n). */ - if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) { - break; - } - } - - if (s == expr_end) { - if (*expr_end == '!' || *expr_end == ':' || *expr_end == '=') { - RAISE_SYNTAX_ERROR("f-string: expression required before '%c'", *expr_end); - return NULL; - } - RAISE_SYNTAX_ERROR("f-string: empty expression not allowed"); - return NULL; - } - - len = expr_end - expr_start; - /* Allocate 3 extra bytes: open paren, close paren, null byte. */ - str = PyMem_Calloc(len + 3, sizeof(char)); - if (str == NULL) { - PyErr_NoMemory(); - return NULL; - } - - // The call to fstring_find_expr_location is responsible for finding the column offset - // the generated AST nodes need to be shifted to the right, which is equal to the number - // of the f-string characters before the expression starts. - memcpy(str+1, expr_start, len); - int lines, cols; - if (!fstring_find_expr_location(t, expr_start-1, str+1, &lines, &cols)) { - PyMem_Free(str); - return NULL; - } - - // The parentheses are needed in order to allow for leading whitespace within - // the f-string expression. This consequently gets parsed as a group (see the - // group rule in python.gram). - str[0] = '('; - str[len+1] = ')'; - - struct tok_state* tok = _PyTokenizer_FromString(str, 1); - if (tok == NULL) { - PyMem_Free(str); - return NULL; - } - tok->filename = Py_NewRef(p->tok->filename); - tok->lineno = t->lineno + lines - 1; - - Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version, - NULL, p->arena); - - p2->starting_lineno = t->lineno + lines; - p2->starting_col_offset = lines != 0 ? cols : t->col_offset + cols; - - expr = _PyPegen_run_parser(p2); - - if (expr == NULL) { - goto exit; - } - result = expr; - -exit: - PyMem_Free(str); - _PyPegen_Parser_Free(p2); - _PyTokenizer_Free(tok); - return result; -} - -/* Return -1 on error. - - Return 0 if we reached the end of the literal. - - Return 1 if we haven't reached the end of the literal, but we want - the caller to process the literal up to this point. Used for - doubled braces. -*/ -static int -fstring_find_literal(Parser *p, const char **str, const char *end, int raw, - PyObject **literal, int recurse_lvl, Token *t) -{ - /* Get any literal string. It ends when we hit an un-doubled left - brace (which isn't part of a unicode name escape such as - "\N{EULER CONSTANT}"), or the end of the string. */ - - const char *s = *str; - const char *literal_start = s; - int result = 0; - - assert(*literal == NULL); - while (s < end) { - char ch = *s++; - if (!raw && ch == '\\' && s < end) { - ch = *s++; - if (ch == 'N') { - /* We need to look at and skip matching braces for "\N{name}" - sequences because otherwise we'll think the opening '{' - starts an expression, which is not the case with "\N". - Keep looking for either a matched '{' '}' pair, or the end - of the string. */ - - if (s < end && *s++ == '{') { - while (s < end && *s++ != '}') { - } - continue; - } - - /* This is an invalid "\N" sequence, since it's a "\N" not - followed by a "{". Just keep parsing this literal. This - error will be caught later by - decode_unicode_with_escapes(). */ - continue; - } - if (ch == '{' && warn_invalid_escape_sequence(p, s-1, t) < 0) { - return -1; - } - } - if (ch == '{' || ch == '}') { - /* Check for doubled braces, but only at the top level. If - we checked at every level, then f'{0:{3}}' would fail - with the two closing braces. */ - if (recurse_lvl == 0) { - if (s < end && *s == ch) { - /* We're going to tell the caller that the literal ends - here, but that they should continue scanning. But also - skip over the second brace when we resume scanning. */ - *str = s + 1; - result = 1; - goto done; - } - - /* Where a single '{' is the start of a new expression, a - single '}' is not allowed. */ - if (ch == '}') { - *str = s - 1; - RAISE_SYNTAX_ERROR("f-string: single '}' is not allowed"); - return -1; - } - } - /* We're either at a '{', which means we're starting another - expression; or a '}', which means we're at the end of this - f-string (for a nested format_spec). */ - s--; - break; - } - } - *str = s; - assert(s <= end); - assert(s == end || *s == '{' || *s == '}'); -done: - if (literal_start != s) { - if (raw) { - *literal = PyUnicode_DecodeUTF8Stateful(literal_start, - s - literal_start, - NULL, NULL); - } - else { - *literal = decode_unicode_with_escapes(p, literal_start, - s - literal_start, t); - } - if (!*literal) { - return -1; - } - } - return result; -} - -/* Forward declaration because parsing is recursive. */ -static expr_ty -fstring_parse(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, - Token *first_token, Token* t, Token *last_token); - -/* Parse the f-string at *str, ending at end. We know *str starts an - expression (so it must be a '{'). Returns the FormattedValue node, which - includes the expression, conversion character, format_spec expression, and - optionally the text of the expression (if = is used). - - Note that I don't do a perfect job here: I don't make sure that a - closing brace doesn't match an opening paren, for example. It - doesn't need to error on all invalid expressions, just correctly - find the end of all valid ones. Any errors inside the expression - will be caught when we parse it later. - - *expression is set to the expression. For an '=' "debug" expression, - *expr_text is set to the debug text (the original text of the expression, - including the '=' and any whitespace around it, as a string object). If - not a debug expression, *expr_text set to NULL. */ -static int -fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, - PyObject **expr_text, expr_ty *expression, Token *first_token, - Token *t, Token *last_token) -{ - /* Return -1 on error, else 0. */ - - const char *expr_start; - const char *expr_end; - expr_ty simple_expression; - expr_ty format_spec = NULL; /* Optional format specifier. */ - int conversion = -1; /* The conversion char. Use default if not - specified, or !r if using = and no format - spec. */ - - /* 0 if we're not in a string, else the quote char we're trying to - match (single or double quote). */ - char quote_char = 0; - - /* If we're inside a string, 1=normal, 3=triple-quoted. */ - int string_type = 0; - - /* Keep track of nesting level for braces/parens/brackets in - expressions. */ - Py_ssize_t nested_depth = 0; - char parenstack[MAXLEVEL]; - - *expr_text = NULL; - - /* Can only nest one level deep. */ - if (recurse_lvl >= 2) { - RAISE_SYNTAX_ERROR("f-string: expressions nested too deeply"); - goto error; - } - - /* The first char must be a left brace, or we wouldn't have gotten - here. Skip over it. */ - assert(**str == '{'); - *str += 1; - - expr_start = *str; - for (; *str < end; (*str)++) { - char ch; - - /* Loop invariants. */ - assert(nested_depth >= 0); - assert(*str >= expr_start && *str < end); - if (quote_char) { - assert(string_type == 1 || string_type == 3); - } else { - assert(string_type == 0); - } - - ch = **str; - /* Nowhere inside an expression is a backslash allowed. */ - if (ch == '\\') { - /* Error: can't include a backslash character, inside - parens or strings or not. */ - RAISE_SYNTAX_ERROR( - "f-string expression part " - "cannot include a backslash"); - goto error; - } - if (quote_char) { - /* We're inside a string. See if we're at the end. */ - /* This code needs to implement the same non-error logic - as tok_get from tokenizer.c, at the letter_quote - label. To actually share that code would be a - nightmare. But, it's unlikely to change and is small, - so duplicate it here. Note we don't need to catch all - of the errors, since they'll be caught when parsing the - expression. We just need to match the non-error - cases. Thus we can ignore \n in single-quoted strings, - for example. Or non-terminated strings. */ - if (ch == quote_char) { - /* Does this match the string_type (single or triple - quoted)? */ - if (string_type == 3) { - if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { - /* We're at the end of a triple quoted string. */ - *str += 2; - string_type = 0; - quote_char = 0; - continue; - } - } else { - /* We're at the end of a normal string. */ - quote_char = 0; - string_type = 0; - continue; - } - } - } else if (ch == '\'' || ch == '"') { - /* Is this a triple quoted string? */ - if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { - string_type = 3; - *str += 2; - } else { - /* Start of a normal string. */ - string_type = 1; - } - /* Start looking for the end of the string. */ - quote_char = ch; - } else if (ch == '[' || ch == '{' || ch == '(') { - if (nested_depth >= MAXLEVEL) { - RAISE_SYNTAX_ERROR("f-string: too many nested parenthesis"); - goto error; - } - parenstack[nested_depth] = ch; - nested_depth++; - } else if (ch == '#') { - /* Error: can't include a comment character, inside parens - or not. */ - RAISE_SYNTAX_ERROR("f-string expression part cannot include '#'"); - goto error; - } else if (nested_depth == 0 && - (ch == '!' || ch == ':' || ch == '}' || - ch == '=' || ch == '>' || ch == '<')) { - /* See if there's a next character. */ - if (*str+1 < end) { - char next = *(*str+1); - - /* For "!=". since '=' is not an allowed conversion character, - nothing is lost in this test. */ - if ((ch == '!' && next == '=') || /* != */ - (ch == '=' && next == '=') || /* == */ - (ch == '<' && next == '=') || /* <= */ - (ch == '>' && next == '=') /* >= */ - ) { - *str += 1; - continue; - } - } - /* Don't get out of the loop for these, if they're single - chars (not part of 2-char tokens). If by themselves, they - don't end an expression (unlike say '!'). */ - if (ch == '>' || ch == '<') { - continue; - } - - /* Normal way out of this loop. */ - break; - } else if (ch == ']' || ch == '}' || ch == ')') { - if (!nested_depth) { - RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", ch); - goto error; - } - nested_depth--; - int opening = (unsigned char)parenstack[nested_depth]; - if (!((opening == '(' && ch == ')') || - (opening == '[' && ch == ']') || - (opening == '{' && ch == '}'))) - { - RAISE_SYNTAX_ERROR( - "f-string: closing parenthesis '%c' " - "does not match opening parenthesis '%c'", - ch, opening); - goto error; - } - } else { - /* Just consume this char and loop around. */ - } - } - expr_end = *str; - /* If we leave the above loop in a string or with mismatched parens, we - don't really care. We'll get a syntax error when compiling the - expression. But, we can produce a better error message, so let's just - do that.*/ - if (quote_char) { - RAISE_SYNTAX_ERROR("f-string: unterminated string"); - goto error; - } - if (nested_depth) { - int opening = (unsigned char)parenstack[nested_depth - 1]; - RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", opening); - goto error; - } - - if (*str >= end) { - goto unexpected_end_of_string; - } - - /* Compile the expression as soon as possible, so we show errors - related to the expression before errors related to the - conversion or format_spec. */ - simple_expression = fstring_compile_expr(p, expr_start, expr_end, t); - if (!simple_expression) { - goto error; - } - - /* Check for =, which puts the text value of the expression in - expr_text. */ - if (**str == '=') { - if (p->feature_version < 8) { - RAISE_SYNTAX_ERROR("f-string: self documenting expressions are " - "only supported in Python 3.8 and greater"); - goto error; - } - *str += 1; - - /* Skip over ASCII whitespace. No need to test for end of string - here, since we know there's at least a trailing quote somewhere - ahead. */ - while (Py_ISSPACE(**str)) { - *str += 1; - } - if (*str >= end) { - goto unexpected_end_of_string; - } - /* Set *expr_text to the text of the expression. */ - *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start); - if (!*expr_text) { - goto error; - } - } - - /* Check for a conversion char, if present. */ - if (**str == '!') { - *str += 1; - const char *conv_start = *str; - while (1) { - if (*str >= end) { - goto unexpected_end_of_string; - } - if (**str == '}' || **str == ':') { - break; - } - *str += 1; - } - if (*str == conv_start) { - RAISE_SYNTAX_ERROR( - "f-string: missed conversion character"); - goto error; - } - - conversion = (unsigned char)*conv_start; - /* Validate the conversion. */ - if ((*str != conv_start + 1) || - !(conversion == 's' || conversion == 'r' || conversion == 'a')) - { - PyObject *conv_obj = PyUnicode_FromStringAndSize(conv_start, - *str-conv_start); - if (conv_obj) { - RAISE_SYNTAX_ERROR( - "f-string: invalid conversion character %R: " - "expected 's', 'r', or 'a'", - conv_obj); - Py_DECREF(conv_obj); - } - goto error; - } - - } - - /* Check for the format spec, if present. */ - assert(*str < end); - if (**str == ':') { - *str += 1; - if (*str >= end) { - goto unexpected_end_of_string; - } - - /* Parse the format spec. */ - format_spec = fstring_parse(p, str, end, raw, recurse_lvl+1, - first_token, t, last_token); - if (!format_spec) { - goto error; - } - } - - if (*str >= end || **str != '}') { - goto unexpected_end_of_string; - } - - /* We're at a right brace. Consume it. */ - assert(*str < end); - assert(**str == '}'); - *str += 1; - - /* If we're in = mode (detected by non-NULL expr_text), and have no format - spec and no explicit conversion, set the conversion to 'r'. */ - if (*expr_text && format_spec == NULL && conversion == -1) { - conversion = 'r'; - } - - /* And now create the FormattedValue node that represents this - entire expression with the conversion and format spec. */ - //TODO: Fix this - *expression = _PyAST_FormattedValue(simple_expression, conversion, - format_spec, first_token->lineno, - first_token->col_offset, - last_token->end_lineno, - last_token->end_col_offset, p->arena); - if (!*expression) { - goto error; - } - - return 0; - -unexpected_end_of_string: - RAISE_SYNTAX_ERROR("f-string: expecting '}'"); - /* Falls through to error. */ - -error: - Py_XDECREF(*expr_text); - return -1; - -} - -/* Return -1 on error. - - Return 0 if we have a literal (possible zero length) and an - expression (zero length if at the end of the string. - - Return 1 if we have a literal, but no expression, and we want the - caller to call us again. This is used to deal with doubled - braces. - - When called multiple times on the string 'a{{b{0}c', this function - will return: - - 1. the literal 'a{' with no expression, and a return value - of 1. Despite the fact that there's no expression, the return - value of 1 means we're not finished yet. - - 2. the literal 'b' and the expression '0', with a return value of - 0. The fact that there's an expression means we're not finished. - - 3. literal 'c' with no expression and a return value of 0. The - combination of the return value of 0 with no expression means - we're finished. -*/ -static int -fstring_find_literal_and_expr(Parser *p, const char **str, const char *end, int raw, - int recurse_lvl, PyObject **literal, - PyObject **expr_text, expr_ty *expression, - Token *first_token, Token *t, Token *last_token) -{ - int result; - - assert(*literal == NULL && *expression == NULL); - - /* Get any literal string. */ - result = fstring_find_literal(p, str, end, raw, literal, recurse_lvl, t); - if (result < 0) { - goto error; - } - - assert(result == 0 || result == 1); - - if (result == 1) { - /* We have a literal, but don't look at the expression. */ - return 1; - } - - if (*str >= end || **str == '}') { - /* We're at the end of the string or the end of a nested - f-string: no expression. The top-level error case where we - expect to be at the end of the string but we're at a '}' is - handled later. */ - return 0; - } - - /* We must now be the start of an expression, on a '{'. */ - assert(**str == '{'); - - if (fstring_find_expr(p, str, end, raw, recurse_lvl, expr_text, - expression, first_token, t, last_token) < 0) { - goto error; - } - - return 0; - -error: - Py_CLEAR(*literal); - return -1; -} - -#ifdef NDEBUG -#define ExprList_check_invariants(l) -#else -static void -ExprList_check_invariants(ExprList *l) -{ - /* Check our invariants. Make sure this object is "live", and - hasn't been deallocated. */ - assert(l->size >= 0); - assert(l->p != NULL); - if (l->size <= EXPRLIST_N_CACHED) { - assert(l->data == l->p); - } -} -#endif - -static void -ExprList_Init(ExprList *l) -{ - l->allocated = EXPRLIST_N_CACHED; - l->size = 0; - - /* Until we start allocating dynamically, p points to data. */ - l->p = l->data; - - ExprList_check_invariants(l); -} - -static int -ExprList_Append(ExprList *l, expr_ty exp) -{ - ExprList_check_invariants(l); - if (l->size >= l->allocated) { - /* We need to alloc (or realloc) the memory. */ - Py_ssize_t new_size = l->allocated * 2; - - /* See if we've ever allocated anything dynamically. */ - if (l->p == l->data) { - Py_ssize_t i; - /* We're still using the cached data. Switch to - alloc-ing. */ - l->p = PyMem_Malloc(sizeof(expr_ty) * new_size); - if (!l->p) { - return -1; - } - /* Copy the cached data into the new buffer. */ - for (i = 0; i < l->size; i++) { - l->p[i] = l->data[i]; - } - } else { - /* Just realloc. */ - expr_ty *tmp = PyMem_Realloc(l->p, sizeof(expr_ty) * new_size); - if (!tmp) { - PyMem_Free(l->p); - l->p = NULL; - return -1; - } - l->p = tmp; - } - - l->allocated = new_size; - assert(l->allocated == 2 * l->size); - } - - l->p[l->size++] = exp; - - ExprList_check_invariants(l); - return 0; -} - -static void -ExprList_Dealloc(ExprList *l) -{ - ExprList_check_invariants(l); - - /* If there's been an error, or we've never dynamically allocated, - do nothing. */ - if (!l->p || l->p == l->data) { - /* Do nothing. */ - } else { - /* We have dynamically allocated. Free the memory. */ - PyMem_Free(l->p); - } - l->p = NULL; - l->size = -1; -} - -static asdl_expr_seq * -ExprList_Finish(ExprList *l, PyArena *arena) -{ - asdl_expr_seq *seq; - - ExprList_check_invariants(l); - - /* Allocate the asdl_seq and copy the expressions in to it. */ - seq = _Py_asdl_expr_seq_new(l->size, arena); - if (seq) { - Py_ssize_t i; - for (i = 0; i < l->size; i++) { - asdl_seq_SET(seq, i, l->p[i]); - } - } - ExprList_Dealloc(l); - return seq; -} - -#ifdef NDEBUG -#define FstringParser_check_invariants(state) -#else -static void -FstringParser_check_invariants(FstringParser *state) -{ - if (state->last_str) { - assert(PyUnicode_CheckExact(state->last_str)); - } - ExprList_check_invariants(&state->expr_list); -} -#endif - -void -_PyPegen_FstringParser_Init(FstringParser *state) -{ - state->last_str = NULL; - state->fmode = 0; - ExprList_Init(&state->expr_list); - FstringParser_check_invariants(state); -} - -void -_PyPegen_FstringParser_Dealloc(FstringParser *state) -{ - FstringParser_check_invariants(state); - - Py_XDECREF(state->last_str); - ExprList_Dealloc(&state->expr_list); -} - -/* Make a Constant node, but decref the PyUnicode object being added. */ -static expr_ty -make_str_node_and_del(Parser *p, PyObject **str, Token* first_token, Token *last_token) -{ - PyObject *s = *str; - PyObject *kind = NULL; - *str = NULL; - assert(PyUnicode_CheckExact(s)); - if (_PyArena_AddPyObject(p->arena, s) < 0) { - Py_DECREF(s); - return NULL; - } - const char* the_str = PyBytes_AsString(first_token->bytes); - if (the_str && the_str[0] == 'u') { - kind = _PyPegen_new_identifier(p, "u"); - } - - if (kind == NULL && PyErr_Occurred()) { - return NULL; - } - - return _PyAST_Constant(s, kind, first_token->lineno, first_token->col_offset, - last_token->end_lineno, last_token->end_col_offset, - p->arena); - -} - - -/* Add a non-f-string (that is, a regular literal string). str is - decref'd. */ -int -_PyPegen_FstringParser_ConcatAndDel(FstringParser *state, PyObject *str) -{ - FstringParser_check_invariants(state); - - assert(PyUnicode_CheckExact(str)); - - if (PyUnicode_GET_LENGTH(str) == 0) { - Py_DECREF(str); - return 0; - } - - if (!state->last_str) { - /* We didn't have a string before, so just remember this one. */ - state->last_str = str; - } else { - /* Concatenate this with the previous string. */ - PyUnicode_AppendAndDel(&state->last_str, str); - if (!state->last_str) { - return -1; - } - } - FstringParser_check_invariants(state); - return 0; -} - -/* Parse an f-string. The f-string is in *str to end, with no - 'f' or quotes. */ -int -_PyPegen_FstringParser_ConcatFstring(Parser *p, FstringParser *state, const char **str, - const char *end, int raw, int recurse_lvl, - Token *first_token, Token* t, Token *last_token) -{ - FstringParser_check_invariants(state); - state->fmode = 1; - - /* Parse the f-string. */ - while (1) { - PyObject *literal = NULL; - PyObject *expr_text = NULL; - expr_ty expression = NULL; - - /* If there's a zero length literal in front of the - expression, literal will be NULL. If we're at the end of - the f-string, expression will be NULL (unless result == 1, - see below). */ - int result = fstring_find_literal_and_expr(p, str, end, raw, recurse_lvl, - &literal, &expr_text, - &expression, first_token, t, last_token); - if (result < 0) { - return -1; - } - - /* Add the literal, if any. */ - if (literal && _PyPegen_FstringParser_ConcatAndDel(state, literal) < 0) { - Py_XDECREF(expr_text); - return -1; - } - /* Add the expr_text, if any. */ - if (expr_text && _PyPegen_FstringParser_ConcatAndDel(state, expr_text) < 0) { - return -1; - } - - /* We've dealt with the literal and expr_text, their ownership has - been transferred to the state object. Don't look at them again. */ - - /* See if we should just loop around to get the next literal - and expression, while ignoring the expression this - time. This is used for un-doubling braces, as an - optimization. */ - if (result == 1) { - continue; - } - - if (!expression) { - /* We're done with this f-string. */ - break; - } - - /* We know we have an expression. Convert any existing string - to a Constant node. */ - if (state->last_str) { - /* Convert the existing last_str literal to a Constant node. */ - expr_ty last_str = make_str_node_and_del(p, &state->last_str, first_token, last_token); - if (!last_str || ExprList_Append(&state->expr_list, last_str) < 0) { - return -1; - } - } - - if (ExprList_Append(&state->expr_list, expression) < 0) { - return -1; - } - } - - /* If recurse_lvl is zero, then we must be at the end of the - string. Otherwise, we must be at a right brace. */ - - if (recurse_lvl == 0 && *str < end-1) { - RAISE_SYNTAX_ERROR("f-string: unexpected end of string"); - return -1; - } - if (recurse_lvl != 0 && **str != '}') { - RAISE_SYNTAX_ERROR("f-string: expecting '}'"); - return -1; - } - - FstringParser_check_invariants(state); - return 0; -} - -/* Convert the partial state reflected in last_str and expr_list to an - expr_ty. The expr_ty can be a Constant, or a JoinedStr. */ -expr_ty -_PyPegen_FstringParser_Finish(Parser *p, FstringParser *state, Token* first_token, - Token *last_token) -{ - asdl_expr_seq *seq; - - FstringParser_check_invariants(state); - - /* If we're just a constant string with no expressions, return - that. */ - if (!state->fmode) { - assert(!state->expr_list.size); - if (!state->last_str) { - /* Create a zero length string. */ - state->last_str = PyUnicode_FromStringAndSize(NULL, 0); - if (!state->last_str) { - goto error; + return NULL; } } - return make_str_node_and_del(p, &state->last_str, first_token, last_token); - } - - /* Create a Constant node out of last_str, if needed. It will be the - last node in our expression list. */ - if (state->last_str) { - expr_ty str = make_str_node_and_del(p, &state->last_str, first_token, last_token); - if (!str || ExprList_Append(&state->expr_list, str) < 0) { - goto error; + if (rawmode) { + return PyBytes_FromStringAndSize(s, len); } + return decode_bytes_with_escapes(p, s, len, t); } - /* This has already been freed. */ - assert(state->last_str == NULL); - - seq = ExprList_Finish(&state->expr_list, p->arena); - if (!seq) { - goto error; - } - - return _PyAST_JoinedStr(seq, first_token->lineno, first_token->col_offset, - last_token->end_lineno, last_token->end_col_offset, - p->arena); - -error: - _PyPegen_FstringParser_Dealloc(state); - return NULL; -} - -/* Given an f-string (with no 'f' or quotes) that's in *str and ends - at end, parse it into an expr_ty. Return NULL on error. Adjust - str to point past the parsed portion. */ -static expr_ty -fstring_parse(Parser *p, const char **str, const char *end, int raw, - int recurse_lvl, Token *first_token, Token* t, Token *last_token) -{ - FstringParser state; - - _PyPegen_FstringParser_Init(&state); - if (_PyPegen_FstringParser_ConcatFstring(p, &state, str, end, raw, recurse_lvl, - first_token, t, last_token) < 0) { - _PyPegen_FstringParser_Dealloc(&state); - return NULL; - } - - return _PyPegen_FstringParser_Finish(p, &state, t, t); + return _PyPegen_decode_string(p, rawmode, s, len, t); } diff --git a/Parser/string_parser.h b/Parser/string_parser.h index 4a22f3d3086f47..0b34de1b4e41e9 100644 --- a/Parser/string_parser.h +++ b/Parser/string_parser.h @@ -5,42 +5,7 @@ #include #include "pegen.h" -#define EXPRLIST_N_CACHED 64 - -typedef struct { - /* Incrementally build an array of expr_ty, so be used in an - asdl_seq. Cache some small but reasonably sized number of - expr_ty's, and then after that start dynamically allocating, - doubling the number allocated each time. Note that the f-string - f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one - Constant for the literal 'a'. So you add expr_ty's about twice as - fast as you add expressions in an f-string. */ - - Py_ssize_t allocated; /* Number we've allocated. */ - Py_ssize_t size; /* Number we've used. */ - expr_ty *p; /* Pointer to the memory we're actually - using. Will point to 'data' until we - start dynamically allocating. */ - expr_ty data[EXPRLIST_N_CACHED]; -} ExprList; - -/* The FstringParser is designed to add a mix of strings and - f-strings, and concat them together as needed. Ultimately, it - generates an expr_ty. */ -typedef struct { - PyObject *last_str; - ExprList expr_list; - int fmode; -} FstringParser; - -void _PyPegen_FstringParser_Init(FstringParser *); -int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, - const char **, Py_ssize_t *, Token *); -int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, - const char *, int, int, Token *, Token *, - Token *); -int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); -expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); -void _PyPegen_FstringParser_Dealloc(FstringParser *); +PyObject *_PyPegen_parse_string(Parser *, Token *); +PyObject *_PyPegen_decode_string(Parser *, int, const char *, size_t, Token *); #endif diff --git a/Parser/token.c b/Parser/token.c index 6299ad2f563144..82267fbfcd0c54 100644 --- a/Parser/token.c +++ b/Parser/token.c @@ -60,12 +60,16 @@ const char * const _PyParser_TokenNames[] = { "RARROW", "ELLIPSIS", "COLONEQUAL", + "EXCLAMATION", "OP", "AWAIT", "ASYNC", "TYPE_IGNORE", "TYPE_COMMENT", "SOFT_KEYWORD", + "FSTRING_START", + "FSTRING_MIDDLE", + "FSTRING_END", "", "", "", @@ -79,6 +83,7 @@ int _PyToken_OneChar(int c1) { switch (c1) { + case '!': return EXCLAMATION; case '%': return PERCENT; case '&': return AMPER; case '(': return LPAR; diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 463c0e00ca1411..1dfd2d6e5e1717 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -43,6 +43,28 @@ tok->lineno++; \ tok->col_offset = 0; +#ifdef Py_DEBUG +static inline tokenizer_mode* TOK_GET_MODE(struct tok_state* tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index < MAXLEVEL); + return &(tok->tok_mode_stack[tok->tok_mode_stack_index]); +} +static inline tokenizer_mode* TOK_NEXT_MODE(struct tok_state* tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index < MAXLEVEL); + return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); +} +static inline int *TOK_GET_BRACKET_MARK(tokenizer_mode* mode) { + assert(mode->bracket_mark_index >= 0); + assert(mode->bracket_mark_index < MAX_EXPR_NESTING); + return &(mode->bracket_mark[mode->bracket_mark_index]); +} +#else +#define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index])) +#define TOK_NEXT_MODE(tok) (&(tok->tok_mode_stack[++tok->tok_mode_stack_index])) +#define TOK_GET_BRACKET_MARK(mode) (&(mode->bracket_mark[mode->bracket_mark_index])) +#endif + /* Forward */ static struct tok_state *tok_new(void); static int tok_nextc(struct tok_state *tok); @@ -98,6 +120,9 @@ tok_new(void) tok->interactive_underflow = IUNDERFLOW_NORMAL; tok->str = NULL; tok->report_warnings = 1; + tok->tok_mode_stack[0] = (tokenizer_mode){.kind =TOK_REGULAR_MODE, .f_string_quote='\0', .f_string_quote_size = 0}; + tok->tok_mode_stack_index = 0; + tok->tok_report_warnings = 1; #ifdef Py_DEBUG tok->debug = _Py_GetConfig()->parser_debug; #endif @@ -346,6 +371,92 @@ tok_concatenate_interactive_new_line(struct tok_state *tok, const char *line) { } +/* Traverse and update all f-string buffers with the value */ +static void +update_fstring_buffers(struct tok_state *tok, char value, int regular, int multiline) +{ + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (regular && mode->f_string_start != NULL) { + mode->f_string_start += value; + } + if (multiline && mode->f_string_multi_line_start != NULL) { + mode->f_string_multi_line_start += value; + } + } +} + +static int +update_fstring_expr(struct tok_state *tok, char cur) +{ + assert(tok->cur != NULL); + + Py_ssize_t size = strlen(tok->cur); + tokenizer_mode *tok_mode = TOK_GET_MODE(tok); + + switch (cur) { + case '{': + if (tok_mode->last_expr_buffer != NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + } + tok_mode->last_expr_buffer = PyMem_Malloc(size); + if (tok_mode->last_expr_buffer == NULL) { + tok->done = E_NOMEM; + return 0; + } + tok_mode->last_expr_size = size; + tok_mode->last_expr_end = -1; + strncpy(tok_mode->last_expr_buffer, tok->cur, size); + break; + case 0: + if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { + return 1; + } + char *new_buffer = PyMem_Realloc( + tok_mode->last_expr_buffer, + tok_mode->last_expr_size + size + ); + if (new_buffer == NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + tok->done = E_NOMEM; + return 0; + } + tok_mode->last_expr_buffer = new_buffer; + strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, size); + tok_mode->last_expr_size += size; + break; + case '}': + case '!': + case ':': + if (tok_mode->last_expr_end == -1) { + tok_mode->last_expr_end = strlen(tok->start); + } + break; + } + + return 1; +} + +static void +free_fstring_expressions(struct tok_state *tok) +{ + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (mode->last_expr_buffer != NULL) { + PyMem_Free(mode->last_expr_buffer); + mode->last_expr_buffer = NULL; + mode->last_expr_size = 0; + mode->last_expr_end = -1; + } + } +} + /* Read a line of text from TOK into S, using the stream in TOK. Return NULL on failure, else S. @@ -372,6 +483,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf; Py_ssize_t line_start = tok->start == NULL ? -1 : tok->line_start - tok->buf; Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf; + update_fstring_buffers(tok, -*tok->buf, /*regular=*/1, /*multiline=*/1); newbuf = (char *)PyMem_Realloc(newbuf, newsize); if (newbuf == NULL) { tok->done = E_NOMEM; @@ -384,6 +496,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) tok->start = start < 0 ? NULL : tok->buf + start; tok->line_start = line_start < 0 ? NULL : tok->buf + line_start; tok->multi_line_start = multi_line_start < 0 ? NULL : tok->buf + multi_line_start; + update_fstring_buffers(tok, *tok->buf, /*regular=*/1, /*multiline=*/1); } return 1; } @@ -838,6 +951,7 @@ _PyTokenizer_Free(struct tok_state *tok) if (tok->interactive_src_start != NULL) { PyMem_Free(tok->interactive_src_start); } + free_fstring_expressions(tok); PyMem_Free(tok); } @@ -854,6 +968,9 @@ tok_readline_raw(struct tok_state *tok) if (line == NULL) { return 1; } + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } if (tok->fp_interactive && tok_concatenate_interactive_new_line(tok, line) == -1) { return 0; @@ -941,6 +1058,7 @@ tok_underflow_interactive(struct tok_state *tok) { } else if (tok->start != NULL) { Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; + update_fstring_buffers(tok, -*tok->buf, /*regular=*/0, /*multiline=*/1); size_t size = strlen(newtok); ADVANCE_LINENO(); if (!tok_reserve_buf(tok, size + 1)) { @@ -953,6 +1071,7 @@ tok_underflow_interactive(struct tok_state *tok) { PyMem_Free(newtok); tok->inp += size; tok->multi_line_start = tok->buf + cur_multi_line_start; + update_fstring_buffers(tok, *tok->buf, /*regular=*/0, /*multiline=*/1); } else { ADVANCE_LINENO(); @@ -969,6 +1088,10 @@ tok_underflow_interactive(struct tok_state *tok) { } return 0; } + + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } return 1; } @@ -1073,7 +1196,7 @@ tok_nextc(struct tok_state *tok) return Py_CHARMASK(*tok->cur++); /* Fast path */ } if (tok->done != E_OK) { - return EOF; + return EOF; } if (tok->fp == NULL) { rc = tok_underflow_string(tok); @@ -1115,7 +1238,7 @@ tok_backup(struct tok_state *tok, int c) if (--tok->cur < tok->buf) { Py_FatalError("tokenizer beginning of buffer"); } - if ((int)(unsigned char)*tok->cur != c) { + if ((int)(unsigned char)*tok->cur != Py_CHARMASK(c)) { Py_FatalError("tok_backup: wrong character"); } tok->col_offset--; @@ -1172,6 +1295,7 @@ _syntaxerror_range(struct tok_state *tok, const char *format, static int syntaxerror(struct tok_state *tok, const char *format, ...) { + // This errors are cleaned on startup. Todo: Fix it. va_list vargs; va_start(vargs, format); int ret = _syntaxerror_range(tok, format, -1, -1, vargs); @@ -1234,6 +1358,41 @@ parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) return -1; } +static int +warn_invalid_escape_sequence(struct tok_state *tok, int first_invalid_escape_char) +{ + + if (!tok->tok_report_warnings) { + return 0; + } + + PyObject *msg = PyUnicode_FromFormat( + "invalid escape sequence '\\%c'", + (char) first_invalid_escape_char + ); + + if (msg == NULL) { + return -1; + } + + if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg, tok->filename, + tok->lineno, NULL, NULL) < 0) { + Py_DECREF(msg); + + if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) { + /* Replace the DeprecationWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + return syntaxerror(tok, "invalid escape sequence '\\%c'", (char) first_invalid_escape_char); + } + + return -1; + } + + Py_DECREF(msg); + return 0; +} + static int lookahead(struct tok_state *tok, const char *test) { @@ -1389,7 +1548,6 @@ tok_decimal_tail(struct tok_state *tok) return c; } -/* Get next token, after space stripping etc. */ static inline int tok_continuation_line(struct tok_state *tok) { @@ -1427,7 +1585,12 @@ token_setup(struct tok_state *tok, struct token *token, int type, const char *st { assert((start == NULL && end == NULL) || (start != NULL && end != NULL)); token->level = tok->level; - token->lineno = type == STRING ? tok->first_lineno : tok->lineno; + if (ISSTRINGLIT(type)) { + token->lineno = tok->first_lineno; + } + else { + token->lineno = tok->lineno; + } token->end_lineno = tok->lineno; token->col_offset = token->end_col_offset = -1; token->start = start; @@ -1441,7 +1604,7 @@ token_setup(struct tok_state *tok, struct token *token, int type, const char *st } static int -tok_get(struct tok_state *tok, struct token *token) +tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) { int c; int blankline, nonascii; @@ -1602,6 +1765,11 @@ tok_get(struct tok_state *tok, struct token *token) /* Skip comment, unless it's a type comment */ if (c == '#') { + + if (tok->tok_mode_stack_index > 0) { + return MAKE_TOKEN(syntaxerror(tok, "f-string expression part cannot include '#'")); + } + const char *prefix, *p, *type_start; int current_starting_col_offset; @@ -1703,6 +1871,9 @@ tok_get(struct tok_state *tok, struct token *token) } c = tok_nextc(tok); if (c == '"' || c == '\'') { + if (saw_f) { + goto f_string_quote; + } goto letter_quote; } } @@ -1748,7 +1919,9 @@ tok_get(struct tok_state *tok, struct token *token) int ahead_tok_kind; memcpy(&ahead_tok, tok, sizeof(ahead_tok)); - ahead_tok_kind = tok_get(&ahead_tok, &ahead_token); + ahead_tok_kind = tok_get_normal_mode(&ahead_tok, + current_tok, + &ahead_token); if (ahead_tok_kind == NAME && ahead_tok.cur - ahead_tok.start == 3 @@ -2003,6 +2176,67 @@ tok_get(struct tok_state *tok, struct token *token) return MAKE_TOKEN(NUMBER); } + f_string_quote: + if (((tolower(*tok->start) == 'f' || tolower(*tok->start) == 'r') && (c == '\'' || c == '"'))) { + int quote = c; + int quote_size = 1; /* 1 or 3 */ + + /* Nodes of type STRING, especially multi line strings + must be handled differently in order to get both + the starting line number and the column offset right. + (cf. issue 16806) */ + tok->first_lineno = tok->lineno; + tok->multi_line_start = tok->line_start; + + /* Find the quote size and start of string */ + int after_quote = tok_nextc(tok); + if (after_quote == quote) { + int after_after_quote = tok_nextc(tok); + if (after_after_quote == quote) { + quote_size = 3; + } + else { + // TODO: Check this + tok_backup(tok, after_after_quote); + tok_backup(tok, after_quote); + } + } + if (after_quote != quote) { + tok_backup(tok, after_quote); + } + + + p_start = tok->start; + p_end = tok->cur; + tokenizer_mode *current_tok = TOK_NEXT_MODE(tok); + current_tok->kind = TOK_FSTRING_MODE; + current_tok->f_string_quote = quote; + current_tok->f_string_quote_size = quote_size; + current_tok->f_string_start = tok->start; + current_tok->f_string_multi_line_start = tok->line_start; + current_tok->last_expr_buffer = NULL; + current_tok->last_expr_size = 0; + current_tok->last_expr_end = -1; + + switch (*tok->start) { + case 'F': + case 'f': + current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; + break; + case 'R': + case 'r': + current_tok->f_string_raw = 1; + break; + default: + Py_UNREACHABLE(); + } + + current_tok->bracket_stack = 0; + current_tok->bracket_mark[0] = 0; + current_tok->bracket_mark_index = -1; + return MAKE_TOKEN(FSTRING_START); + } + letter_quote: /* String */ if (c == '\'' || c == '"') { @@ -2047,6 +2281,20 @@ tok_get(struct tok_state *tok, struct token *token) tok->line_start = tok->multi_line_start; int start = tok->lineno; tok->lineno = tok->first_lineno; + + if (tok->tok_mode_stack_index > 0) { + /* When we are in an f-string, before raising the + * unterminated string literal error, check whether + * does the initial quote matches with f-strings quotes + * and if it is, then this must be a missing '}' token + * so raise the proper error */ + tokenizer_mode *current_tok = TOK_GET_MODE(tok); + if (current_tok->f_string_quote == quote && + current_tok->f_string_quote_size == quote_size) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expecting '}'", start)); + } + } + if (quote_size == 3) { syntaxerror(tok, "unterminated triple-quoted string literal" " (detected at line %d)", start); @@ -2089,6 +2337,27 @@ tok_get(struct tok_state *tok, struct token *token) goto again; /* Read next line */ } + /* Punctuation character */ + int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); + if (is_punctuation && tok->tok_mode_stack_index > 0 && current_tok->bracket_mark_index >= 0) { + int mark = *TOK_GET_BRACKET_MARK(current_tok); + /* This code block gets executed before the bracket_stack is incremented + * by the `{` case, so for ensuring that we are on the 0th level, we need + * to adjust it manually */ + int cursor = current_tok->bracket_stack - (c != '{'); + + if (cursor == 0 && !update_fstring_expr(tok, c)) { + return MAKE_TOKEN(ENDMARKER); + } + + if (c == ':' && cursor == mark) { + current_tok->kind = TOK_FSTRING_MODE; + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(_PyToken_OneChar(c)); + } + } + /* Check for two-character token */ { int c2 = tok_nextc(tok); @@ -2121,11 +2390,18 @@ tok_get(struct tok_state *tok, struct token *token) tok->parenlinenostack[tok->level] = tok->lineno; tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); tok->level++; + + if (tok->tok_mode_stack_index > 0) { + current_tok->bracket_stack++; + } break; case ')': case ']': case '}': if (!tok->level) { + if (tok->tok_mode_stack_index > 0 && !current_tok->bracket_stack && c == '}') { + return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed")); + } return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); } tok->level--; @@ -2134,6 +2410,18 @@ tok_get(struct tok_state *tok, struct token *token) (opening == '[' && c == ']') || (opening == '{' && c == '}'))) { + /* If the opening bracket belongs to an f-string's expression + part (e.g. f"{)}") and the closing bracket is an arbitrary + nested expression, then instead of matching a different + syntactical construct with it; we'll throw an unmatched + parentheses error. */ + if (tok->tok_mode_stack_index > 0 && opening == '{') { + assert(current_tok->bracket_stack >= 0); + int previous_bracket = current_tok->bracket_stack - 1; + if (previous_bracket == *TOK_GET_BRACKET_MARK(current_tok)) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); + } + } if (tok->parenlinenostack[tok->level] != tok->lineno) { return MAKE_TOKEN(syntaxerror(tok, "closing parenthesis '%c' does not match " @@ -2147,6 +2435,14 @@ tok_get(struct tok_state *tok, struct token *token) c, opening)); } } + + if (tok->tok_mode_stack_index > 0) { + current_tok->bracket_stack--; + if (c == '}' && current_tok->bracket_stack == *TOK_GET_BRACKET_MARK(current_tok)) { + current_tok->bracket_mark_index--; + current_tok->kind = TOK_FSTRING_MODE; + } + } break; } @@ -2162,6 +2458,187 @@ tok_get(struct tok_state *tok, struct token *token) return MAKE_TOKEN(_PyToken_OneChar(c)); } +static int +tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) +{ + const char *p_start = NULL; + const char *p_end = NULL; + int end_quote_size = 0; + int unicode_escape = 0; + + tok->start = tok->cur; + tok->first_lineno = tok->lineno; + tok->starting_col_offset = tok->col_offset; + + // If we start with a bracket, we defer to the normal mode as there is nothing for us to tokenize + // before it. + int start_char = tok_nextc(tok); + int peek1 = tok_nextc(tok); + tok_backup(tok, peek1); + tok_backup(tok, start_char); + + if ((start_char == '{' && peek1 != '{') || (start_char == '}' && peek1 != '}')) { + if (start_char == '{') { + current_tok->bracket_mark_index++; + if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); + } + *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; + } + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + return tok_get_normal_mode(tok, current_tok, token); + } + + // Check if we are at the end of the string + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + int quote = tok_nextc(tok); + if (quote != current_tok->f_string_quote) { + tok_backup(tok, quote); + goto f_string_middle; + } + } + + if (current_tok->last_expr_buffer != NULL) { + PyMem_Free(current_tok->last_expr_buffer); + current_tok->last_expr_buffer = NULL; + current_tok->last_expr_size = 0; + current_tok->last_expr_end = -1; + } + + p_start = tok->start; + p_end = tok->cur; + tok->tok_mode_stack_index--; + return MAKE_TOKEN(FSTRING_END); + +f_string_middle: + + while (end_quote_size != current_tok->f_string_quote_size) { + int c = tok_nextc(tok); + if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) { + assert(tok->multi_line_start != NULL); + // shift the tok_state's location into + // the start of string, and report the error + // from the initial quote character + tok->cur = (char *)current_tok->f_string_start; + tok->cur++; + tok->line_start = current_tok->f_string_multi_line_start; + int start = tok->lineno; + tok->lineno = tok->first_lineno; + + if (current_tok->f_string_quote_size == 3) { + return MAKE_TOKEN(syntaxerror(tok, + "unterminated triple-quoted f-string literal" + " (detected at line %d)", start)); + } + else { + return MAKE_TOKEN(syntaxerror(tok, + "unterminated f-string literal (detected at" + " line %d)", start)); + } + } + + if (c == current_tok->f_string_quote) { + end_quote_size += 1; + continue; + } else { + end_quote_size = 0; + } + + int in_format_spec = current_tok->last_expr_end != -1 && current_tok->bracket_mark_index >= 0; + if (c == '{') { + int peek = tok_nextc(tok); + if (peek != '{' || in_format_spec) { + tok_backup(tok, peek); + tok_backup(tok, c); + current_tok->bracket_mark_index++; + if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); + } + *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + p_start = tok->start; + p_end = tok->cur; + } else { + p_start = tok->start; + p_end = tok->cur - 1; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '}') { + if (unicode_escape) { + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); + } + int peek = tok_nextc(tok); + + // The tokenizer can only be in the format spec if we have already completed the expression + // scanning (indicated by the end of the expression being set) and we are not at the top level + // of the bracket stack (-1 is the top level). Since format specifiers can't legally use double + // brackets, we can bypass it here. + if (peek == '}' && !in_format_spec) { + p_start = tok->start; + p_end = tok->cur - 1; + } else { + tok_backup(tok, peek); + tok_backup(tok, c); + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + p_start = tok->start; + p_end = tok->cur; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '\\') { + int peek = tok_nextc(tok); + // Special case when the backslash is right before a curly + // brace. We have to restore and return the control back + // to the loop for the next iteration. + if (peek == '{' || peek == '}') { + if (!current_tok->f_string_raw) { + if (warn_invalid_escape_sequence(tok, peek)) { + return MAKE_TOKEN(ERRORTOKEN); + } + } + tok_backup(tok, peek); + continue; + } + + if (!current_tok->f_string_raw) { + if (peek == 'N') { + /* Handle named unicode escapes (\N{BULLET}) */ + peek = tok_nextc(tok); + if (peek == '{') { + unicode_escape = 1; + } else { + tok_backup(tok, peek); + } + } + } /* else { + skip the escaped character + }*/ + } + } + + // Backup the f-string quotes to emit a final FSTRING_MIDDLE and + // add the quotes to the FSTRING_END in the next tokenizer iteration. + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + tok_backup(tok, current_tok->f_string_quote); + } + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); +} + + +static int +tok_get(struct tok_state *tok, struct token *token) +{ + tokenizer_mode *current_tok = TOK_GET_MODE(tok); + if (current_tok->kind == TOK_REGULAR_MODE) { + return tok_get_normal_mode(tok, current_tok, token); + } else { + return tok_get_fstring_mode(tok, current_tok, token); + } +} + int _PyTokenizer_Get(struct tok_state *tok, struct token *token) { diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 16a94d5f51d664..f67e0cd1ac2f4a 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -33,6 +33,31 @@ struct token { const char *start, *end; }; +enum tokenizer_mode_kind_t { + TOK_REGULAR_MODE, + TOK_FSTRING_MODE, +}; + +#define MAX_EXPR_NESTING 3 + +typedef struct _tokenizer_mode { + enum tokenizer_mode_kind_t kind; + + int bracket_stack; + int bracket_mark[MAX_EXPR_NESTING]; + int bracket_mark_index; + + char f_string_quote; + int f_string_quote_size; + int f_string_raw; + const char* f_string_start; + const char* f_string_multi_line_start; + + Py_ssize_t last_expr_size; + Py_ssize_t last_expr_end; + char* last_expr_buffer; +} tokenizer_mode; + /* Tokenizer state */ struct tok_state { /* Input state; buf <= cur <= inp <= end */ @@ -93,6 +118,10 @@ struct tok_state { /* How to proceed when asked for a new token in interactive mode */ enum interactive_underflow_t interactive_underflow; int report_warnings; + // TODO: Factor this into its own thing + tokenizer_mode tok_mode_stack[MAXLEVEL]; + int tok_mode_stack_index; + int tok_report_warnings; #ifdef Py_DEBUG int debug; #endif diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 4ac472a88261e1..cd9d1032629f49 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -27,12 +27,12 @@ unsigned char M_test_frozenmain[] = { 218,3,107,101,121,169,0,243,0,0,0,0,250,18,116,101, 115,116,95,102,114,111,122,101,110,109,97,105,110,46,112,121, 250,8,60,109,111,100,117,108,101,62,114,18,0,0,0,1, - 0,0,0,115,100,0,0,0,240,3,1,1,1,243,8,0, + 0,0,0,115,102,0,0,0,240,3,1,1,1,243,8,0, 1,11,219,0,24,225,0,5,208,6,26,212,0,27,217,0, 5,128,106,144,35,151,40,145,40,212,0,27,216,9,38,208, 9,26,215,9,38,209,9,38,211,9,40,168,24,209,9,50, 128,6,240,2,6,12,2,242,0,7,1,42,128,67,241,14, - 0,5,10,208,10,40,144,67,209,10,40,152,54,160,35,153, - 59,209,10,40,213,4,41,241,15,7,1,42,114,16,0,0, - 0, + 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,153, + 59,152,45,208,10,40,213,4,41,241,15,7,1,42,114,16, + 0,0,0, }; diff --git a/Python/Python-tokenize.c b/Python/Python-tokenize.c index 8daa9877254e2e..416dc5971bca3d 100644 --- a/Python/Python-tokenize.c +++ b/Python/Python-tokenize.c @@ -86,8 +86,8 @@ tokenizeriter_next(tokenizeriterobject *it) Py_DECREF(str); return NULL; } - const char *line_start = type == STRING ? it->tok->multi_line_start : it->tok->line_start; - int lineno = type == STRING ? it->tok->first_lineno : it->tok->lineno; + const char *line_start = ISSTRINGLIT(type) ? it->tok->multi_line_start : it->tok->line_start; + int lineno = ISSTRINGLIT(type) ? it->tok->first_lineno : it->tok->lineno; int end_lineno = it->tok->lineno; int col_offset = -1; int end_col_offset = -1; diff --git a/Tools/build/generate_token.py b/Tools/build/generate_token.py index fc12835b7762ad..3bd307c1733867 100755 --- a/Tools/build/generate_token.py +++ b/Tools/build/generate_token.py @@ -80,6 +80,8 @@ def update_file(file, content): (x) == NEWLINE || \\ (x) == INDENT || \\ (x) == DEDENT) +#define ISSTRINGLIT(x) ((x) == STRING || \\ + (x) == FSTRING_MIDDLE) // Symbols exported for test_peg_generator diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index e72ce7afdc4796..f57b6275f671d3 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -68,6 +68,7 @@ class NodeTypes(Enum): KEYWORD = 4 SOFT_KEYWORD = 5 CUT_OPERATOR = 6 + F_STRING_CHUNK = 7 BASE_NODETYPES = { From 5f7d68e48de19c5c3a241d7126fc2af227c2f74a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 11:53:34 -0600 Subject: [PATCH 02/24] gh-102856: Skip test_mismatched_parens in WASI builds (#103633) --- Lib/test/test_fstring.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index f571233da07b78..0e71de85f16b9c 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -13,6 +13,7 @@ import types import decimal import unittest +from test import support from test.support.os_helper import temp_cwd from test.support.script_helper import assert_python_failure @@ -536,6 +537,7 @@ def test_unterminated_string(self): r"""f'{("x}'""", ]) + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_mismatched_parens(self): self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", From d4aa8578b18d12380c841de96e8f80cac52bf61a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Wed, 19 Apr 2023 14:51:31 -0600 Subject: [PATCH 03/24] gh-102856: Clean some of the PEP 701 tokenizer implementation (#103634) --- Parser/tokenizer.c | 136 ++++++++++++++++++++++----------------------- Parser/tokenizer.h | 5 +- 2 files changed, 67 insertions(+), 74 deletions(-) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 1dfd2d6e5e1717..f992e55dcac488 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -11,11 +11,6 @@ #include "tokenizer.h" #include "errcode.h" -#include "unicodeobject.h" -#include "bytesobject.h" -#include "fileobject.h" -#include "abstract.h" - /* Alternate tab spacing */ #define ALTTABSIZE 1 @@ -43,6 +38,8 @@ tok->lineno++; \ tok->col_offset = 0; +#define INSIDE_FSTRING(tok) (tok->tok_mode_stack_index > 0) +#define INSIDE_FSTRING_EXPR(tok) (tok->curly_bracket_expr_start_depth >= 0) #ifdef Py_DEBUG static inline tokenizer_mode* TOK_GET_MODE(struct tok_state* tok) { assert(tok->tok_mode_stack_index >= 0); @@ -54,15 +51,9 @@ static inline tokenizer_mode* TOK_NEXT_MODE(struct tok_state* tok) { assert(tok->tok_mode_stack_index < MAXLEVEL); return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); } -static inline int *TOK_GET_BRACKET_MARK(tokenizer_mode* mode) { - assert(mode->bracket_mark_index >= 0); - assert(mode->bracket_mark_index < MAX_EXPR_NESTING); - return &(mode->bracket_mark[mode->bracket_mark_index]); -} #else #define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index])) #define TOK_NEXT_MODE(tok) (&(tok->tok_mode_stack[++tok->tok_mode_stack_index])) -#define TOK_GET_BRACKET_MARK(mode) (&(mode->bracket_mark[mode->bracket_mark_index])) #endif /* Forward */ @@ -398,20 +389,7 @@ update_fstring_expr(struct tok_state *tok, char cur) tokenizer_mode *tok_mode = TOK_GET_MODE(tok); switch (cur) { - case '{': - if (tok_mode->last_expr_buffer != NULL) { - PyMem_Free(tok_mode->last_expr_buffer); - } - tok_mode->last_expr_buffer = PyMem_Malloc(size); - if (tok_mode->last_expr_buffer == NULL) { - tok->done = E_NOMEM; - return 0; - } - tok_mode->last_expr_size = size; - tok_mode->last_expr_end = -1; - strncpy(tok_mode->last_expr_buffer, tok->cur, size); - break; - case 0: + case 0: if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { return 1; } @@ -421,13 +399,24 @@ update_fstring_expr(struct tok_state *tok, char cur) ); if (new_buffer == NULL) { PyMem_Free(tok_mode->last_expr_buffer); - tok->done = E_NOMEM; - return 0; + goto error; } tok_mode->last_expr_buffer = new_buffer; strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, size); tok_mode->last_expr_size += size; break; + case '{': + if (tok_mode->last_expr_buffer != NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + } + tok_mode->last_expr_buffer = PyMem_Malloc(size); + if (tok_mode->last_expr_buffer == NULL) { + goto error; + } + tok_mode->last_expr_size = size; + tok_mode->last_expr_end = -1; + strncpy(tok_mode->last_expr_buffer, tok->cur, size); + break; case '}': case '!': case ':': @@ -435,9 +424,13 @@ update_fstring_expr(struct tok_state *tok, char cur) tok_mode->last_expr_end = strlen(tok->start); } break; + default: + Py_UNREACHABLE(); } - return 1; +error: + tok->done = E_NOMEM; + return 0; } static void @@ -1766,7 +1759,7 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t /* Skip comment, unless it's a type comment */ if (c == '#') { - if (tok->tok_mode_stack_index > 0) { + if (INSIDE_FSTRING(tok)) { return MAKE_TOKEN(syntaxerror(tok, "f-string expression part cannot include '#'")); } @@ -2208,32 +2201,31 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t p_start = tok->start; p_end = tok->cur; - tokenizer_mode *current_tok = TOK_NEXT_MODE(tok); - current_tok->kind = TOK_FSTRING_MODE; - current_tok->f_string_quote = quote; - current_tok->f_string_quote_size = quote_size; - current_tok->f_string_start = tok->start; - current_tok->f_string_multi_line_start = tok->line_start; - current_tok->last_expr_buffer = NULL; - current_tok->last_expr_size = 0; - current_tok->last_expr_end = -1; + tokenizer_mode *the_current_tok = TOK_NEXT_MODE(tok); + the_current_tok->kind = TOK_FSTRING_MODE; + the_current_tok->f_string_quote = quote; + the_current_tok->f_string_quote_size = quote_size; + the_current_tok->f_string_start = tok->start; + the_current_tok->f_string_multi_line_start = tok->line_start; + the_current_tok->last_expr_buffer = NULL; + the_current_tok->last_expr_size = 0; + the_current_tok->last_expr_end = -1; switch (*tok->start) { case 'F': case 'f': - current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; + the_current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; break; case 'R': case 'r': - current_tok->f_string_raw = 1; + the_current_tok->f_string_raw = 1; break; default: Py_UNREACHABLE(); } - current_tok->bracket_stack = 0; - current_tok->bracket_mark[0] = 0; - current_tok->bracket_mark_index = -1; + the_current_tok->curly_bracket_depth = 0; + the_current_tok->curly_bracket_expr_start_depth = -1; return MAKE_TOKEN(FSTRING_START); } @@ -2282,15 +2274,15 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t int start = tok->lineno; tok->lineno = tok->first_lineno; - if (tok->tok_mode_stack_index > 0) { + if (INSIDE_FSTRING(tok)) { /* When we are in an f-string, before raising the * unterminated string literal error, check whether * does the initial quote matches with f-strings quotes * and if it is, then this must be a missing '}' token * so raise the proper error */ - tokenizer_mode *current_tok = TOK_GET_MODE(tok); - if (current_tok->f_string_quote == quote && - current_tok->f_string_quote_size == quote_size) { + tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); + if (the_current_tok->f_string_quote == quote && + the_current_tok->f_string_quote_size == quote_size) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expecting '}'", start)); } } @@ -2339,18 +2331,17 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t /* Punctuation character */ int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); - if (is_punctuation && tok->tok_mode_stack_index > 0 && current_tok->bracket_mark_index >= 0) { - int mark = *TOK_GET_BRACKET_MARK(current_tok); - /* This code block gets executed before the bracket_stack is incremented + if (is_punctuation && INSIDE_FSTRING(tok) && INSIDE_FSTRING_EXPR(current_tok)) { + /* This code block gets executed before the curly_bracket_depth is incremented * by the `{` case, so for ensuring that we are on the 0th level, we need * to adjust it manually */ - int cursor = current_tok->bracket_stack - (c != '{'); + int cursor = current_tok->curly_bracket_depth - (c != '{'); if (cursor == 0 && !update_fstring_expr(tok, c)) { return MAKE_TOKEN(ENDMARKER); } - if (c == ':' && cursor == mark) { + if (c == ':' && cursor == current_tok->curly_bracket_expr_start_depth) { current_tok->kind = TOK_FSTRING_MODE; p_start = tok->start; p_end = tok->cur; @@ -2390,16 +2381,15 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t tok->parenlinenostack[tok->level] = tok->lineno; tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); tok->level++; - - if (tok->tok_mode_stack_index > 0) { - current_tok->bracket_stack++; + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth++; } break; case ')': case ']': case '}': if (!tok->level) { - if (tok->tok_mode_stack_index > 0 && !current_tok->bracket_stack && c == '}') { + if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') { return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed")); } return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); @@ -2415,10 +2405,10 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t nested expression, then instead of matching a different syntactical construct with it; we'll throw an unmatched parentheses error. */ - if (tok->tok_mode_stack_index > 0 && opening == '{') { - assert(current_tok->bracket_stack >= 0); - int previous_bracket = current_tok->bracket_stack - 1; - if (previous_bracket == *TOK_GET_BRACKET_MARK(current_tok)) { + if (INSIDE_FSTRING(tok) && opening == '{') { + assert(current_tok->curly_bracket_depth >= 0); + int previous_bracket = current_tok->curly_bracket_depth - 1; + if (previous_bracket == current_tok->curly_bracket_expr_start_depth) { return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); } } @@ -2436,14 +2426,16 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t } } - if (tok->tok_mode_stack_index > 0) { - current_tok->bracket_stack--; - if (c == '}' && current_tok->bracket_stack == *TOK_GET_BRACKET_MARK(current_tok)) { - current_tok->bracket_mark_index--; + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth--; + if (c == '}' && current_tok->curly_bracket_depth == current_tok->curly_bracket_expr_start_depth) { + current_tok->curly_bracket_expr_start_depth--; current_tok->kind = TOK_FSTRING_MODE; } } break; + default: + break; } if (!Py_UNICODE_ISPRINTABLE(c)) { @@ -2479,11 +2471,10 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct if ((start_char == '{' && peek1 != '{') || (start_char == '}' && peek1 != '}')) { if (start_char == '{') { - current_tok->bracket_mark_index++; - if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); } - *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; } TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; return tok_get_normal_mode(tok, current_tok, token); @@ -2544,17 +2535,20 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct end_quote_size = 0; } - int in_format_spec = current_tok->last_expr_end != -1 && current_tok->bracket_mark_index >= 0; + int in_format_spec = ( + current_tok->last_expr_end != -1 + && + INSIDE_FSTRING_EXPR(current_tok) + ); if (c == '{') { int peek = tok_nextc(tok); if (peek != '{' || in_format_spec) { tok_backup(tok, peek); tok_backup(tok, c); - current_tok->bracket_mark_index++; - if (current_tok->bracket_mark_index >= MAX_EXPR_NESTING) { + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); } - *TOK_GET_BRACKET_MARK(current_tok) = current_tok->bracket_stack; TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; p_start = tok->start; p_end = tok->cur; diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index f67e0cd1ac2f4a..b75e4e8293d3d6 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -43,9 +43,8 @@ enum tokenizer_mode_kind_t { typedef struct _tokenizer_mode { enum tokenizer_mode_kind_t kind; - int bracket_stack; - int bracket_mark[MAX_EXPR_NESTING]; - int bracket_mark_index; + int curly_bracket_depth; + int curly_bracket_expr_start_depth; char f_string_quote; int f_string_quote_size; From 2b1260c55763a952c57b92fe0f274b6ee79efd05 Mon Sep 17 00:00:00 2001 From: Alexander Belopolsky Date: Wed, 19 Apr 2023 17:02:29 -0400 Subject: [PATCH 04/24] gh-83861: Fix datetime.astimezone() method (GH-101545) --- Lib/datetime.py | 5 +++++ Lib/test/datetimetester.py | 4 ++++ ...23-02-06-16-45-18.gh-issue-83861.mMbIU3.rst | 4 ++++ Modules/_datetimemodule.c | 18 ++++++++++++++++-- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst diff --git a/Lib/datetime.py b/Lib/datetime.py index 637144637485bc..09a2d2d5381c34 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1965,6 +1965,11 @@ def replace(self, year=None, month=None, day=None, hour=None, def _local_timezone(self): if self.tzinfo is None: ts = self._mktime() + # Detect gap + ts2 = self.replace(fold=1-self.fold)._mktime() + if ts2 != ts: # This happens in a gap or a fold + if (ts2 > ts) == self.fold: + ts = ts2 else: ts = (self - _EPOCH) // timedelta(seconds=1) localtm = _time.localtime(ts) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 570f803918c1ef..477f16f1841f62 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -6212,6 +6212,10 @@ def test_system_transitions(self): ts1 = dt.replace(fold=1).timestamp() self.assertEqual(ts0, s0 + ss / 2) self.assertEqual(ts1, s0 - ss / 2) + # gh-83861 + utc0 = dt.astimezone(timezone.utc) + utc1 = dt.replace(fold=1).astimezone(timezone.utc) + self.assertEqual(utc0, utc1 + timedelta(0, ss)) finally: if TZ is None: del os.environ['TZ'] diff --git a/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst b/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst new file mode 100644 index 00000000000000..e85e7a4ff2e73a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-06-16-45-18.gh-issue-83861.mMbIU3.rst @@ -0,0 +1,4 @@ +Fix datetime.astimezone method return value when invoked on a naive datetime +instance that represents local time falling in a timezone transition gap. +PEP 495 requires that instances with fold=1 produce earlier times than those +with fold=0 in this case. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index eda8c5610ba659..f317dc14e15bf1 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6153,17 +6153,31 @@ local_to_seconds(int year, int month, int day, static PyObject * local_timezone_from_local(PyDateTime_DateTime *local_dt) { - long long seconds; + long long seconds, seconds2; time_t timestamp; + int fold = DATE_GET_FOLD(local_dt); seconds = local_to_seconds(GET_YEAR(local_dt), GET_MONTH(local_dt), GET_DAY(local_dt), DATE_GET_HOUR(local_dt), DATE_GET_MINUTE(local_dt), DATE_GET_SECOND(local_dt), - DATE_GET_FOLD(local_dt)); + fold); if (seconds == -1) return NULL; + seconds2 = local_to_seconds(GET_YEAR(local_dt), + GET_MONTH(local_dt), + GET_DAY(local_dt), + DATE_GET_HOUR(local_dt), + DATE_GET_MINUTE(local_dt), + DATE_GET_SECOND(local_dt), + !fold); + if (seconds2 == -1) + return NULL; + /* Detect gap */ + if (seconds2 != seconds && (seconds2 > seconds) == fold) + seconds = seconds2; + /* XXX: add bounds check */ timestamp = seconds - epoch; return local_timezone_from_timestamp(timestamp); From 6be7aee18c5b8e639103df951d0d277f4b46f902 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 19 Apr 2023 16:09:35 -0600 Subject: [PATCH 05/24] gh-98040: Move the Single-Phase Init Tests Out of test_imp (gh-102561) I recently added some tests to test_imp, but @warsaw is removing that file in gh-98573. The tests are worth keeping so here I'm moving them to test_import. --- Lib/test/test_imp.py | 840 ------------------------------ Lib/test/test_import/__init__.py | 868 ++++++++++++++++++++++++++++++- 2 files changed, 865 insertions(+), 843 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 03e3adba221e57..80abc720c3251a 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -1,5 +1,4 @@ import gc -import json import importlib import importlib.util import os @@ -11,28 +10,15 @@ from test.support import os_helper from test.support import script_helper from test.support import warnings_helper -import textwrap -import types import unittest import warnings imp = warnings_helper.import_deprecated('imp') import _imp -import _testinternalcapi -try: - import _xxsubinterpreters as _interpreters -except ModuleNotFoundError: - _interpreters = None OS_PATH_NAME = os.path.__name__ -def requires_subinterpreters(meth): - """Decorator to skip a test if subinterpreters are not supported.""" - return unittest.skipIf(_interpreters is None, - 'subinterpreters required')(meth) - - def requires_load_dynamic(meth): """Decorator to skip a test if not running under CPython or lacking imp.load_dynamic().""" @@ -41,169 +27,6 @@ def requires_load_dynamic(meth): 'imp.load_dynamic() required')(meth) -class ModuleSnapshot(types.SimpleNamespace): - """A representation of a module for testing. - - Fields: - - * id - the module's object ID - * module - the actual module or an adequate substitute - * __file__ - * __spec__ - * name - * origin - * ns - a copy (dict) of the module's __dict__ (or None) - * ns_id - the object ID of the module's __dict__ - * cached - the sys.modules[mod.__spec__.name] entry (or None) - * cached_id - the object ID of the sys.modules entry (or None) - - In cases where the value is not available (e.g. due to serialization), - the value will be None. - """ - _fields = tuple('id module ns ns_id cached cached_id'.split()) - - @classmethod - def from_module(cls, mod): - name = mod.__spec__.name - cached = sys.modules.get(name) - return cls( - id=id(mod), - module=mod, - ns=types.SimpleNamespace(**mod.__dict__), - ns_id=id(mod.__dict__), - cached=cached, - cached_id=id(cached), - ) - - SCRIPT = textwrap.dedent(''' - {imports} - - name = {name!r} - - {prescript} - - mod = {name} - - {body} - - {postscript} - ''') - IMPORTS = textwrap.dedent(''' - import sys - ''').strip() - SCRIPT_BODY = textwrap.dedent(''' - # Capture the snapshot data. - cached = sys.modules.get(name) - snapshot = dict( - id=id(mod), - module=dict( - __file__=mod.__file__, - __spec__=dict( - name=mod.__spec__.name, - origin=mod.__spec__.origin, - ), - ), - ns=None, - ns_id=id(mod.__dict__), - cached=None, - cached_id=id(cached) if cached else None, - ) - ''').strip() - CLEANUP_SCRIPT = textwrap.dedent(''' - # Clean up the module. - sys.modules.pop(name, None) - ''').strip() - - @classmethod - def build_script(cls, name, *, - prescript=None, - import_first=False, - postscript=None, - postcleanup=False, - ): - if postcleanup is True: - postcleanup = cls.CLEANUP_SCRIPT - elif isinstance(postcleanup, str): - postcleanup = textwrap.dedent(postcleanup).strip() - postcleanup = cls.CLEANUP_SCRIPT + os.linesep + postcleanup - else: - postcleanup = '' - prescript = textwrap.dedent(prescript).strip() if prescript else '' - postscript = textwrap.dedent(postscript).strip() if postscript else '' - - if postcleanup: - if postscript: - postscript = postscript + os.linesep * 2 + postcleanup - else: - postscript = postcleanup - - if import_first: - prescript += textwrap.dedent(f''' - - # Now import the module. - assert name not in sys.modules - import {name}''') - - return cls.SCRIPT.format( - imports=cls.IMPORTS.strip(), - name=name, - prescript=prescript.strip(), - body=cls.SCRIPT_BODY.strip(), - postscript=postscript, - ) - - @classmethod - def parse(cls, text): - raw = json.loads(text) - mod = raw['module'] - mod['__spec__'] = types.SimpleNamespace(**mod['__spec__']) - raw['module'] = types.SimpleNamespace(**mod) - return cls(**raw) - - @classmethod - def from_subinterp(cls, name, interpid=None, *, pipe=None, **script_kwds): - if pipe is not None: - return cls._from_subinterp(name, interpid, pipe, script_kwds) - pipe = os.pipe() - try: - return cls._from_subinterp(name, interpid, pipe, script_kwds) - finally: - r, w = pipe - os.close(r) - os.close(w) - - @classmethod - def _from_subinterp(cls, name, interpid, pipe, script_kwargs): - r, w = pipe - - # Build the script. - postscript = textwrap.dedent(f''' - # Send the result over the pipe. - import json - import os - os.write({w}, json.dumps(snapshot).encode()) - - ''') - _postscript = script_kwargs.get('postscript') - if _postscript: - _postscript = textwrap.dedent(_postscript).lstrip() - postscript += _postscript - script_kwargs['postscript'] = postscript.strip() - script = cls.build_script(name, **script_kwargs) - - # Run the script. - if interpid is None: - ret = support.run_in_subinterp(script) - if ret != 0: - raise AssertionError(f'{ret} != 0') - else: - _interpreters.run_string(interpid, script) - - # Parse the results. - text = os.read(r, 1000) - return cls.parse(text.decode()) - - class LockTests(unittest.TestCase): """Very basic test of import lock functions.""" @@ -620,669 +443,6 @@ def check_get_builtins(): check_get_builtins() -class TestSinglePhaseSnapshot(ModuleSnapshot): - - @classmethod - def from_module(cls, mod): - self = super().from_module(mod) - self.summed = mod.sum(1, 2) - self.lookedup = mod.look_up_self() - self.lookedup_id = id(self.lookedup) - self.state_initialized = mod.state_initialized() - if hasattr(mod, 'initialized_count'): - self.init_count = mod.initialized_count() - return self - - SCRIPT_BODY = ModuleSnapshot.SCRIPT_BODY + textwrap.dedent(f''' - snapshot['module'].update(dict( - int_const=mod.int_const, - str_const=mod.str_const, - _module_initialized=mod._module_initialized, - )) - snapshot.update(dict( - summed=mod.sum(1, 2), - lookedup_id=id(mod.look_up_self()), - state_initialized=mod.state_initialized(), - init_count=mod.initialized_count(), - has_spam=hasattr(mod, 'spam'), - spam=getattr(mod, 'spam', None), - )) - ''').rstrip() - - @classmethod - def parse(cls, text): - self = super().parse(text) - if not self.has_spam: - del self.spam - del self.has_spam - return self - - -@requires_load_dynamic -class SinglephaseInitTests(unittest.TestCase): - - NAME = '_testsinglephase' - - @classmethod - def setUpClass(cls): - if '-R' in sys.argv or '--huntrleaks' in sys.argv: - # https://github.com/python/cpython/issues/102251 - raise unittest.SkipTest('unresolved refleaks (see gh-102251)') - fileobj, filename, _ = imp.find_module(cls.NAME) - fileobj.close() - cls.FILE = filename - - # Start fresh. - cls.clean_up() - - def tearDown(self): - # Clean up the module. - self.clean_up() - - @classmethod - def clean_up(cls): - name = cls.NAME - filename = cls.FILE - if name in sys.modules: - if hasattr(sys.modules[name], '_clear_globals'): - assert sys.modules[name].__file__ == filename - sys.modules[name]._clear_globals() - del sys.modules[name] - # Clear all internally cached data for the extension. - _testinternalcapi.clear_extension(name, filename) - - ######################### - # helpers - - def add_module_cleanup(self, name): - def clean_up(): - # Clear all internally cached data for the extension. - _testinternalcapi.clear_extension(name, self.FILE) - self.addCleanup(clean_up) - - def load(self, name): - try: - already_loaded = self.already_loaded - except AttributeError: - already_loaded = self.already_loaded = {} - assert name not in already_loaded - mod = imp.load_dynamic(name, self.FILE) - self.assertNotIn(mod, already_loaded.values()) - already_loaded[name] = mod - return types.SimpleNamespace( - name=name, - module=mod, - snapshot=TestSinglePhaseSnapshot.from_module(mod), - ) - - def re_load(self, name, mod): - assert sys.modules[name] is mod - assert mod.__dict__ == mod.__dict__ - reloaded = imp.load_dynamic(name, self.FILE) - return types.SimpleNamespace( - name=name, - module=reloaded, - snapshot=TestSinglePhaseSnapshot.from_module(reloaded), - ) - - # subinterpreters - - def add_subinterpreter(self): - interpid = _interpreters.create(isolated=False) - _interpreters.run_string(interpid, textwrap.dedent(''' - import sys - import _testinternalcapi - ''')) - def clean_up(): - _interpreters.run_string(interpid, textwrap.dedent(f''' - name = {self.NAME!r} - if name in sys.modules: - sys.modules[name]._clear_globals() - _testinternalcapi.clear_extension(name, {self.FILE!r}) - ''')) - _interpreters.destroy(interpid) - self.addCleanup(clean_up) - return interpid - - def import_in_subinterp(self, interpid=None, *, - postscript=None, - postcleanup=False, - ): - name = self.NAME - - if postcleanup: - import_ = 'import _testinternalcapi' if interpid is None else '' - postcleanup = f''' - {import_} - mod._clear_globals() - _testinternalcapi.clear_extension(name, {self.FILE!r}) - ''' - - try: - pipe = self._pipe - except AttributeError: - r, w = pipe = self._pipe = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - - snapshot = TestSinglePhaseSnapshot.from_subinterp( - name, - interpid, - pipe=pipe, - import_first=True, - postscript=postscript, - postcleanup=postcleanup, - ) - - return types.SimpleNamespace( - name=name, - module=None, - snapshot=snapshot, - ) - - # checks - - def check_common(self, loaded): - isolated = False - - mod = loaded.module - if not mod: - # It came from a subinterpreter. - isolated = True - mod = loaded.snapshot.module - # mod.__name__ might not match, but the spec will. - self.assertEqual(mod.__spec__.name, loaded.name) - self.assertEqual(mod.__file__, self.FILE) - self.assertEqual(mod.__spec__.origin, self.FILE) - if not isolated: - self.assertTrue(issubclass(mod.error, Exception)) - self.assertEqual(mod.int_const, 1969) - self.assertEqual(mod.str_const, 'something different') - self.assertIsInstance(mod._module_initialized, float) - self.assertGreater(mod._module_initialized, 0) - - snap = loaded.snapshot - self.assertEqual(snap.summed, 3) - if snap.state_initialized is not None: - self.assertIsInstance(snap.state_initialized, float) - self.assertGreater(snap.state_initialized, 0) - if isolated: - # The "looked up" module is interpreter-specific - # (interp->imports.modules_by_index was set for the module). - self.assertEqual(snap.lookedup_id, snap.id) - self.assertEqual(snap.cached_id, snap.id) - with self.assertRaises(AttributeError): - snap.spam - else: - self.assertIs(snap.lookedup, mod) - self.assertIs(snap.cached, mod) - - def check_direct(self, loaded): - # The module has its own PyModuleDef, with a matching name. - self.assertEqual(loaded.module.__name__, loaded.name) - self.assertIs(loaded.snapshot.lookedup, loaded.module) - - def check_indirect(self, loaded, orig): - # The module re-uses another's PyModuleDef, with a different name. - assert orig is not loaded.module - assert orig.__name__ != loaded.name - self.assertNotEqual(loaded.module.__name__, loaded.name) - self.assertIs(loaded.snapshot.lookedup, loaded.module) - - def check_basic(self, loaded, expected_init_count): - # m_size == -1 - # The module loads fresh the first time and copies m_copy after. - snap = loaded.snapshot - self.assertIsNot(snap.state_initialized, None) - self.assertIsInstance(snap.init_count, int) - self.assertGreater(snap.init_count, 0) - self.assertEqual(snap.init_count, expected_init_count) - - def check_with_reinit(self, loaded): - # m_size >= 0 - # The module loads fresh every time. - pass - - def check_fresh(self, loaded): - """ - The module had not been loaded before (at least since fully reset). - """ - snap = loaded.snapshot - # The module's init func was run. - # A copy of the module's __dict__ was stored in def->m_base.m_copy. - # The previous m_copy was deleted first. - # _PyRuntime.imports.extensions was set. - self.assertEqual(snap.init_count, 1) - # The global state was initialized. - # The module attrs were initialized from that state. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - - def check_semi_fresh(self, loaded, base, prev): - """ - The module had been loaded before and then reset - (but the module global state wasn't). - """ - snap = loaded.snapshot - # The module's init func was run again. - # A copy of the module's __dict__ was stored in def->m_base.m_copy. - # The previous m_copy was deleted first. - # The module globals did not get reset. - self.assertNotEqual(snap.id, base.snapshot.id) - self.assertNotEqual(snap.id, prev.snapshot.id) - self.assertEqual(snap.init_count, prev.snapshot.init_count + 1) - # The global state was updated. - # The module attrs were initialized from that state. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - self.assertNotEqual(snap.state_initialized, - base.snapshot.state_initialized) - self.assertNotEqual(snap.state_initialized, - prev.snapshot.state_initialized) - - def check_copied(self, loaded, base): - """ - The module had been loaded before and never reset. - """ - snap = loaded.snapshot - # The module's init func was not run again. - # The interpreter copied m_copy, as set by the other interpreter, - # with objects owned by the other interpreter. - # The module globals did not get reset. - self.assertNotEqual(snap.id, base.snapshot.id) - self.assertEqual(snap.init_count, base.snapshot.init_count) - # The global state was not updated since the init func did not run. - # The module attrs were not directly initialized from that state. - # The state and module attrs still match the previous loading. - self.assertEqual(snap.module._module_initialized, - snap.state_initialized) - self.assertEqual(snap.state_initialized, - base.snapshot.state_initialized) - - ######################### - # the tests - - def test_cleared_globals(self): - loaded = self.load(self.NAME) - _testsinglephase = loaded.module - init_before = _testsinglephase.state_initialized() - - _testsinglephase._clear_globals() - init_after = _testsinglephase.state_initialized() - init_count = _testsinglephase.initialized_count() - - self.assertGreater(init_before, 0) - self.assertEqual(init_after, 0) - self.assertEqual(init_count, -1) - - def test_variants(self): - # Exercise the most meaningful variants described in Python/import.c. - self.maxDiff = None - - # Check the "basic" module. - - name = self.NAME - expected_init_count = 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_direct(loaded) - self.check_basic(loaded, expected_init_count) - basic = loaded.module - - # Check its indirect variants. - - name = f'{self.NAME}_basic_wrapper' - self.add_module_cleanup(name) - expected_init_count += 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_indirect(loaded, basic) - self.check_basic(loaded, expected_init_count) - - # Currently PyState_AddModule() always replaces the cached module. - self.assertIs(basic.look_up_self(), loaded.module) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # The cached module shouldn't change after this point. - basic_lookedup = loaded.module - - # Check its direct variant. - - name = f'{self.NAME}_basic_copy' - self.add_module_cleanup(name) - expected_init_count += 1 - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.check_direct(loaded) - self.check_basic(loaded, expected_init_count) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # Check the non-basic variant that has no state. - - name = f'{self.NAME}_with_reinit' - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.assertIs(loaded.snapshot.state_initialized, None) - self.check_direct(loaded) - self.check_with_reinit(loaded) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - # Check the basic variant that has state. - - name = f'{self.NAME}_with_state' - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - - self.check_common(loaded) - self.assertIsNot(loaded.snapshot.state_initialized, None) - self.check_direct(loaded) - self.check_with_reinit(loaded) - - # This should change the cached module for _testsinglephase. - self.assertIs(basic.look_up_self(), basic_lookedup) - self.assertEqual(basic.initialized_count(), expected_init_count) - - def test_basic_reloaded(self): - # m_copy is copied into the existing module object. - # Global state is not changed. - self.maxDiff = None - - for name in [ - self.NAME, # the "basic" module - f'{self.NAME}_basic_wrapper', # the indirect variant - f'{self.NAME}_basic_copy', # the direct variant - ]: - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - reloaded = self.re_load(name, loaded.module) - - self.check_common(loaded) - self.check_common(reloaded) - - # Make sure the original __dict__ did not get replaced. - self.assertEqual(id(loaded.module.__dict__), - loaded.snapshot.ns_id) - self.assertEqual(loaded.snapshot.ns.__dict__, - loaded.module.__dict__) - - self.assertEqual(reloaded.module.__spec__.name, reloaded.name) - self.assertEqual(reloaded.module.__name__, - reloaded.snapshot.ns.__name__) - - self.assertIs(reloaded.module, loaded.module) - self.assertIs(reloaded.module.__dict__, loaded.module.__dict__) - # It only happens to be the same but that's good enough here. - # We really just want to verify that the re-loaded attrs - # didn't change. - self.assertIs(reloaded.snapshot.lookedup, - loaded.snapshot.lookedup) - self.assertEqual(reloaded.snapshot.state_initialized, - loaded.snapshot.state_initialized) - self.assertEqual(reloaded.snapshot.init_count, - loaded.snapshot.init_count) - - self.assertIs(reloaded.snapshot.cached, reloaded.module) - - def test_with_reinit_reloaded(self): - # The module's m_init func is run again. - self.maxDiff = None - - # Keep a reference around. - basic = self.load(self.NAME) - - for name in [ - f'{self.NAME}_with_reinit', # m_size == 0 - f'{self.NAME}_with_state', # m_size > 0 - ]: - self.add_module_cleanup(name) - with self.subTest(name): - loaded = self.load(name) - reloaded = self.re_load(name, loaded.module) - - self.check_common(loaded) - self.check_common(reloaded) - - # Make sure the original __dict__ did not get replaced. - self.assertEqual(id(loaded.module.__dict__), - loaded.snapshot.ns_id) - self.assertEqual(loaded.snapshot.ns.__dict__, - loaded.module.__dict__) - - self.assertEqual(reloaded.module.__spec__.name, reloaded.name) - self.assertEqual(reloaded.module.__name__, - reloaded.snapshot.ns.__name__) - - self.assertIsNot(reloaded.module, loaded.module) - self.assertNotEqual(reloaded.module.__dict__, - loaded.module.__dict__) - self.assertIs(reloaded.snapshot.lookedup, reloaded.module) - if loaded.snapshot.state_initialized is None: - self.assertIs(reloaded.snapshot.state_initialized, None) - else: - self.assertGreater(reloaded.snapshot.state_initialized, - loaded.snapshot.state_initialized) - - self.assertIs(reloaded.snapshot.cached, reloaded.module) - - # Currently, for every single-phrase init module loaded - # in multiple interpreters, those interpreters share a - # PyModuleDef for that object, which can be a problem. - # Also, we test with a single-phase module that has global state, - # which is shared by all interpreters. - - @requires_subinterpreters - def test_basic_multiple_interpreters_main_no_reset(self): - # without resetting; already loaded in main interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - main_loaded = self.load(self.NAME) - _testsinglephase = main_loaded.module - # Attrs set after loading are not in m_copy. - _testsinglephase.spam = 'spam, spam, spam, spam, eggs, and spam' - - self.check_common(main_loaded) - self.check_fresh(main_loaded) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # At this point: - # * alive in 1 interpreter (main) - # * module def in _PyRuntime.imports.extensions - # * mod init func ran for the first time (since reset, at least) - # * m_copy was copied from the main interpreter (was NULL) - # * module's global state was initialized - - # Use an interpreter that gets destroyed right away. - loaded = self.import_in_subinterp() - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 1 interpreter (main) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy is NULL (claered when the interpreter was destroyed) - # (was from main interpreter) - # * module's global state was updated, not reset - - # Use a subinterpreter that sticks around. - loaded = self.import_in_subinterp(interpid1) - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 2 interpreters (main, interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 - # * module's global state was updated, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded = self.import_in_subinterp(interpid2) - self.check_common(loaded) - self.check_copied(loaded, main_loaded) - - # At this point: - # * alive in 3 interpreters (main, interp1, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was updated, not reset - - @requires_subinterpreters - def test_basic_multiple_interpreters_deleted_no_reset(self): - # without resetting; already loaded in a deleted interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # First, load in the main interpreter but then completely clear it. - loaded_main = self.load(self.NAME) - loaded_main.module._clear_globals() - _testinternalcapi.clear_extension(self.NAME, self.FILE) - - # At this point: - # * alive in 0 interpreters - # * module def loaded already - # * module def was in _PyRuntime.imports.extensions, but cleared - # * mod init func ran for the first time (since reset, at least) - # * m_copy was set, but cleared (was NULL) - # * module's global state was initialized but cleared - - # Start with an interpreter that gets destroyed right away. - base = self.import_in_subinterp(postscript=''' - # Attrs set after loading are not in m_copy. - mod.spam = 'spam, spam, mash, spam, eggs, and spam' - ''') - self.check_common(base) - self.check_fresh(base) - - # At this point: - # * alive in 0 interpreters - # * module def in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy is NULL (claered when the interpreter was destroyed) - # * module's global state was initialized, not reset - - # Use a subinterpreter that sticks around. - loaded_interp1 = self.import_in_subinterp(interpid1) - self.check_common(loaded_interp1) - self.check_semi_fresh(loaded_interp1, loaded_main, base) - - # At this point: - # * alive in 1 interpreter (interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 (was NULL) - # * module's global state was updated, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded_interp2 = self.import_in_subinterp(interpid2) - self.check_common(loaded_interp2) - self.check_copied(loaded_interp2, loaded_interp1) - - # At this point: - # * alive in 2 interpreters (interp1, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was updated, not reset - - @requires_subinterpreters - @requires_load_dynamic - def test_basic_multiple_interpreters_reset_each(self): - # resetting between each interpreter - - # At this point: - # * alive in 0 interpreters - # * module def may or may not be loaded already - # * module def not in _PyRuntime.imports.extensions - # * mod init func has not run yet (since reset, at least) - # * m_copy not set (hasn't been loaded yet or already cleared) - # * module's global state has not been initialized yet - # (or already cleared) - - interpid1 = self.add_subinterpreter() - interpid2 = self.add_subinterpreter() - - # Use an interpreter that gets destroyed right away. - loaded = self.import_in_subinterp( - postscript=''' - # Attrs set after loading are not in m_copy. - mod.spam = 'spam, spam, mash, spam, eggs, and spam' - ''', - postcleanup=True, - ) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 0 interpreters - # * module def in _PyRuntime.imports.extensions - # * mod init func ran for the first time (since reset, at least) - # * m_copy is NULL (claered when the interpreter was destroyed) - # * module's global state was initialized, not reset - - # Use a subinterpreter that sticks around. - loaded = self.import_in_subinterp(interpid1, postcleanup=True) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 1 interpreter (interp1) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp1 (was NULL) - # * module's global state was initialized, not reset - - # Use a subinterpreter while the previous one is still alive. - loaded = self.import_in_subinterp(interpid2, postcleanup=True) - self.check_common(loaded) - self.check_fresh(loaded) - - # At this point: - # * alive in 2 interpreters (interp2, interp2) - # * module def still in _PyRuntime.imports.extensions - # * mod init func ran again - # * m_copy was copied from interp2 (was from interp1) - # * module's global state was initialized, not reset - - class ReloadTests(unittest.TestCase): """Very basic tests to make sure that imp.reload() operates just like diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 3ef07203c46c7e..66ae554f984fa2 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -2,6 +2,7 @@ import contextlib import errno import glob +import json import importlib.util from importlib._bootstrap_external import _get_sourcefile from importlib.machinery import ( @@ -18,13 +19,15 @@ import textwrap import threading import time +import types import unittest from unittest import mock +import _testinternalcapi from test.support import os_helper from test.support import ( STDLIB_DIR, swap_attr, swap_item, cpython_only, is_emscripten, - is_wasi, run_in_subinterp_with_config) + is_wasi, run_in_subinterp, run_in_subinterp_with_config) from test.support.import_helper import ( forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport) from test.support.os_helper import ( @@ -41,6 +44,10 @@ import _testmultiphase except ImportError: _testmultiphase = None +try: + import _xxsubinterpreters as _interpreters +except ModuleNotFoundError: + _interpreters = None skip_if_dont_write_bytecode = unittest.skipIf( @@ -120,6 +127,182 @@ def _ready_to_import(name=None, source=""): del sys.modules[name] +def requires_subinterpreters(meth): + """Decorator to skip a test if subinterpreters are not supported.""" + return unittest.skipIf(_interpreters is None, + 'subinterpreters required')(meth) + + +def requires_singlephase_init(meth): + """Decorator to skip if single-phase init modules are not supported.""" + meth = cpython_only(meth) + return unittest.skipIf(_testsinglephase is None, + 'test requires _testsinglephase module')(meth) + + +class ModuleSnapshot(types.SimpleNamespace): + """A representation of a module for testing. + + Fields: + + * id - the module's object ID + * module - the actual module or an adequate substitute + * __file__ + * __spec__ + * name + * origin + * ns - a copy (dict) of the module's __dict__ (or None) + * ns_id - the object ID of the module's __dict__ + * cached - the sys.modules[mod.__spec__.name] entry (or None) + * cached_id - the object ID of the sys.modules entry (or None) + + In cases where the value is not available (e.g. due to serialization), + the value will be None. + """ + _fields = tuple('id module ns ns_id cached cached_id'.split()) + + @classmethod + def from_module(cls, mod): + name = mod.__spec__.name + cached = sys.modules.get(name) + return cls( + id=id(mod), + module=mod, + ns=types.SimpleNamespace(**mod.__dict__), + ns_id=id(mod.__dict__), + cached=cached, + cached_id=id(cached), + ) + + SCRIPT = textwrap.dedent(''' + {imports} + + name = {name!r} + + {prescript} + + mod = {name} + + {body} + + {postscript} + ''') + IMPORTS = textwrap.dedent(''' + import sys + ''').strip() + SCRIPT_BODY = textwrap.dedent(''' + # Capture the snapshot data. + cached = sys.modules.get(name) + snapshot = dict( + id=id(mod), + module=dict( + __file__=mod.__file__, + __spec__=dict( + name=mod.__spec__.name, + origin=mod.__spec__.origin, + ), + ), + ns=None, + ns_id=id(mod.__dict__), + cached=None, + cached_id=id(cached) if cached else None, + ) + ''').strip() + CLEANUP_SCRIPT = textwrap.dedent(''' + # Clean up the module. + sys.modules.pop(name, None) + ''').strip() + + @classmethod + def build_script(cls, name, *, + prescript=None, + import_first=False, + postscript=None, + postcleanup=False, + ): + if postcleanup is True: + postcleanup = cls.CLEANUP_SCRIPT + elif isinstance(postcleanup, str): + postcleanup = textwrap.dedent(postcleanup).strip() + postcleanup = cls.CLEANUP_SCRIPT + os.linesep + postcleanup + else: + postcleanup = '' + prescript = textwrap.dedent(prescript).strip() if prescript else '' + postscript = textwrap.dedent(postscript).strip() if postscript else '' + + if postcleanup: + if postscript: + postscript = postscript + os.linesep * 2 + postcleanup + else: + postscript = postcleanup + + if import_first: + prescript += textwrap.dedent(f''' + + # Now import the module. + assert name not in sys.modules + import {name}''') + + return cls.SCRIPT.format( + imports=cls.IMPORTS.strip(), + name=name, + prescript=prescript.strip(), + body=cls.SCRIPT_BODY.strip(), + postscript=postscript, + ) + + @classmethod + def parse(cls, text): + raw = json.loads(text) + mod = raw['module'] + mod['__spec__'] = types.SimpleNamespace(**mod['__spec__']) + raw['module'] = types.SimpleNamespace(**mod) + return cls(**raw) + + @classmethod + def from_subinterp(cls, name, interpid=None, *, pipe=None, **script_kwds): + if pipe is not None: + return cls._from_subinterp(name, interpid, pipe, script_kwds) + pipe = os.pipe() + try: + return cls._from_subinterp(name, interpid, pipe, script_kwds) + finally: + r, w = pipe + os.close(r) + os.close(w) + + @classmethod + def _from_subinterp(cls, name, interpid, pipe, script_kwargs): + r, w = pipe + + # Build the script. + postscript = textwrap.dedent(f''' + # Send the result over the pipe. + import json + import os + os.write({w}, json.dumps(snapshot).encode()) + + ''') + _postscript = script_kwargs.get('postscript') + if _postscript: + _postscript = textwrap.dedent(_postscript).lstrip() + postscript += _postscript + script_kwargs['postscript'] = postscript.strip() + script = cls.build_script(name, **script_kwargs) + + # Run the script. + if interpid is None: + ret = run_in_subinterp(script) + if ret != 0: + raise AssertionError(f'{ret} != 0') + else: + _interpreters.run_string(interpid, script) + + # Parse the results. + text = os.read(r, 1000) + return cls.parse(text.decode()) + + class ImportTests(unittest.TestCase): def setUp(self): @@ -1604,7 +1787,7 @@ def test_frozen_compat(self): with self.subTest(f'{module}: strict, not fresh'): self.check_compatible_here(module, strict=True) - @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") + @requires_singlephase_init def test_single_init_extension_compat(self): module = '_testsinglephase' require_extension(module) @@ -1636,7 +1819,7 @@ def test_python_compat(self): with self.subTest(f'{module}: strict, fresh'): self.check_compatible_fresh(module, strict=True) - @unittest.skipIf(_testsinglephase is None, "test requires _testsinglephase module") + @requires_singlephase_init def test_singlephase_check_with_setting_and_override(self): module = '_testsinglephase' require_extension(module) @@ -1672,6 +1855,685 @@ def check_incompatible(setting, override): check_compatible(False, -1) +class TestSinglePhaseSnapshot(ModuleSnapshot): + + @classmethod + def from_module(cls, mod): + self = super().from_module(mod) + self.summed = mod.sum(1, 2) + self.lookedup = mod.look_up_self() + self.lookedup_id = id(self.lookedup) + self.state_initialized = mod.state_initialized() + if hasattr(mod, 'initialized_count'): + self.init_count = mod.initialized_count() + return self + + SCRIPT_BODY = ModuleSnapshot.SCRIPT_BODY + textwrap.dedent(f''' + snapshot['module'].update(dict( + int_const=mod.int_const, + str_const=mod.str_const, + _module_initialized=mod._module_initialized, + )) + snapshot.update(dict( + summed=mod.sum(1, 2), + lookedup_id=id(mod.look_up_self()), + state_initialized=mod.state_initialized(), + init_count=mod.initialized_count(), + has_spam=hasattr(mod, 'spam'), + spam=getattr(mod, 'spam', None), + )) + ''').rstrip() + + @classmethod + def parse(cls, text): + self = super().parse(text) + if not self.has_spam: + del self.spam + del self.has_spam + return self + + +@requires_singlephase_init +class SinglephaseInitTests(unittest.TestCase): + + NAME = '_testsinglephase' + + @classmethod + def setUpClass(cls): + if '-R' in sys.argv or '--huntrleaks' in sys.argv: + # https://github.com/python/cpython/issues/102251 + raise unittest.SkipTest('unresolved refleaks (see gh-102251)') + + spec = importlib.util.find_spec(cls.NAME) + from importlib.machinery import ExtensionFileLoader + cls.FILE = spec.origin + cls.LOADER = type(spec.loader) + assert cls.LOADER is ExtensionFileLoader + + # Start fresh. + cls.clean_up() + + def tearDown(self): + # Clean up the module. + self.clean_up() + + @classmethod + def clean_up(cls): + name = cls.NAME + filename = cls.FILE + if name in sys.modules: + if hasattr(sys.modules[name], '_clear_globals'): + assert sys.modules[name].__file__ == filename + sys.modules[name]._clear_globals() + del sys.modules[name] + # Clear all internally cached data for the extension. + _testinternalcapi.clear_extension(name, filename) + + ######################### + # helpers + + def add_module_cleanup(self, name): + def clean_up(): + # Clear all internally cached data for the extension. + _testinternalcapi.clear_extension(name, self.FILE) + self.addCleanup(clean_up) + + def _load_dynamic(self, name, path): + """ + Load an extension module. + """ + # This is essentially copied from the old imp module. + from importlib._bootstrap import _load + loader = self.LOADER(name, path) + + # Issue bpo-24748: Skip the sys.modules check in _load_module_shim; + # always load new extension. + spec = importlib.util.spec_from_file_location(name, path, + loader=loader) + return _load(spec) + + def load(self, name): + try: + already_loaded = self.already_loaded + except AttributeError: + already_loaded = self.already_loaded = {} + assert name not in already_loaded + mod = self._load_dynamic(name, self.FILE) + self.assertNotIn(mod, already_loaded.values()) + already_loaded[name] = mod + return types.SimpleNamespace( + name=name, + module=mod, + snapshot=TestSinglePhaseSnapshot.from_module(mod), + ) + + def re_load(self, name, mod): + assert sys.modules[name] is mod + assert mod.__dict__ == mod.__dict__ + reloaded = self._load_dynamic(name, self.FILE) + return types.SimpleNamespace( + name=name, + module=reloaded, + snapshot=TestSinglePhaseSnapshot.from_module(reloaded), + ) + + # subinterpreters + + def add_subinterpreter(self): + interpid = _interpreters.create(isolated=False) + _interpreters.run_string(interpid, textwrap.dedent(''' + import sys + import _testinternalcapi + ''')) + def clean_up(): + _interpreters.run_string(interpid, textwrap.dedent(f''' + name = {self.NAME!r} + if name in sys.modules: + sys.modules[name]._clear_globals() + _testinternalcapi.clear_extension(name, {self.FILE!r}) + ''')) + _interpreters.destroy(interpid) + self.addCleanup(clean_up) + return interpid + + def import_in_subinterp(self, interpid=None, *, + postscript=None, + postcleanup=False, + ): + name = self.NAME + + if postcleanup: + import_ = 'import _testinternalcapi' if interpid is None else '' + postcleanup = f''' + {import_} + mod._clear_globals() + _testinternalcapi.clear_extension(name, {self.FILE!r}) + ''' + + try: + pipe = self._pipe + except AttributeError: + r, w = pipe = self._pipe = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + + snapshot = TestSinglePhaseSnapshot.from_subinterp( + name, + interpid, + pipe=pipe, + import_first=True, + postscript=postscript, + postcleanup=postcleanup, + ) + + return types.SimpleNamespace( + name=name, + module=None, + snapshot=snapshot, + ) + + # checks + + def check_common(self, loaded): + isolated = False + + mod = loaded.module + if not mod: + # It came from a subinterpreter. + isolated = True + mod = loaded.snapshot.module + # mod.__name__ might not match, but the spec will. + self.assertEqual(mod.__spec__.name, loaded.name) + self.assertEqual(mod.__file__, self.FILE) + self.assertEqual(mod.__spec__.origin, self.FILE) + if not isolated: + self.assertTrue(issubclass(mod.error, Exception)) + self.assertEqual(mod.int_const, 1969) + self.assertEqual(mod.str_const, 'something different') + self.assertIsInstance(mod._module_initialized, float) + self.assertGreater(mod._module_initialized, 0) + + snap = loaded.snapshot + self.assertEqual(snap.summed, 3) + if snap.state_initialized is not None: + self.assertIsInstance(snap.state_initialized, float) + self.assertGreater(snap.state_initialized, 0) + if isolated: + # The "looked up" module is interpreter-specific + # (interp->imports.modules_by_index was set for the module). + self.assertEqual(snap.lookedup_id, snap.id) + self.assertEqual(snap.cached_id, snap.id) + with self.assertRaises(AttributeError): + snap.spam + else: + self.assertIs(snap.lookedup, mod) + self.assertIs(snap.cached, mod) + + def check_direct(self, loaded): + # The module has its own PyModuleDef, with a matching name. + self.assertEqual(loaded.module.__name__, loaded.name) + self.assertIs(loaded.snapshot.lookedup, loaded.module) + + def check_indirect(self, loaded, orig): + # The module re-uses another's PyModuleDef, with a different name. + assert orig is not loaded.module + assert orig.__name__ != loaded.name + self.assertNotEqual(loaded.module.__name__, loaded.name) + self.assertIs(loaded.snapshot.lookedup, loaded.module) + + def check_basic(self, loaded, expected_init_count): + # m_size == -1 + # The module loads fresh the first time and copies m_copy after. + snap = loaded.snapshot + self.assertIsNot(snap.state_initialized, None) + self.assertIsInstance(snap.init_count, int) + self.assertGreater(snap.init_count, 0) + self.assertEqual(snap.init_count, expected_init_count) + + def check_with_reinit(self, loaded): + # m_size >= 0 + # The module loads fresh every time. + pass + + def check_fresh(self, loaded): + """ + The module had not been loaded before (at least since fully reset). + """ + snap = loaded.snapshot + # The module's init func was run. + # A copy of the module's __dict__ was stored in def->m_base.m_copy. + # The previous m_copy was deleted first. + # _PyRuntime.imports.extensions was set. + self.assertEqual(snap.init_count, 1) + # The global state was initialized. + # The module attrs were initialized from that state. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + + def check_semi_fresh(self, loaded, base, prev): + """ + The module had been loaded before and then reset + (but the module global state wasn't). + """ + snap = loaded.snapshot + # The module's init func was run again. + # A copy of the module's __dict__ was stored in def->m_base.m_copy. + # The previous m_copy was deleted first. + # The module globals did not get reset. + self.assertNotEqual(snap.id, base.snapshot.id) + self.assertNotEqual(snap.id, prev.snapshot.id) + self.assertEqual(snap.init_count, prev.snapshot.init_count + 1) + # The global state was updated. + # The module attrs were initialized from that state. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + self.assertNotEqual(snap.state_initialized, + base.snapshot.state_initialized) + self.assertNotEqual(snap.state_initialized, + prev.snapshot.state_initialized) + + def check_copied(self, loaded, base): + """ + The module had been loaded before and never reset. + """ + snap = loaded.snapshot + # The module's init func was not run again. + # The interpreter copied m_copy, as set by the other interpreter, + # with objects owned by the other interpreter. + # The module globals did not get reset. + self.assertNotEqual(snap.id, base.snapshot.id) + self.assertEqual(snap.init_count, base.snapshot.init_count) + # The global state was not updated since the init func did not run. + # The module attrs were not directly initialized from that state. + # The state and module attrs still match the previous loading. + self.assertEqual(snap.module._module_initialized, + snap.state_initialized) + self.assertEqual(snap.state_initialized, + base.snapshot.state_initialized) + + ######################### + # the tests + + def test_cleared_globals(self): + loaded = self.load(self.NAME) + _testsinglephase = loaded.module + init_before = _testsinglephase.state_initialized() + + _testsinglephase._clear_globals() + init_after = _testsinglephase.state_initialized() + init_count = _testsinglephase.initialized_count() + + self.assertGreater(init_before, 0) + self.assertEqual(init_after, 0) + self.assertEqual(init_count, -1) + + def test_variants(self): + # Exercise the most meaningful variants described in Python/import.c. + self.maxDiff = None + + # Check the "basic" module. + + name = self.NAME + expected_init_count = 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_direct(loaded) + self.check_basic(loaded, expected_init_count) + basic = loaded.module + + # Check its indirect variants. + + name = f'{self.NAME}_basic_wrapper' + self.add_module_cleanup(name) + expected_init_count += 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_indirect(loaded, basic) + self.check_basic(loaded, expected_init_count) + + # Currently PyState_AddModule() always replaces the cached module. + self.assertIs(basic.look_up_self(), loaded.module) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # The cached module shouldn't change after this point. + basic_lookedup = loaded.module + + # Check its direct variant. + + name = f'{self.NAME}_basic_copy' + self.add_module_cleanup(name) + expected_init_count += 1 + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.check_direct(loaded) + self.check_basic(loaded, expected_init_count) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # Check the non-basic variant that has no state. + + name = f'{self.NAME}_with_reinit' + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.assertIs(loaded.snapshot.state_initialized, None) + self.check_direct(loaded) + self.check_with_reinit(loaded) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + # Check the basic variant that has state. + + name = f'{self.NAME}_with_state' + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + + self.check_common(loaded) + self.assertIsNot(loaded.snapshot.state_initialized, None) + self.check_direct(loaded) + self.check_with_reinit(loaded) + + # This should change the cached module for _testsinglephase. + self.assertIs(basic.look_up_self(), basic_lookedup) + self.assertEqual(basic.initialized_count(), expected_init_count) + + def test_basic_reloaded(self): + # m_copy is copied into the existing module object. + # Global state is not changed. + self.maxDiff = None + + for name in [ + self.NAME, # the "basic" module + f'{self.NAME}_basic_wrapper', # the indirect variant + f'{self.NAME}_basic_copy', # the direct variant + ]: + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + reloaded = self.re_load(name, loaded.module) + + self.check_common(loaded) + self.check_common(reloaded) + + # Make sure the original __dict__ did not get replaced. + self.assertEqual(id(loaded.module.__dict__), + loaded.snapshot.ns_id) + self.assertEqual(loaded.snapshot.ns.__dict__, + loaded.module.__dict__) + + self.assertEqual(reloaded.module.__spec__.name, reloaded.name) + self.assertEqual(reloaded.module.__name__, + reloaded.snapshot.ns.__name__) + + self.assertIs(reloaded.module, loaded.module) + self.assertIs(reloaded.module.__dict__, loaded.module.__dict__) + # It only happens to be the same but that's good enough here. + # We really just want to verify that the re-loaded attrs + # didn't change. + self.assertIs(reloaded.snapshot.lookedup, + loaded.snapshot.lookedup) + self.assertEqual(reloaded.snapshot.state_initialized, + loaded.snapshot.state_initialized) + self.assertEqual(reloaded.snapshot.init_count, + loaded.snapshot.init_count) + + self.assertIs(reloaded.snapshot.cached, reloaded.module) + + def test_with_reinit_reloaded(self): + # The module's m_init func is run again. + self.maxDiff = None + + # Keep a reference around. + basic = self.load(self.NAME) + + for name in [ + f'{self.NAME}_with_reinit', # m_size == 0 + f'{self.NAME}_with_state', # m_size > 0 + ]: + self.add_module_cleanup(name) + with self.subTest(name): + loaded = self.load(name) + reloaded = self.re_load(name, loaded.module) + + self.check_common(loaded) + self.check_common(reloaded) + + # Make sure the original __dict__ did not get replaced. + self.assertEqual(id(loaded.module.__dict__), + loaded.snapshot.ns_id) + self.assertEqual(loaded.snapshot.ns.__dict__, + loaded.module.__dict__) + + self.assertEqual(reloaded.module.__spec__.name, reloaded.name) + self.assertEqual(reloaded.module.__name__, + reloaded.snapshot.ns.__name__) + + self.assertIsNot(reloaded.module, loaded.module) + self.assertNotEqual(reloaded.module.__dict__, + loaded.module.__dict__) + self.assertIs(reloaded.snapshot.lookedup, reloaded.module) + if loaded.snapshot.state_initialized is None: + self.assertIs(reloaded.snapshot.state_initialized, None) + else: + self.assertGreater(reloaded.snapshot.state_initialized, + loaded.snapshot.state_initialized) + + self.assertIs(reloaded.snapshot.cached, reloaded.module) + + # Currently, for every single-phrase init module loaded + # in multiple interpreters, those interpreters share a + # PyModuleDef for that object, which can be a problem. + # Also, we test with a single-phase module that has global state, + # which is shared by all interpreters. + + @requires_subinterpreters + def test_basic_multiple_interpreters_main_no_reset(self): + # without resetting; already loaded in main interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + main_loaded = self.load(self.NAME) + _testsinglephase = main_loaded.module + # Attrs set after loading are not in m_copy. + _testsinglephase.spam = 'spam, spam, spam, spam, eggs, and spam' + + self.check_common(main_loaded) + self.check_fresh(main_loaded) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # At this point: + # * alive in 1 interpreter (main) + # * module def in _PyRuntime.imports.extensions + # * mod init func ran for the first time (since reset, at least) + # * m_copy was copied from the main interpreter (was NULL) + # * module's global state was initialized + + # Use an interpreter that gets destroyed right away. + loaded = self.import_in_subinterp() + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 1 interpreter (main) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy is NULL (claered when the interpreter was destroyed) + # (was from main interpreter) + # * module's global state was updated, not reset + + # Use a subinterpreter that sticks around. + loaded = self.import_in_subinterp(interpid1) + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 2 interpreters (main, interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 + # * module's global state was updated, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded = self.import_in_subinterp(interpid2) + self.check_common(loaded) + self.check_copied(loaded, main_loaded) + + # At this point: + # * alive in 3 interpreters (main, interp1, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was updated, not reset + + @requires_subinterpreters + def test_basic_multiple_interpreters_deleted_no_reset(self): + # without resetting; already loaded in a deleted interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # First, load in the main interpreter but then completely clear it. + loaded_main = self.load(self.NAME) + loaded_main.module._clear_globals() + _testinternalcapi.clear_extension(self.NAME, self.FILE) + + # At this point: + # * alive in 0 interpreters + # * module def loaded already + # * module def was in _PyRuntime.imports.extensions, but cleared + # * mod init func ran for the first time (since reset, at least) + # * m_copy was set, but cleared (was NULL) + # * module's global state was initialized but cleared + + # Start with an interpreter that gets destroyed right away. + base = self.import_in_subinterp(postscript=''' + # Attrs set after loading are not in m_copy. + mod.spam = 'spam, spam, mash, spam, eggs, and spam' + ''') + self.check_common(base) + self.check_fresh(base) + + # At this point: + # * alive in 0 interpreters + # * module def in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy is NULL (claered when the interpreter was destroyed) + # * module's global state was initialized, not reset + + # Use a subinterpreter that sticks around. + loaded_interp1 = self.import_in_subinterp(interpid1) + self.check_common(loaded_interp1) + self.check_semi_fresh(loaded_interp1, loaded_main, base) + + # At this point: + # * alive in 1 interpreter (interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 (was NULL) + # * module's global state was updated, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded_interp2 = self.import_in_subinterp(interpid2) + self.check_common(loaded_interp2) + self.check_copied(loaded_interp2, loaded_interp1) + + # At this point: + # * alive in 2 interpreters (interp1, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was updated, not reset + + @requires_subinterpreters + def test_basic_multiple_interpreters_reset_each(self): + # resetting between each interpreter + + # At this point: + # * alive in 0 interpreters + # * module def may or may not be loaded already + # * module def not in _PyRuntime.imports.extensions + # * mod init func has not run yet (since reset, at least) + # * m_copy not set (hasn't been loaded yet or already cleared) + # * module's global state has not been initialized yet + # (or already cleared) + + interpid1 = self.add_subinterpreter() + interpid2 = self.add_subinterpreter() + + # Use an interpreter that gets destroyed right away. + loaded = self.import_in_subinterp( + postscript=''' + # Attrs set after loading are not in m_copy. + mod.spam = 'spam, spam, mash, spam, eggs, and spam' + ''', + postcleanup=True, + ) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 0 interpreters + # * module def in _PyRuntime.imports.extensions + # * mod init func ran for the first time (since reset, at least) + # * m_copy is NULL (claered when the interpreter was destroyed) + # * module's global state was initialized, not reset + + # Use a subinterpreter that sticks around. + loaded = self.import_in_subinterp(interpid1, postcleanup=True) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 1 interpreter (interp1) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp1 (was NULL) + # * module's global state was initialized, not reset + + # Use a subinterpreter while the previous one is still alive. + loaded = self.import_in_subinterp(interpid2, postcleanup=True) + self.check_common(loaded) + self.check_fresh(loaded) + + # At this point: + # * alive in 2 interpreters (interp2, interp2) + # * module def still in _PyRuntime.imports.extensions + # * mod init func ran again + # * m_copy was copied from interp2 (was from interp1) + # * module's global state was initialized, not reset + + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. unittest.main() From 4898415df724380d4c8b0ec08e8cb92f126193c3 Mon Sep 17 00:00:00 2001 From: Adrien Date: Thu, 20 Apr 2023 16:07:41 +0200 Subject: [PATCH 06/24] gh-98641: Document difference between task group and gather (#103644) The purpose of the comments is to rule out the implication that asyncio.TaskGroup is a drop-in replacement / better alternative to asyncio.gather(). --- Doc/library/asyncio-task.rst | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index b81d89acf7fd88..ba0f909c405a34 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -256,8 +256,9 @@ Creating Tasks .. note:: - :meth:`asyncio.TaskGroup.create_task` is a newer alternative - that allows for convenient waiting for a group of related tasks. + :meth:`asyncio.TaskGroup.create_task` is a new alternative + leveraging structural concurrency; it allows for waiting + for a group of related tasks with strong safety guarantees. .. important:: @@ -340,7 +341,7 @@ Example:: async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) - print("Both tasks have completed now.") + print(f"Both tasks have completed now: {task1.result()}, {task2.result()}") The ``async with`` statement will wait for all tasks in the group to finish. While waiting, new tasks may still be added to the group @@ -459,8 +460,12 @@ Running Tasks Concurrently Tasks/Futures to be cancelled. .. note:: - A more modern way to create and run tasks concurrently and - wait for their completion is :class:`asyncio.TaskGroup`. + A new alternative to create and run tasks concurrently and + wait for their completion is :class:`asyncio.TaskGroup`. *TaskGroup* + provides stronger safety guarantees than *gather* for scheduling a nesting of subtasks: + if a task (or a subtask, a task scheduled by a task) + raises an exception, *TaskGroup* will, while *gather* will not, + cancel the remaining scheduled tasks). .. _asyncio_example_gather: From 5c00a6224d55f8818ef567b93f484b5429e2ae80 Mon Sep 17 00:00:00 2001 From: Wheeler Law Date: Thu, 20 Apr 2023 21:04:25 -0500 Subject: [PATCH 07/24] gh-99352: Respect `http.client.HTTPConnection.debuglevel` in `urllib.request.AbstractHTTPHandler` (#99353) * bugfix: let the HTTP- and HTTPSHandlers respect the value of http.client.HTTPConnection.debuglevel * add tests * add news * ReSTify NEWS and reword a bit. * Address Review Comments. * Use mock.patch.object instead of settting the module level value. * Used test values to assert the debuglevel. --------- Co-authored-by: Gregory P. Smith Co-authored-by: Senthil Kumaran --- Lib/test/test_urllib2.py | 65 ++++++++++++++----- Lib/urllib/request.py | 7 +- ...2-11-10-16-26-47.gh-issue-99353.DQFjnt.rst | 3 + 3 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 633d596ac3de3f..b7c6f6dd8f1b99 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -3,6 +3,7 @@ from test.support import os_helper from test.support import warnings_helper from test import test_urllib +from unittest import mock import os import io @@ -484,7 +485,18 @@ def build_test_opener(*handler_instances): return opener -class MockHTTPHandler(urllib.request.BaseHandler): +class MockHTTPHandler(urllib.request.HTTPHandler): + # Very simple mock HTTP handler with no special behavior other than using a mock HTTP connection + + def __init__(self, debuglevel=None): + super(MockHTTPHandler, self).__init__(debuglevel=debuglevel) + self.httpconn = MockHTTPClass() + + def http_open(self, req): + return self.do_open(self.httpconn, req) + + +class MockHTTPHandlerRedirect(urllib.request.BaseHandler): # useful for testing redirections and auth # sends supplied headers and code as first response # sends 200 OK as second response @@ -512,12 +524,12 @@ def http_open(self, req): return MockResponse(200, "OK", msg, "", req.get_full_url()) -class MockHTTPSHandler(urllib.request.AbstractHTTPHandler): +class MockHTTPSHandler(urllib.request.HTTPSHandler): # Useful for testing the Proxy-Authorization request by verifying the # properties of httpcon - def __init__(self, debuglevel=0): - urllib.request.AbstractHTTPHandler.__init__(self, debuglevel=debuglevel) + def __init__(self, debuglevel=None, context=None, check_hostname=None): + super(MockHTTPSHandler, self).__init__(debuglevel, context, check_hostname) self.httpconn = MockHTTPClass() def https_open(self, req): @@ -1048,12 +1060,35 @@ def test_http_body_array(self): newreq = h.do_request_(req) self.assertEqual(int(newreq.get_header('Content-length')),16) - def test_http_handler_debuglevel(self): + def test_http_handler_global_debuglevel(self): + with mock.patch.object(http.client.HTTPConnection, 'debuglevel', 6): + o = OpenerDirector() + h = MockHTTPHandler() + o.add_handler(h) + o.open("http://www.example.com") + self.assertEqual(h._debuglevel, 6) + + def test_http_handler_local_debuglevel(self): + o = OpenerDirector() + h = MockHTTPHandler(debuglevel=5) + o.add_handler(h) + o.open("http://www.example.com") + self.assertEqual(h._debuglevel, 5) + + def test_https_handler_global_debuglevel(self): + with mock.patch.object(http.client.HTTPSConnection, 'debuglevel', 7): + o = OpenerDirector() + h = MockHTTPSHandler() + o.add_handler(h) + o.open("https://www.example.com") + self.assertEqual(h._debuglevel, 7) + + def test_https_handler_local_debuglevel(self): o = OpenerDirector() - h = MockHTTPSHandler(debuglevel=1) + h = MockHTTPSHandler(debuglevel=4) o.add_handler(h) o.open("https://www.example.com") - self.assertEqual(h._debuglevel, 1) + self.assertEqual(h._debuglevel, 4) def test_http_doubleslash(self): # Checks the presence of any unnecessary double slash in url does not @@ -1289,7 +1324,7 @@ def test_cookie_redirect(self): cj = CookieJar() interact_netscape(cj, "http://www.example.com/", "spam=eggs") - hh = MockHTTPHandler(302, "Location: http://www.cracker.com/\r\n\r\n") + hh = MockHTTPHandlerRedirect(302, "Location: http://www.cracker.com/\r\n\r\n") hdeh = urllib.request.HTTPDefaultErrorHandler() hrh = urllib.request.HTTPRedirectHandler() cp = urllib.request.HTTPCookieProcessor(cj) @@ -1299,7 +1334,7 @@ def test_cookie_redirect(self): def test_redirect_fragment(self): redirected_url = 'http://www.example.com/index.html#OK\r\n\r\n' - hh = MockHTTPHandler(302, 'Location: ' + redirected_url) + hh = MockHTTPHandlerRedirect(302, 'Location: ' + redirected_url) hdeh = urllib.request.HTTPDefaultErrorHandler() hrh = urllib.request.HTTPRedirectHandler() o = build_test_opener(hh, hdeh, hrh) @@ -1484,7 +1519,7 @@ def check_basic_auth(self, headers, realm): password_manager = MockPasswordManager() auth_handler = urllib.request.HTTPBasicAuthHandler(password_manager) body = '\r\n'.join(headers) + '\r\n\r\n' - http_handler = MockHTTPHandler(401, body) + http_handler = MockHTTPHandlerRedirect(401, body) opener.add_handler(auth_handler) opener.add_handler(http_handler) self._test_basic_auth(opener, auth_handler, "Authorization", @@ -1544,7 +1579,7 @@ def test_proxy_basic_auth(self): password_manager = MockPasswordManager() auth_handler = urllib.request.ProxyBasicAuthHandler(password_manager) realm = "ACME Networks" - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 407, 'Proxy-Authenticate: Basic realm="%s"\r\n\r\n' % realm) opener.add_handler(auth_handler) opener.add_handler(http_handler) @@ -1588,7 +1623,7 @@ def http_error_401(self, *args, **kwds): digest_handler = TestDigestAuthHandler(password_manager) basic_handler = TestBasicAuthHandler(password_manager) realm = "ACME Networks" - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Basic realm="%s"\r\n\r\n' % realm) opener.add_handler(basic_handler) opener.add_handler(digest_handler) @@ -1608,7 +1643,7 @@ def test_unsupported_auth_digest_handler(self): opener = OpenerDirector() # While using DigestAuthHandler digest_auth_handler = urllib.request.HTTPDigestAuthHandler(None) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Kerberos\r\n\r\n') opener.add_handler(digest_auth_handler) opener.add_handler(http_handler) @@ -1618,7 +1653,7 @@ def test_unsupported_auth_basic_handler(self): # While using BasicAuthHandler opener = OpenerDirector() basic_auth_handler = urllib.request.HTTPBasicAuthHandler(None) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: NTLM\r\n\r\n') opener.add_handler(basic_auth_handler) opener.add_handler(http_handler) @@ -1705,7 +1740,7 @@ def test_basic_prior_auth_send_after_first_success(self): opener = OpenerDirector() opener.add_handler(auth_prior_handler) - http_handler = MockHTTPHandler( + http_handler = MockHTTPHandlerRedirect( 401, 'WWW-Authenticate: Basic realm="%s"\r\n\r\n' % None) opener.add_handler(http_handler) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 151034e6a81bf9..19e2e5bd335627 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1251,8 +1251,8 @@ def http_error_407(self, req, fp, code, msg, headers): class AbstractHTTPHandler(BaseHandler): - def __init__(self, debuglevel=0): - self._debuglevel = debuglevel + def __init__(self, debuglevel=None): + self._debuglevel = debuglevel if debuglevel is not None else http.client.HTTPConnection.debuglevel def set_http_debuglevel(self, level): self._debuglevel = level @@ -1378,7 +1378,8 @@ def http_open(self, req): class HTTPSHandler(AbstractHTTPHandler): - def __init__(self, debuglevel=0, context=None, check_hostname=None): + def __init__(self, debuglevel=None, context=None, check_hostname=None): + debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel AbstractHTTPHandler.__init__(self, debuglevel) if context is None: http_version = http.client.HTTPSConnection._http_vsn diff --git a/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst b/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst new file mode 100644 index 00000000000000..1ad42d5c9aa53d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-10-16-26-47.gh-issue-99353.DQFjnt.rst @@ -0,0 +1,3 @@ +Respect the :class:`http.client.HTTPConnection` ``.debuglevel`` flag +in :class:`urllib.request.AbstractHTTPHandler` when its constructor +parameter ``debuglevel`` is not set. And do the same for ``*HTTPS*``. From 3e0fec7e07a71bdeeab7554e980110fbc47763b9 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Thu, 20 Apr 2023 22:12:48 -0400 Subject: [PATCH 08/24] Sync with importlib_metadata 6.5 (GH-103584) --- Doc/library/importlib.metadata.rst | 4 + Lib/importlib/metadata/__init__.py | 98 +++++++++-- Lib/importlib/metadata/_adapters.py | 21 +++ Lib/importlib/metadata/_meta.py | 28 +++- Lib/test/test_importlib/_context.py | 13 ++ Lib/test/test_importlib/_path.py | 109 +++++++++++++ Lib/test/test_importlib/fixtures.py | 153 +++++++++++++----- Lib/test/test_importlib/test_main.py | 109 ++++++++++++- Lib/test/test_importlib/test_metadata_api.py | 56 ++++++- ...-04-16-19-48-21.gh-issue-103584.3mBTuM.rst | 12 ++ 10 files changed, 531 insertions(+), 72 deletions(-) create mode 100644 Lib/test/test_importlib/_context.py create mode 100644 Lib/test/test_importlib/_path.py create mode 100644 Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 6e084101995e25..b306d5f55a714f 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -308,6 +308,10 @@ Python module or `Import Package >> packages_distributions() {'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...} +Some editable installs, `do not supply top-level names +`_, and thus this +function is not reliable with such installs. + .. versionadded:: 3.10 .. _distributions: diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 40ab1a1aaac328..b8eb19d05dccae 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -12,7 +12,9 @@ import functools import itertools import posixpath +import contextlib import collections +import inspect from . import _adapters, _meta from ._collections import FreezableDefaultDict, Pair @@ -24,7 +26,7 @@ from importlib import import_module from importlib.abc import MetaPathFinder from itertools import starmap -from typing import List, Mapping, Optional +from typing import List, Mapping, Optional, cast __all__ = [ @@ -341,11 +343,30 @@ def __repr__(self): return f'' -class Distribution: +class DeprecatedNonAbstract: + def __new__(cls, *args, **kwargs): + all_names = { + name for subclass in inspect.getmro(cls) for name in vars(subclass) + } + abstract = { + name + for name in all_names + if getattr(getattr(cls, name), '__isabstractmethod__', False) + } + if abstract: + warnings.warn( + f"Unimplemented abstract methods {abstract}", + DeprecationWarning, + stacklevel=2, + ) + return super().__new__(cls) + + +class Distribution(DeprecatedNonAbstract): """A Python distribution package.""" @abc.abstractmethod - def read_text(self, filename): + def read_text(self, filename) -> Optional[str]: """Attempt to load metadata file given by the name. :param filename: The name of the file in the distribution info. @@ -419,7 +440,7 @@ def metadata(self) -> _meta.PackageMetadata: The returned object will have keys that name the various bits of metadata. See PEP 566 for details. """ - text = ( + opt_text = ( self.read_text('METADATA') or self.read_text('PKG-INFO') # This last clause is here to support old egg-info files. Its @@ -427,6 +448,7 @@ def metadata(self) -> _meta.PackageMetadata: # (which points to the egg-info file) attribute unchanged. or self.read_text('') ) + text = cast(str, opt_text) return _adapters.Message(email.message_from_string(text)) @property @@ -455,8 +477,8 @@ def files(self): :return: List of PackagePath for this distribution or None Result is `None` if the metadata file that enumerates files - (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is - missing. + (i.e. RECORD for dist-info, or installed-files.txt or + SOURCES.txt for egg-info) is missing. Result may be empty if the metadata exists but is empty. """ @@ -469,9 +491,19 @@ def make_file(name, hash=None, size_str=None): @pass_none def make_files(lines): - return list(starmap(make_file, csv.reader(lines))) + return starmap(make_file, csv.reader(lines)) - return make_files(self._read_files_distinfo() or self._read_files_egginfo()) + @pass_none + def skip_missing_files(package_paths): + return list(filter(lambda path: path.locate().exists(), package_paths)) + + return skip_missing_files( + make_files( + self._read_files_distinfo() + or self._read_files_egginfo_installed() + or self._read_files_egginfo_sources() + ) + ) def _read_files_distinfo(self): """ @@ -480,10 +512,43 @@ def _read_files_distinfo(self): text = self.read_text('RECORD') return text and text.splitlines() - def _read_files_egginfo(self): + def _read_files_egginfo_installed(self): + """ + Read installed-files.txt and return lines in a similar + CSV-parsable format as RECORD: each file must be placed + relative to the site-packages directory, and must also be + quoted (since file names can contain literal commas). + + This file is written when the package is installed by pip, + but it might not be written for other installation methods. + Hence, even if we can assume that this file is accurate + when it exists, we cannot assume that it always exists. """ - SOURCES.txt might contain literal commas, so wrap each line - in quotes. + text = self.read_text('installed-files.txt') + # We need to prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available in the PathDistribution's self._path + # which is not easily accessible from this base class... + subdir = getattr(self, '_path', None) + if not text or not subdir: + return + with contextlib.suppress(Exception): + ret = [ + str((subdir / line).resolve().relative_to(self.locate_file(''))) + for line in text.splitlines() + ] + return map('"{}"'.format, ret) + + def _read_files_egginfo_sources(self): + """ + Read SOURCES.txt and return lines in a similar CSV-parsable + format as RECORD: each file name must be quoted (since it + might contain literal commas). + + Note that SOURCES.txt is not a reliable source for what + files are installed by a package. This file is generated + for a source archive, and the files that are present + there (e.g. setup.py) may not correctly reflect the files + that are present after the package has been installed. """ text = self.read_text('SOURCES.txt') return text and map('"{}"'.format, text.splitlines()) @@ -886,8 +951,13 @@ def _top_level_declared(dist): def _top_level_inferred(dist): - return { - f.parts[0] if len(f.parts) > 1 else f.with_suffix('').name + opt_names = { + f.parts[0] if len(f.parts) > 1 else inspect.getmodulename(f) for f in always_iterable(dist.files) - if f.suffix == ".py" } + + @pass_none + def importable_name(name): + return '.' not in name + + return filter(importable_name, opt_names) diff --git a/Lib/importlib/metadata/_adapters.py b/Lib/importlib/metadata/_adapters.py index aa460d3eda50fb..6aed69a30857e4 100644 --- a/Lib/importlib/metadata/_adapters.py +++ b/Lib/importlib/metadata/_adapters.py @@ -1,3 +1,5 @@ +import functools +import warnings import re import textwrap import email.message @@ -5,6 +7,15 @@ from ._text import FoldedCase +# Do not remove prior to 2024-01-01 or Python 3.14 +_warn = functools.partial( + warnings.warn, + "Implicit None on return values is deprecated and will raise KeyErrors.", + DeprecationWarning, + stacklevel=2, +) + + class Message(email.message.Message): multiple_use_keys = set( map( @@ -39,6 +50,16 @@ def __init__(self, *args, **kwargs): def __iter__(self): return super().__iter__() + def __getitem__(self, item): + """ + Warn users that a ``KeyError`` can be expected when a + mising key is supplied. Ref python/importlib_metadata#371. + """ + res = super().__getitem__(item) + if res is None: + _warn() + return res + def _repair_headers(self): def redent(value): "Correct for RFC822 indentation" diff --git a/Lib/importlib/metadata/_meta.py b/Lib/importlib/metadata/_meta.py index d5c0576194ece2..c9a7ef906a8a8c 100644 --- a/Lib/importlib/metadata/_meta.py +++ b/Lib/importlib/metadata/_meta.py @@ -1,4 +1,5 @@ -from typing import Any, Dict, Iterator, List, Protocol, TypeVar, Union +from typing import Protocol +from typing import Any, Dict, Iterator, List, Optional, TypeVar, Union, overload _T = TypeVar("_T") @@ -17,7 +18,21 @@ def __getitem__(self, key: str) -> str: def __iter__(self) -> Iterator[str]: ... # pragma: no cover - def get_all(self, name: str, failobj: _T = ...) -> Union[List[Any], _T]: + @overload + def get(self, name: str, failobj: None = None) -> Optional[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: _T) -> Union[str, _T]: + ... # pragma: no cover + + # overload per python/importlib_metadata#435 + @overload + def get_all(self, name: str, failobj: None = None) -> Optional[List[Any]]: + ... # pragma: no cover + + @overload + def get_all(self, name: str, failobj: _T) -> Union[List[Any], _T]: """ Return all values associated with a possibly multi-valued key. """ @@ -29,18 +44,19 @@ def json(self) -> Dict[str, Union[str, List[str]]]: """ -class SimplePath(Protocol): +class SimplePath(Protocol[_T]): """ A minimal subset of pathlib.Path required by PathDistribution. """ - def joinpath(self) -> 'SimplePath': + def joinpath(self) -> _T: ... # pragma: no cover - def __truediv__(self) -> 'SimplePath': + def __truediv__(self, other: Union[str, _T]) -> _T: ... # pragma: no cover - def parent(self) -> 'SimplePath': + @property + def parent(self) -> _T: ... # pragma: no cover def read_text(self) -> str: diff --git a/Lib/test/test_importlib/_context.py b/Lib/test/test_importlib/_context.py new file mode 100644 index 00000000000000..8a53eb55d1503b --- /dev/null +++ b/Lib/test/test_importlib/_context.py @@ -0,0 +1,13 @@ +import contextlib + + +# from jaraco.context 4.3 +class suppress(contextlib.suppress, contextlib.ContextDecorator): + """ + A version of contextlib.suppress with decorator support. + + >>> @suppress(KeyError) + ... def key_error(): + ... {}[''] + >>> key_error() + """ diff --git a/Lib/test/test_importlib/_path.py b/Lib/test/test_importlib/_path.py new file mode 100644 index 00000000000000..71a704389b986e --- /dev/null +++ b/Lib/test/test_importlib/_path.py @@ -0,0 +1,109 @@ +# from jaraco.path 3.5 + +import functools +import pathlib +from typing import Dict, Union + +try: + from typing import Protocol, runtime_checkable +except ImportError: # pragma: no cover + # Python 3.7 + from typing_extensions import Protocol, runtime_checkable # type: ignore + + +FilesSpec = Dict[str, Union[str, bytes, 'FilesSpec']] # type: ignore + + +@runtime_checkable +class TreeMaker(Protocol): + def __truediv__(self, *args, **kwargs): + ... # pragma: no cover + + def mkdir(self, **kwargs): + ... # pragma: no cover + + def write_text(self, content, **kwargs): + ... # pragma: no cover + + def write_bytes(self, content): + ... # pragma: no cover + + +def _ensure_tree_maker(obj: Union[str, TreeMaker]) -> TreeMaker: + return obj if isinstance(obj, TreeMaker) else pathlib.Path(obj) # type: ignore + + +def build( + spec: FilesSpec, + prefix: Union[str, TreeMaker] = pathlib.Path(), # type: ignore +): + """ + Build a set of files/directories, as described by the spec. + + Each key represents a pathname, and the value represents + the content. Content may be a nested directory. + + >>> spec = { + ... 'README.txt': "A README file", + ... "foo": { + ... "__init__.py": "", + ... "bar": { + ... "__init__.py": "", + ... }, + ... "baz.py": "# Some code", + ... } + ... } + >>> target = getfixture('tmp_path') + >>> build(spec, target) + >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') + '# Some code' + """ + for name, contents in spec.items(): + create(contents, _ensure_tree_maker(prefix) / name) + + +@functools.singledispatch +def create(content: Union[str, bytes, FilesSpec], path): + path.mkdir(exist_ok=True) + build(content, prefix=path) # type: ignore + + +@create.register +def _(content: bytes, path): + path.write_bytes(content) + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +class Recording: + """ + A TreeMaker object that records everything that would be written. + + >>> r = Recording() + >>> build({'foo': {'foo1.txt': 'yes'}, 'bar.txt': 'abc'}, r) + >>> r.record + ['foo/foo1.txt', 'bar.txt'] + """ + + def __init__(self, loc=pathlib.PurePosixPath(), record=None): + self.loc = loc + self.record = record if record is not None else [] + + def __truediv__(self, other): + return Recording(self.loc / other, self.record) + + def write_text(self, content, **kwargs): + self.record.append(str(self.loc)) + + write_bytes = write_text + + def mkdir(self, **kwargs): + return diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index e7be77b3957c67..a364a977bce781 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -10,7 +10,10 @@ from test.support.os_helper import FS_NONASCII from test.support import requires_zlib -from typing import Dict, Union + +from . import _path +from ._path import FilesSpec + try: from importlib import resources # type: ignore @@ -83,13 +86,8 @@ def setUp(self): self.fixtures.enter_context(self.add_sys_path(self.site_dir)) -# Except for python/mypy#731, prefer to define -# FilesDef = Dict[str, Union['FilesDef', str]] -FilesDef = Dict[str, Union[Dict[str, Union[Dict[str, str], str]], str]] - - class DistInfoPkg(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "distinfo_pkg-1.0.0.dist-info": { "METADATA": """ Name: distinfo-pkg @@ -131,7 +129,7 @@ def make_uppercase(self): class DistInfoPkgWithDot(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "pkg_dot-1.0.0.dist-info": { "METADATA": """ Name: pkg.dot @@ -146,7 +144,7 @@ def setUp(self): class DistInfoPkgWithDotLegacy(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "pkg.dot-1.0.0.dist-info": { "METADATA": """ Name: pkg.dot @@ -173,7 +171,7 @@ def setUp(self): class EggInfoPkg(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "egginfo_pkg.egg-info": { "PKG-INFO": """ Name: egginfo-pkg @@ -212,8 +210,99 @@ def setUp(self): build_files(EggInfoPkg.files, prefix=self.site_dir) +class EggInfoPkgPipInstalledNoToplevel(OnSysPath, SiteDir): + files: FilesSpec = { + "egg_with_module_pkg.egg-info": { + "PKG-INFO": "Name: egg_with_module-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + egg_with_module.py + setup.py + egg_with_module_pkg.egg-info/PKG-INFO + egg_with_module_pkg.egg-info/SOURCES.txt + egg_with_module_pkg.egg-info/top_level.txt + """, + # installed-files.txt is written by pip, and is a strictly more + # accurate source than SOURCES.txt as to the installed contents of + # the package. + "installed-files.txt": """ + ../egg_with_module.py + PKG-INFO + SOURCES.txt + top_level.txt + """, + # missing top_level.txt (to trigger fallback to installed-files.txt) + }, + "egg_with_module.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgPipInstalledNoToplevel.files, prefix=self.site_dir) + + +class EggInfoPkgPipInstalledNoModules(OnSysPath, SiteDir): + files: FilesSpec = { + "egg_with_no_modules_pkg.egg-info": { + "PKG-INFO": "Name: egg_with_no_modules-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + setup.py + egg_with_no_modules_pkg.egg-info/PKG-INFO + egg_with_no_modules_pkg.egg-info/SOURCES.txt + egg_with_no_modules_pkg.egg-info/top_level.txt + """, + # installed-files.txt is written by pip, and is a strictly more + # accurate source than SOURCES.txt as to the installed contents of + # the package. + "installed-files.txt": """ + PKG-INFO + SOURCES.txt + top_level.txt + """, + # top_level.txt correctly reflects that no modules are installed + "top_level.txt": b"\n", + }, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgPipInstalledNoModules.files, prefix=self.site_dir) + + +class EggInfoPkgSourcesFallback(OnSysPath, SiteDir): + files: FilesSpec = { + "sources_fallback_pkg.egg-info": { + "PKG-INFO": "Name: sources_fallback-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + sources_fallback.py + setup.py + sources_fallback_pkg.egg-info/PKG-INFO + sources_fallback_pkg.egg-info/SOURCES.txt + """, + # missing installed-files.txt (i.e. not installed by pip) and + # missing top_level.txt (to trigger fallback to SOURCES.txt) + }, + "sources_fallback.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgSourcesFallback.files, prefix=self.site_dir) + + class EggInfoFile(OnSysPath, SiteDir): - files: FilesDef = { + files: FilesSpec = { "egginfo_file.egg-info": """ Metadata-Version: 1.0 Name: egginfo_file @@ -233,38 +322,22 @@ def setUp(self): build_files(EggInfoFile.files, prefix=self.site_dir) -def build_files(file_defs, prefix=pathlib.Path()): - """Build a set of files/directories, as described by the +# dedent all text strings before writing +orig = _path.create.registry[str] +_path.create.register(str, lambda content, path: orig(DALS(content), path)) - file_defs dictionary. Each key/value pair in the dictionary is - interpreted as a filename/contents pair. If the contents value is a - dictionary, a directory is created, and the dictionary interpreted - as the files within it, recursively. - For example: +build_files = _path.build - {"README.txt": "A README file", - "foo": { - "__init__.py": "", - "bar": { - "__init__.py": "", - }, - "baz.py": "# Some code", - } - } - """ - for name, contents in file_defs.items(): - full_name = prefix / name - if isinstance(contents, dict): - full_name.mkdir() - build_files(contents, prefix=full_name) - else: - if isinstance(contents, bytes): - with full_name.open('wb') as f: - f.write(contents) - else: - with full_name.open('w', encoding='utf-8') as f: - f.write(DALS(contents)) + +def build_record(file_defs): + return ''.join(f'{name},,\n' for name in record_names(file_defs)) + + +def record_names(file_defs): + recording = _path.Recording() + _path.build(file_defs, recording) + return recording.record class FileBuilder: diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index 30b68b6ae7d86e..46cd2b696d4cc8 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -1,7 +1,10 @@ import re import pickle import unittest +import warnings import importlib.metadata +import contextlib +import itertools try: import pyfakefs.fake_filesystem_unittest as ffs @@ -9,6 +12,7 @@ from .stubs import fake_filesystem_unittest as ffs from . import fixtures +from ._context import suppress from importlib.metadata import ( Distribution, EntryPoint, @@ -22,6 +26,13 @@ ) +@contextlib.contextmanager +def suppress_known_deprecation(): + with warnings.catch_warnings(record=True) as ctx: + warnings.simplefilter('default', category=DeprecationWarning) + yield ctx + + class BasicTests(fixtures.DistInfoPkg, unittest.TestCase): version_pattern = r'\d+\.\d+(\.\d)?' @@ -37,7 +48,7 @@ def test_for_name_does_not_exist(self): def test_package_not_found_mentions_metadata(self): """ When a package is not found, that could indicate that the - packgae is not installed or that it is installed without + package is not installed or that it is installed without metadata. Ensure the exception mentions metadata to help guide users toward the cause. See #124. """ @@ -46,8 +57,12 @@ def test_package_not_found_mentions_metadata(self): assert "metadata" in str(ctx.exception) - def test_new_style_classes(self): - self.assertIsInstance(Distribution, type) + # expected to fail until ABC is enforced + @suppress(AssertionError) + @suppress_known_deprecation() + def test_abc_enforced(self): + with self.assertRaises(TypeError): + type('DistributionSubclass', (Distribution,), {})() @fixtures.parameterize( dict(name=None), @@ -172,11 +187,21 @@ def test_metadata_loads_egg_info(self): assert meta['Description'] == 'pôrˈtend' -class DiscoveryTests(fixtures.EggInfoPkg, fixtures.DistInfoPkg, unittest.TestCase): +class DiscoveryTests( + fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, + fixtures.DistInfoPkg, + unittest.TestCase, +): def test_package_discovery(self): dists = list(distributions()) assert all(isinstance(dist, Distribution) for dist in dists) assert any(dist.metadata['Name'] == 'egginfo-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'egg_with_module-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'egg_with_no_modules-pkg' for dist in dists) + assert any(dist.metadata['Name'] == 'sources_fallback-pkg' for dist in dists) assert any(dist.metadata['Name'] == 'distinfo-pkg' for dist in dists) def test_invalid_usage(self): @@ -324,3 +349,79 @@ def test_packages_distributions_neither_toplevel_nor_files(self): prefix=self.site_dir, ) packages_distributions() + + def test_packages_distributions_all_module_types(self): + """ + Test top-level modules detected on a package without 'top-level.txt'. + """ + suffixes = importlib.machinery.all_suffixes() + metadata = dict( + METADATA=""" + Name: all_distributions + Version: 1.0.0 + """, + ) + files = { + 'all_distributions-1.0.0.dist-info': metadata, + } + for i, suffix in enumerate(suffixes): + files.update( + { + f'importable-name {i}{suffix}': '', + f'in_namespace_{i}': { + f'mod{suffix}': '', + }, + f'in_package_{i}': { + '__init__.py': '', + f'mod{suffix}': '', + }, + } + ) + metadata.update(RECORD=fixtures.build_record(files)) + fixtures.build_files(files, prefix=self.site_dir) + + distributions = packages_distributions() + + for i in range(len(suffixes)): + assert distributions[f'importable-name {i}'] == ['all_distributions'] + assert distributions[f'in_namespace_{i}'] == ['all_distributions'] + assert distributions[f'in_package_{i}'] == ['all_distributions'] + + assert not any(name.endswith('.dist-info') for name in distributions) + + +class PackagesDistributionsEggTest( + fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, + unittest.TestCase, +): + def test_packages_distributions_on_eggs(self): + """ + Test old-style egg packages with a variation of 'top_level.txt', + 'SOURCES.txt', and 'installed-files.txt', available. + """ + distributions = packages_distributions() + + def import_names_from_package(package_name): + return { + import_name + for import_name, package_names in distributions.items() + if package_name in package_names + } + + # egginfo-pkg declares one import ('mod') via top_level.txt + assert import_names_from_package('egginfo-pkg') == {'mod'} + + # egg_with_module-pkg has one import ('egg_with_module') inferred from + # installed-files.txt (top_level.txt is missing) + assert import_names_from_package('egg_with_module-pkg') == {'egg_with_module'} + + # egg_with_no_modules-pkg should not be associated with any import names + # (top_level.txt is empty, and installed-files.txt has no .py files) + assert import_names_from_package('egg_with_no_modules-pkg') == set() + + # sources_fallback-pkg has one import ('sources_fallback') inferred from + # SOURCES.txt (top_level.txt and installed-files.txt is missing) + assert import_names_from_package('sources_fallback-pkg') == {'sources_fallback'} diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 71c47e62d27124..33c6e85ee94753 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -27,12 +27,14 @@ def suppress_known_deprecation(): class APITests( fixtures.EggInfoPkg, + fixtures.EggInfoPkgPipInstalledNoToplevel, + fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgSourcesFallback, fixtures.DistInfoPkg, fixtures.DistInfoPkgWithDot, fixtures.EggInfoFile, unittest.TestCase, ): - version_pattern = r'\d+\.\d+(\.\d)?' def test_retrieves_version_of_self(self): @@ -63,15 +65,28 @@ def test_prefix_not_matched(self): distribution(prefix) def test_for_top_level(self): - self.assertEqual( - distribution('egginfo-pkg').read_text('top_level.txt').strip(), 'mod' - ) + tests = [ + ('egginfo-pkg', 'mod'), + ('egg_with_no_modules-pkg', ''), + ] + for pkg_name, expect_content in tests: + with self.subTest(pkg_name): + self.assertEqual( + distribution(pkg_name).read_text('top_level.txt').strip(), + expect_content, + ) def test_read_text(self): - top_level = [ - path for path in files('egginfo-pkg') if path.name == 'top_level.txt' - ][0] - self.assertEqual(top_level.read_text(), 'mod\n') + tests = [ + ('egginfo-pkg', 'mod\n'), + ('egg_with_no_modules-pkg', '\n'), + ] + for pkg_name, expect_content in tests: + with self.subTest(pkg_name): + top_level = [ + path for path in files(pkg_name) if path.name == 'top_level.txt' + ][0] + self.assertEqual(top_level.read_text(), expect_content) def test_entry_points(self): eps = entry_points() @@ -137,6 +152,28 @@ def test_metadata_for_this_package(self): classifiers = md.get_all('Classifier') assert 'Topic :: Software Development :: Libraries' in classifiers + def test_missing_key_legacy(self): + """ + Requesting a missing key will still return None, but warn. + """ + md = metadata('distinfo-pkg') + with suppress_known_deprecation(): + assert md['does-not-exist'] is None + + def test_get_key(self): + """ + Getting a key gets the key. + """ + md = metadata('egginfo-pkg') + assert md.get('Name') == 'egginfo-pkg' + + def test_get_missing_key(self): + """ + Requesting a missing key will return None. + """ + md = metadata('distinfo-pkg') + assert md.get('does-not-exist') is None + @staticmethod def _test_files(files): root = files[0].root @@ -159,6 +196,9 @@ def test_files_dist_info(self): def test_files_egg_info(self): self._test_files(files('egginfo-pkg')) + self._test_files(files('egg_with_module-pkg')) + self._test_files(files('egg_with_no_modules-pkg')) + self._test_files(files('sources_fallback-pkg')) def test_version_egg_info_file(self): self.assertEqual(version('egginfo-file'), '0.1') diff --git a/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst b/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst new file mode 100644 index 00000000000000..6d7c93ade9cd94 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-16-19-48-21.gh-issue-103584.3mBTuM.rst @@ -0,0 +1,12 @@ +Updated ``importlib.metadata`` with changes from ``importlib_metadata`` 5.2 +through 6.5.0, including: Support ``installed-files.txt`` for +``Distribution.files`` when present. ``PackageMetadata`` now stipulates an +additional ``get`` method allowing for easy querying of metadata keys that +may not be present. ``packages_distributions`` now honors packages and +modules with Python modules that not ``.py`` sources (e.g. ``.pyc``, +``.so``). Expand protocol for ``PackageMetadata.get_all`` to match the +upstream implementation of ``email.message.Message.get_all`` in +python/typeshed#9620. Deprecated use of ``Distribution`` without defining +abstract methods. Deprecated expectation that +``PackageMetadata.__getitem__`` will return ``None`` for missing keys. In +the future, it will raise a ``KeyError``. From a4967d9d5974562dc0b3d2fcb494483cce9b8122 Mon Sep 17 00:00:00 2001 From: Oleg Iarygin Date: Fri, 21 Apr 2023 17:27:50 +0400 Subject: [PATCH 09/24] gh-103082: Fix shifted field initialization in `instrumentation.c` (GH-103561) Fix shifted field initialization in instrumentation.c --- Python/instrumentation.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 853e8a10e81463..2a3b2b8ebeead7 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -16,14 +16,14 @@ static PyObject DISABLE = { - _PyObject_IMMORTAL_REFCNT, - &PyBaseObject_Type + .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_type = &PyBaseObject_Type }; PyObject _PyInstrumentation_MISSING = { - _PyObject_IMMORTAL_REFCNT, - &PyBaseObject_Type + .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_type = &PyBaseObject_Type }; static const int8_t EVENT_FOR_OPCODE[256] = { From dc328d398d8f65ec6d2fa493e16ceee75f6d774a Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Fri, 21 Apr 2023 11:30:30 -0400 Subject: [PATCH 10/24] gh-103661: Skip failing test on Windows. (#103662) --- Lib/test/test_importlib/test_metadata_api.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 33c6e85ee94753..d9027861848efc 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -76,12 +76,23 @@ def test_for_top_level(self): expect_content, ) + @staticmethod + def _workaround_103661(tests): + """ + Skip failing test for now is it's failing on buildbot workers. + See https://github.com/python/cpython/issues/103661. + """ + import platform + if platform.system() == 'Windows': + tests.remove(('egg_with_no_modules-pkg', '\n')) + return tests + def test_read_text(self): tests = [ ('egginfo-pkg', 'mod\n'), ('egg_with_no_modules-pkg', '\n'), ] - for pkg_name, expect_content in tests: + for pkg_name, expect_content in self._workaround_103661(tests): with self.subTest(pkg_name): top_level = [ path for path in files(pkg_name) if path.name == 'top_level.txt' From 0cb0871584d2288e436445ee32e585bf5af7c9de Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 21 Apr 2023 20:52:37 -0500 Subject: [PATCH 11/24] GH-103415: Document itertools.batched() in whatsnew.3.12 (#103670) --- Doc/whatsnew/3.12.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index b3bb065741d037..f9406653e625b5 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -309,6 +309,13 @@ fractions * Objects of type :class:`fractions.Fraction` now support float-style formatting. (Contributed by Mark Dickinson in :gh:`100161`.) +itertools +--------- + +* Added :class:`itertools.batched()` for collecting into even-sized + tuples where the last batch may be shorter than the rest. + (Contributed by Raymond Hettinger in :gh:`98363`.) + math ---- From 7d20783d45a9c78379fe79229b57e4c31610a623 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 21 Apr 2023 20:53:50 -0500 Subject: [PATCH 12/24] Minor improvements to the functools docs (#103672) * Use an f-string for improved readability * Put version notes in chronological order --- Doc/library/functools.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index d467e50bc7a424..d1289ce836210a 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -118,6 +118,7 @@ The :mod:`functools` module defines the following functions: def stdev(self): return statistics.stdev(self._data) + .. versionadded:: 3.8 .. versionchanged:: 3.12 Prior to Python 3.12, ``cached_property`` included an undocumented lock to @@ -126,8 +127,6 @@ The :mod:`functools` module defines the following functions: per-instance, which could result in unacceptably high lock contention. In Python 3.12+ this locking is removed. - .. versionadded:: 3.8 - .. function:: cmp_to_key(func) @@ -233,7 +232,7 @@ The :mod:`functools` module defines the following functions: @lru_cache(maxsize=32) def get_pep(num): 'Retrieve text of a Python Enhancement Proposal' - resource = 'https://peps.python.org/pep-%04d/' % num + resource = f'https://peps.python.org/pep-{num:04d}' try: with urllib.request.urlopen(resource) as s: return s.read() From 6b58d419a1bd62ac94274d108d59980a3eb6f6e0 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sat, 22 Apr 2023 08:45:10 +0300 Subject: [PATCH 13/24] gh-103556: [inspect.Signature] disallow pos-or-kw params without default after pos-only with default (#103557) --- Lib/inspect.py | 10 ++--- Lib/test/test_inspect.py | 40 ++++++++++++++++--- ...-04-15-12-19-14.gh-issue-103556.TEf-2m.rst | 3 ++ 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst diff --git a/Lib/inspect.py b/Lib/inspect.py index 4242b40c2a08df..6d1d7b766cb3bb 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -3006,7 +3006,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, if __validate_parameters__: params = OrderedDict() top_kind = _POSITIONAL_ONLY - kind_defaults = False + seen_default = False for param in parameters: kind = param.kind @@ -3021,21 +3021,19 @@ def __init__(self, parameters=None, *, return_annotation=_empty, kind.description) raise ValueError(msg) elif kind > top_kind: - kind_defaults = False top_kind = kind if kind in (_POSITIONAL_ONLY, _POSITIONAL_OR_KEYWORD): if param.default is _empty: - if kind_defaults: + if seen_default: # No default for this parameter, but the - # previous parameter of the same kind had - # a default + # previous parameter of had a default msg = 'non-default argument follows default ' \ 'argument' raise ValueError(msg) else: # There is a default for this parameter. - kind_defaults = True + seen_default = True if name in params: msg = 'duplicate parameter name: {!r}'.format(name) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 6b342b1f00d654..42e3d709bd683f 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2463,18 +2463,43 @@ def test_signature_object(self): self.assertEqual(str(S()), '()') self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())') - def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): + def test(po, /, pk, pkd=100, *args, ko, kod=10, **kwargs): pass + sig = inspect.signature(test) - po = sig.parameters['po'].replace(kind=P.POSITIONAL_ONLY) - pod = sig.parameters['pod'].replace(kind=P.POSITIONAL_ONLY) + self.assertTrue(repr(sig).startswith(' {42:'ham'}: pass foo_partial = functools.partial(foo, a=1) diff --git a/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst b/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst new file mode 100644 index 00000000000000..fe2267b7b79019 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-15-12-19-14.gh-issue-103556.TEf-2m.rst @@ -0,0 +1,3 @@ +Now creating :class:`inspect.Signature` objects with positional-only +parameter with a default followed by a positional-or-keyword parameter +without one is impossible. From b2862950dc05d313b228f02a8efdd8c9c59a8ff4 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Sat, 22 Apr 2023 12:19:23 +0100 Subject: [PATCH 14/24] gh-103559: Update bundled pip version to 23.1.1 (gh-103560) * Update bundled pip version to 23.1 * Update to pip 23.1.1 --- Lib/ensurepip/__init__.py | 2 +- ...ne-any.whl => pip-23.1.1-py3-none-any.whl} | Bin 2055563 -> 2064386 bytes ...-04-15-11-21-38.gh-issue-103559.a9rYHG.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename Lib/ensurepip/_bundled/{pip-23.0.1-py3-none-any.whl => pip-23.1.1-py3-none-any.whl} (76%) create mode 100644 Misc/NEWS.d/next/Library/2023-04-15-11-21-38.gh-issue-103559.a9rYHG.rst diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 69b23de9e05025..4278422dfacc9f 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -10,7 +10,7 @@ __all__ = ["version", "bootstrap"] _PACKAGE_NAMES = ('pip',) -_PIP_VERSION = "23.0.1" +_PIP_VERSION = "23.1.1" _PROJECTS = [ ("pip", _PIP_VERSION, "py3"), ] diff --git a/Lib/ensurepip/_bundled/pip-23.0.1-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-23.1.1-py3-none-any.whl similarity index 76% rename from Lib/ensurepip/_bundled/pip-23.0.1-py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-23.1.1-py3-none-any.whl index a855dc40e8630d1e3953e162af76cc5b0a11952b..dee4c0304b2c364ddf7147b0ec6a206631302426 100644 GIT binary patch delta 470130 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

9>f+`sUO!`caGrD}z`)DCSYNnM!t&qeS^P*5HF= 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

e>#3aY zb@nODmb~1KC@u*4*OERrqlPb9E)a^mj*yl~Pj}Ilwn+M}Rihh`-a#8@)LU(arxaEh ziPd^b;>;R@C9Ro)yG|23Rt1ls9L>md7Ei>|2^xSTk3R25N0PTgOT81Ll1`8yJ!E32 z5@B>#35K3^y;ZQ<(Gpj{{nxkmWR54<>EB<`8fq!bbK|eb0Ggq=~N6= zlP0U#1BJO8?ZaA_a|R?!u=dqlUF%(M0+R#mn@Wq|6ymdIH4JVXh2aWi8B2xMVpau` zHDd@^X|(3(yYxBh2G^7f(f1fG0b8@zXHx}np$(VMOvD2D%YuUz{ zpOv2WQ5I>q3@L&fr35qDT&iD!$TsB0cs<;EO>aHKEn0~S5QYkXk~Af$#D{KP`Ck&8 zjb=Ji-u+$Y()>yc3jZ$2%LbI#t|drI1wahk`$x-XKVPwT@{=N>Z)i#ChPo#~Q9p&c zHmzN)DE)hL*{y+Grn`+khhM`$nA3%9nMwl7Z!zrv)YO6n*{Y^m!Sz{V&J*xm2XjcY z#iYbks403%vzfDs*2LG+vmvzv^zWPW#4VzgdA|is-RytYf{#1cTtJUEUxb%DbUh3M zW4#_acbZ!lz3OtlbjR-=XFWJhovt))PBWd%9P@>kMevyqA*BS~VsisZ!aW{w#B8R7 zteU)v$1!xUc>D9#eY*4(CnWWY3yBW%SMI>%0Dl-~*T+0Ru3$ZxOmDi@j%Sb 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ⅈ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

rB+J6DTG6TD07}61UbaWK;s%pZ8~te^jY4iT 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 PMn%h^IUIG5Uy}b1*KoQd delta 462124 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

H^jdYIidGd)KEAXL^$Bq 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∋oqM7fe&bUM97W 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 Date: Sat, 22 Apr 2023 08:29:40 -0500 Subject: [PATCH 15/24] Descriptor HowTo: Update to include attributes added in Python 3.10 (GH-103666) --- Doc/howto/descriptor.rst | 98 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 8 deletions(-) diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 74710d9b3fc2ed..3688c47f0d6ec9 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1273,11 +1273,14 @@ Using the non-data descriptor protocol, a pure Python version of .. testcode:: + import functools + class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" def __init__(self, f): self.f = f + functools.update_wrapper(self, f) def __get__(self, obj, objtype=None): return self.f @@ -1285,13 +1288,19 @@ Using the non-data descriptor protocol, a pure Python version of def __call__(self, *args, **kwds): return self.f(*args, **kwds) +The :func:`functools.update_wrapper` call adds a ``__wrapped__`` attribute +that refers to the underlying function. Also it carries forward +the attributes necessary to make the wrapper look like the wrapped +function: ``__name__``, ``__qualname__``, ``__doc__``, and ``__annotations__``. + .. testcode:: :hide: class E_sim: @StaticMethod - def f(x): - return x * 10 + def f(x: int) -> str: + "Simple function example" + return "!" * x wrapped_ord = StaticMethod(ord) @@ -1299,11 +1308,51 @@ Using the non-data descriptor protocol, a pure Python version of :hide: >>> E_sim.f(3) - 30 + '!!!' >>> E_sim().f(3) - 30 + '!!!' + + >>> sm = vars(E_sim)['f'] + >>> type(sm).__name__ + 'StaticMethod' + >>> f = E_sim.f + >>> type(f).__name__ + 'function' + >>> sm.__name__ + 'f' + >>> f.__name__ + 'f' + >>> sm.__qualname__ + 'E_sim.f' + >>> f.__qualname__ + 'E_sim.f' + >>> sm.__doc__ + 'Simple function example' + >>> f.__doc__ + 'Simple function example' + >>> sm.__annotations__ + {'x': , 'return': } + >>> f.__annotations__ + {'x': , 'return': } + >>> sm.__module__ == f.__module__ + True + >>> sm(3) + '!!!' + >>> f(3) + '!!!' + >>> wrapped_ord('A') 65 + >>> wrapped_ord.__module__ == ord.__module__ + True + >>> wrapped_ord.__wrapped__ == ord + True + >>> wrapped_ord.__name__ == ord.__name__ + True + >>> wrapped_ord.__qualname__ == ord.__qualname__ + True + >>> wrapped_ord.__doc__ == ord.__doc__ + True Class methods @@ -1359,11 +1408,14 @@ Using the non-data descriptor protocol, a pure Python version of .. testcode:: + import functools + class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" def __init__(self, f): self.f = f + functools.update_wrapper(self, f) def __get__(self, obj, cls=None): if cls is None: @@ -1380,8 +1432,9 @@ Using the non-data descriptor protocol, a pure Python version of # Verify the emulation works class T: @ClassMethod - def cm(cls, x, y): - return (cls, x, y) + def cm(cls, x: int, y: str) -> tuple[str, int, str]: + "Class method that returns a tuple" + return (cls.__name__, x, y) @ClassMethod @property @@ -1393,17 +1446,40 @@ Using the non-data descriptor protocol, a pure Python version of :hide: >>> T.cm(11, 22) - (, 11, 22) + ('T', 11, 22) # Also call it from an instance >>> t = T() >>> t.cm(11, 22) - (, 11, 22) + ('T', 11, 22) # Check the alternate path for chained descriptors >>> T.__doc__ "A doc for 'T'" + # Verify that T uses our emulation + >>> type(vars(T)['cm']).__name__ + 'ClassMethod' + + # Verify that update_wrapper() correctly copied attributes + >>> T.cm.__name__ + 'cm' + >>> T.cm.__qualname__ + 'T.cm' + >>> T.cm.__doc__ + 'Class method that returns a tuple' + >>> T.cm.__annotations__ + {'x': , 'y': , 'return': tuple[str, int, str]} + + # Verify that __wrapped__ was added and works correctly + >>> f = vars(T)['cm'].__wrapped__ + >>> type(f).__name__ + 'function' + >>> f.__name__ + 'cm' + >>> f(T, 11, 22) + ('T', 11, 22) + The code path for ``hasattr(type(self.f), '__get__')`` was added in Python 3.9 and makes it possible for :func:`classmethod` to support @@ -1423,6 +1499,12 @@ chained together. In Python 3.11, this functionality was deprecated. >>> G.__doc__ "A doc for 'G'" +The :func:`functools.update_wrapper` call in ``ClassMethod`` adds a +``__wrapped__`` attribute that refers to the underlying function. Also +it carries forward the attributes necessary to make the wrapper look +like the wrapped function: ``__name__``, ``__qualname__``, ``__doc__``, +and ``__annotations__``. + Member objects and __slots__ ---------------------------- From e5eaac6064561c8f7643011a31fa506e78330798 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 22 Apr 2023 09:18:25 -0500 Subject: [PATCH 16/24] GH-103475: cache() and lru_cache() do not have a "call once" guarantee (GH-103669) --- Doc/library/functools.rst | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index d1289ce836210a..29cbc87bf66d12 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -49,8 +49,13 @@ The :mod:`functools` module defines the following functions: >>> factorial(12) # makes two new recursive calls, the other 10 are cached 479001600 - The cache is threadsafe so the wrapped function can be used in multiple - threads. + The cache is threadsafe so that the wrapped function can be used in + multiple threads. This means that the underlying data structure will + remain coherent during concurrent updates. + + It is possible for the wrapped function to be called more than once if + another thread makes an additional call before the initial call has been + completed and cached. .. versionadded:: 3.9 @@ -158,8 +163,13 @@ The :mod:`functools` module defines the following functions: *maxsize* most recent calls. It can save time when an expensive or I/O bound function is periodically called with the same arguments. - The cache is threadsafe so the wrapped function can be used in multiple - threads. + The cache is threadsafe so that the wrapped function can be used in + multiple threads. This means that the underlying data structure will + remain coherent during concurrent updates. + + It is possible for the wrapped function to be called more than once if + another thread makes an additional call before the initial call has been + completed and cached. Since a dictionary is used to cache results, the positional and keyword arguments to the function must be :term:`hashable`. From caed49448d195565940caf198cf0edda65ee5679 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Sat, 22 Apr 2023 11:24:47 -0300 Subject: [PATCH 17/24] GH-103484: Fix broken links reported by linkcheck (#103608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Doc: Fix broken links reported by linkcheck * Apply suggestions from code review - Remove extra diff line in faq/library.rst (merwok) - Use HTTPS to link Unicode 15.0.0 to solve a redirect (hugovk) - Use wayback machine link for openssl 1.1.0 instead of linking 1.1.1, "as this text mentions a feature from 1.1.0" (hugovk) Co-authored-by: Éric Co-authored-by: Hugo van Kemenade * Doc: Make mark-up code as literal * Doc: Alphabetize items in linkcheck_ignore Co-authored-by: Hugo van Kemenade * Doc: Improve comment in sphinx conf Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --------- Co-authored-by: Éric Co-authored-by: Hugo van Kemenade Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- Doc/conf.py | 18 ++++++++++++++++++ Doc/distributing/index.rst | 12 ++++-------- Doc/faq/library.rst | 2 +- Doc/howto/functional.rst | 4 ++-- Doc/howto/urllib2.rst | 4 ++-- Doc/library/readline.rst | 2 +- Doc/library/stdtypes.rst | 17 +++++++++-------- Doc/library/zipfile.rst | 2 +- Doc/whatsnew/2.6.rst | 2 +- Doc/whatsnew/2.7.rst | 2 +- Misc/NEWS.d/3.7.0b2.rst | 2 +- Misc/NEWS.d/3.8.0a1.rst | 2 +- Misc/NEWS.d/3.9.0a1.rst | 2 +- Misc/NEWS.d/3.9.0a2.rst | 2 +- Misc/NEWS.d/3.9.0a4.rst | 2 +- 15 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Doc/conf.py b/Doc/conf.py index 60404fd3829e5b..4c120bee64dde4 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -263,6 +263,24 @@ r'https://github.com/python/cpython/tree/.*': 'https://github.com/python/cpython/blob/.*' } +linkcheck_anchors_ignore = [ + # ignore anchors that start with a '/', e.g. Wikipedia media files: + # https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg + r'\/.*', +] + +linkcheck_ignore = [ + # The crawler gets "Anchor not found" + r'https://developer.apple.com/documentation/.+?#.*', + r'https://devguide.python.org.+?/#.*', + r'https://github.com.+?#.*', + # Robot crawlers not allowed: "403 Client Error: Forbidden" + r'https://support.enthought.com/hc/.*', + # SSLError CertificateError, even though it is valid + r'https://unix.org/version2/whatsnew/lp64_wp.html', +] + + # Options for extensions # ---------------------- diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst index 21389adedf9c15..d237f8f082d87b 100644 --- a/Doc/distributing/index.rst +++ b/Doc/distributing/index.rst @@ -129,14 +129,10 @@ involved in creating and publishing a project: * `Uploading the project to the Python Package Index`_ * `The .pypirc file`_ -.. _Project structure: \ - https://packaging.python.org/tutorials/packaging-projects/#packaging-python-projects -.. _Building and packaging the project: \ - https://packaging.python.org/tutorials/packaging-projects/#creating-the-package-files -.. _Uploading the project to the Python Package Index: \ - https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives -.. _The .pypirc file: \ - https://packaging.python.org/specifications/pypirc/ +.. _Project structure: https://packaging.python.org/tutorials/packaging-projects/#packaging-python-projects +.. _Building and packaging the project: https://packaging.python.org/tutorials/packaging-projects/#creating-the-package-files +.. _Uploading the project to the Python Package Index: https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives +.. _The .pypirc file: https://packaging.python.org/specifications/pypirc/ How do I...? diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index a9cde456575020..597caaa778e1c8 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -780,7 +780,7 @@ socket to :meth:`select.select` to check if it's writable. The :mod:`asyncio` module provides a general purpose single-threaded and concurrent asynchronous library, which can be used for writing non-blocking network code. - The third-party `Twisted `_ library is + The third-party `Twisted `_ library is a popular and feature-rich alternative. diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index 38a651b0f964a6..5cf12cc52bde4e 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1208,8 +1208,8 @@ General ------- **Structure and Interpretation of Computer Programs**, by Harold Abelson and -Gerald Jay Sussman with Julie Sussman. Full text at -https://mitpress.mit.edu/sicp/. In this classic textbook of computer science, +Gerald Jay Sussman with Julie Sussman. The book can be found at +https://mitpress.mit.edu/sicp. In this classic textbook of computer science, chapters 2 and 3 discuss the use of sequences and streams to organize the data flow inside a program. The book uses Scheme for its examples, but many of the design approaches described in these chapters are applicable to functional-style diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 69af3c3a85c5d6..61ba6bd7224fcc 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -86,7 +86,7 @@ response:: import urllib.request - req = urllib.request.Request('http://www.voidspace.org.uk') + req = urllib.request.Request('http://python.org/') with urllib.request.urlopen(req) as response: the_page = response.read() @@ -458,7 +458,7 @@ To illustrate creating and installing a handler we will use the ``HTTPBasicAuthHandler``. For a more detailed discussion of this subject -- including an explanation of how Basic Authentication works - see the `Basic Authentication Tutorial -`_. +`__. When authentication is required, the server sends a header (as well as the 401 error code) requesting authentication. This specifies the authentication scheme diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 4d485d25b54020..8fb0eca8df74d8 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -19,7 +19,7 @@ function. Readline keybindings may be configured via an initialization file, typically ``.inputrc`` in your home directory. See `Readline Init File -`_ +`_ in the GNU Readline manual for information about the format and allowable constructs of that file, and the capabilities of the Readline library in general. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index bcfc6e5cfce611..aea2410bae354b 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1605,8 +1605,8 @@ expression support in the :mod:`re` module). converts it to ``"ss"``. The casefolding algorithm is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. versionadded:: 3.3 @@ -1768,8 +1768,9 @@ expression support in the :mod:`re` module). one character, ``False`` otherwise. Alphabetic characters are those characters defined in the Unicode character database as "Letter", i.e., those with general category property being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different - from the `Alphabetic property defined in the Unicode Standard - `_. + from the `Alphabetic property defined in the section 4.10 'Letters, Alphabetic, and + Ideographic' of the Unicode Standard + `_. .. method:: str.isascii() @@ -1904,8 +1905,8 @@ expression support in the :mod:`re` module). lowercase. The lowercasing algorithm used is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. method:: str.lstrip([chars]) @@ -2250,8 +2251,8 @@ expression support in the :mod:`re` module). titlecase). The uppercasing algorithm used is - `described in section 3.13 of the Unicode Standard - `__. + `described in section 3.13 'Default Case Folding' of the Unicode Standard + `__. .. method:: str.zfill(width) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index e2a085d6e98e67..6f4826cb065c64 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -7,7 +7,7 @@ .. moduleauthor:: James C. Ahlstrom .. sectionauthor:: James C. Ahlstrom -**Source code:** :source:`Lib/zipfile.py` +**Source code:** :source:`Lib/zipfile/` -------------- diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 34f2656f765c7d..4ee2aacb108a36 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -172,7 +172,7 @@ this edition of "What's New in Python" links to the bug/patch item for each change. Hosting of the Python bug tracker is kindly provided by -`Upfront Systems `__ +`Upfront Systems `__ of Stellenbosch, South Africa. Martin von Löwis put a lot of effort into importing existing bugs and patches from SourceForge; his scripts for this import operation are at diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 810a2cd2537c34..36afcb163f1afc 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2104,7 +2104,7 @@ Changes to Python's build process and to the C API include: * The latest release of the GNU Debugger, GDB 7, can be `scripted using Python - `__. + `__. When you begin debugging an executable program P, GDB will look for a file named ``P-gdb.py`` and automatically read it. Dave Malcolm contributed a :file:`python-gdb.py` that adds a number of diff --git a/Misc/NEWS.d/3.7.0b2.rst b/Misc/NEWS.d/3.7.0b2.rst index b2ade206bd5f97..9590914599bb86 100644 --- a/Misc/NEWS.d/3.7.0b2.rst +++ b/Misc/NEWS.d/3.7.0b2.rst @@ -357,7 +357,7 @@ Wirtel Add TLSVersion constants and SSLContext.maximum_version / minimum_version attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html +https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html feature. .. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 991bbc128670b2..db2eba32e6ea34 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -5951,7 +5951,7 @@ Wirtel Add TLSVersion constants and SSLContext.maximum_version / minimum_version attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html +https://web.archive.org/web/20180309043602/https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html feature. .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index 633620583838df..0888a5c43087b5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -4887,7 +4887,7 @@ Fix use of registry values to launch Python from Microsoft Store app. .. section: Windows Fix memory leak on Windows in creating an SSLContext object or running -urllib.request.urlopen('https://...'). +``urllib.request.urlopen('https://...')``. .. diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 226ea0d3df2243..a03eb10f1d523a 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -686,7 +686,7 @@ added. Update documentation to state that to activate virtual environments under fish one should use `source`, not `.` as documented at -https://fishshell.com/docs/current/commands.html#source. +https://fishshell.com/docs/current/cmds/source.html. .. diff --git a/Misc/NEWS.d/3.9.0a4.rst b/Misc/NEWS.d/3.9.0a4.rst index 2aef8b26b01696..019b34c4082d10 100644 --- a/Misc/NEWS.d/3.9.0a4.rst +++ b/Misc/NEWS.d/3.9.0a4.rst @@ -392,7 +392,7 @@ The distutils ``bdist_msi`` command is deprecated in Python 3.9, use Improved performance of zipfile.Path for files with a large number of entries. Also improved performance and fixed minor issue as published with `importlib_metadata 1.5 -`_. +`_. .. From 3d2a46845b67407e2436d910b2e1740c34f4f10d Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Sat, 22 Apr 2023 17:32:47 +0100 Subject: [PATCH 18/24] gh-83791: Raise TypeError for len(memoryview_0d) (#18463) Changes the behaviour of `len` on a zero-dimensional `memoryview` to raise `TypeError`. Previously, `len` would return `1`. --- Doc/library/stdtypes.rst | 15 +++++++----- Lib/test/test_buffer.py | 6 +++-- Lib/test/test_ctypes/test_pep3118.py | 24 +++++++++---------- .../2020-02-11-15-54-40.bpo-39610.fvgsCl.rst | 2 ++ Objects/memoryobject.c | 6 ++++- 5 files changed, 31 insertions(+), 22 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-11-15-54-40.bpo-39610.fvgsCl.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index aea2410bae354b..2360472b31f175 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -3715,12 +3715,15 @@ copying. types such as :class:`bytes` and :class:`bytearray`, an element is a single byte, but other types such as :class:`array.array` may have bigger elements. - ``len(view)`` is equal to the length of :class:`~memoryview.tolist`. - If ``view.ndim = 0``, the length is 1. If ``view.ndim = 1``, the length - is equal to the number of elements in the view. For higher dimensions, - the length is equal to the length of the nested list representation of - the view. The :class:`~memoryview.itemsize` attribute will give you the - number of bytes in a single element. + ``len(view)`` is equal to the length of :class:`~memoryview.tolist`, which + is the nested list representation of the view. If ``view.ndim = 1``, + this is equal to the number of elements in the view. + + .. versionchanged:: 3.12 + If ``view.ndim == 0``, ``len(view)`` now raises :exc:`TypeError` instead of returning 1. + + The :class:`~memoryview.itemsize` attribute will give you the number of + bytes in a single element. A :class:`memoryview` supports slicing and indexing to expose its data. One-dimensional slicing will result in a subview:: diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index 8ac3b7e7eb29d1..098d2d999643cb 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -965,8 +965,10 @@ def check_memoryview(m, expected_readonly=readonly): self.assertEqual(m.strides, tuple(strides)) self.assertEqual(m.suboffsets, tuple(suboffsets)) - n = 1 if ndim == 0 else len(lst) - self.assertEqual(len(m), n) + if ndim == 0: + self.assertRaises(TypeError, len, m) + else: + self.assertEqual(len(m), len(lst)) rep = result.tolist() if fmt else result.tobytes() self.assertEqual(rep, lst) diff --git a/Lib/test/test_ctypes/test_pep3118.py b/Lib/test/test_ctypes/test_pep3118.py index c8a70e3e335693..038161745df905 100644 --- a/Lib/test/test_ctypes/test_pep3118.py +++ b/Lib/test/test_ctypes/test_pep3118.py @@ -28,7 +28,7 @@ def test_native_types(self): if shape: self.assertEqual(len(v), shape[0]) else: - self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) + self.assertRaises(TypeError, len, v) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) # XXX Issue #12851: PyCData_NewGetBuffer() must provide strides @@ -39,11 +39,10 @@ def test_native_types(self): # they are always read/write self.assertFalse(v.readonly) - if v.shape: - n = 1 - for dim in v.shape: - n = n * dim - self.assertEqual(n * v.itemsize, len(v.tobytes())) + n = 1 + for dim in v.shape: + n = n * dim + self.assertEqual(n * v.itemsize, len(v.tobytes())) except: # so that we can see the failing type print(tp) @@ -58,7 +57,7 @@ def test_endian_types(self): if shape: self.assertEqual(len(v), shape[0]) else: - self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) + self.assertRaises(TypeError, len, v) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) # XXX Issue #12851 @@ -67,11 +66,10 @@ def test_endian_types(self): # they are always read/write self.assertFalse(v.readonly) - if v.shape: - n = 1 - for dim in v.shape: - n = n * dim - self.assertEqual(n, len(v)) + n = 1 + for dim in v.shape: + n = n * dim + self.assertEqual(n * v.itemsize, len(v.tobytes())) except: # so that we can see the failing type print(tp) @@ -243,7 +241,7 @@ class LEPoint(LittleEndianStructure): # endian_types = [ (BEPoint, "T{>l:x:>l:y:}".replace('l', s_long), (), BEPoint), - (LEPoint, "T{l:x:>l:y:}".replace('l', s_long), (), POINTER(BEPoint)), (POINTER(LEPoint), "&T{view.ndim == 0 ? 1 : self->view.shape[0]; + if (self->view.ndim == 0) { + PyErr_SetString(PyExc_TypeError, "0-dim memory has no length"); + return -1; + } + return self->view.shape[0]; } /* As mapping */ From 916de04fd1838530096336aadb3b94b774ed6c90 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 22 Apr 2023 13:52:51 -0400 Subject: [PATCH 19/24] gh-103661: Apply bugfix from importlib_metadata 6.5.1 and restore test. (#103681) --- Lib/importlib/metadata/__init__.py | 26 +++++++++++--------- Lib/test/test_importlib/test_metadata_api.py | 13 +--------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index b8eb19d05dccae..82e0ce1b281c54 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -516,27 +516,29 @@ def _read_files_egginfo_installed(self): """ Read installed-files.txt and return lines in a similar CSV-parsable format as RECORD: each file must be placed - relative to the site-packages directory, and must also be + relative to the site-packages directory and must also be quoted (since file names can contain literal commas). This file is written when the package is installed by pip, but it might not be written for other installation methods. - Hence, even if we can assume that this file is accurate - when it exists, we cannot assume that it always exists. + Assume the file is accurate if it exists. """ text = self.read_text('installed-files.txt') - # We need to prepend the .egg-info/ subdir to the lines in this file. - # But this subdir is only available in the PathDistribution's self._path - # which is not easily accessible from this base class... + # Prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available from PathDistribution's + # self._path. subdir = getattr(self, '_path', None) if not text or not subdir: return - with contextlib.suppress(Exception): - ret = [ - str((subdir / line).resolve().relative_to(self.locate_file(''))) - for line in text.splitlines() - ] - return map('"{}"'.format, ret) + + paths = ( + (subdir / name) + .resolve() + .relative_to(self.locate_file('').resolve()) + .as_posix() + for name in text.splitlines() + ) + return map('"{}"'.format, paths) def _read_files_egginfo_sources(self): """ diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index d9027861848efc..33c6e85ee94753 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -76,23 +76,12 @@ def test_for_top_level(self): expect_content, ) - @staticmethod - def _workaround_103661(tests): - """ - Skip failing test for now is it's failing on buildbot workers. - See https://github.com/python/cpython/issues/103661. - """ - import platform - if platform.system() == 'Windows': - tests.remove(('egg_with_no_modules-pkg', '\n')) - return tests - def test_read_text(self): tests = [ ('egginfo-pkg', 'mod\n'), ('egg_with_no_modules-pkg', '\n'), ] - for pkg_name, expect_content in self._workaround_103661(tests): + for pkg_name, expect_content in tests: with self.subTest(pkg_name): top_level = [ path for path in files(pkg_name) if path.name == 'top_level.txt' From ea2c0016502472aa8baa3149050ada776d17a009 Mon Sep 17 00:00:00 2001 From: Eddie Elizondo Date: Sat, 22 Apr 2023 15:39:37 -0400 Subject: [PATCH 20/24] gh-84436: Implement Immortal Objects (gh-19474) This is the implementation of PEP683 Motivation: The PR introduces the ability to immortalize instances in CPython which bypasses reference counting. Tagging objects as immortal allows up to skip certain operations when we know that the object will be around for the entire execution of the runtime. Note that this by itself will bring a performance regression to the runtime due to the extra reference count checks. However, this brings the ability of having truly immutable objects that are useful in other contexts such as immutable data sharing between sub-interpreters. --- Doc/library/sys.rst | 7 + Doc/whatsnew/3.12.rst | 21 ++- Include/boolobject.h | 7 +- Include/cpython/unicodeobject.h | 17 ++- .../pycore_global_objects_fini_generated.h | 6 +- Include/internal/pycore_long.h | 2 +- Include/internal/pycore_object.h | 48 +++++-- Include/internal/pycore_runtime_init.h | 14 +- Include/internal/pycore_unicodeobject.h | 1 + Include/object.h | 133 ++++++++++++++++-- Include/pyport.h | 1 - Lib/test/_test_embed_structseq.py | 40 +++--- Lib/test/libregrtest/refleak.py | 14 +- Lib/test/test_builtin.py | 24 +++- Lib/test/test_ctypes/test_python_api.py | 3 +- Lib/test/test_sys.py | 3 +- Lib/test/test_venv.py | 12 +- ...3-04-02-22-14-57.gh-issue-84436.hvMgwF.rst | 3 + Modules/gcmodule.c | 15 +- Objects/boolobject.c | 10 +- Objects/bytes_methods.c | 9 +- Objects/longobject.c | 26 +++- Objects/object.c | 32 +++-- Objects/setobject.c | 5 +- Objects/sliceobject.c | 15 +- Objects/typeobject.c | 16 --- Objects/unicodeobject.c | 101 ++++++++----- Programs/_testembed.c | 3 +- Python/ceval.c | 10 +- Python/clinic/sysmodule.c.h | 30 +++- Python/instrumentation.c | 4 +- Python/legacy_tracing.c | 2 +- Python/pylifecycle.c | 5 - Python/sysmodule.c | 13 ++ Tools/build/deepfreeze.py | 2 +- 35 files changed, 483 insertions(+), 171 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index e37d57edce515f..7324f3113e0a08 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -670,6 +670,13 @@ always available. .. versionadded:: 3.4 +.. function:: getunicodeinternedsize() + + Return the number of unicode objects that have been interned. + + .. versionadded:: 3.12 + + .. function:: getandroidapilevel() Return the build time API version of Android as an integer. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index f9406653e625b5..b98b7151a321ea 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1129,6 +1129,24 @@ New Features to replace the legacy-api :c:func:`!PyErr_Display`. (Contributed by Irit Katriel in :gh:`102755`). +* :pep:`683`: Introduced Immortal Objects to Python which allows objects + to bypass reference counts and introduced changes to the C-API: + + - ``_Py_IMMORTAL_REFCNT``: The reference count that defines an object + as immortal. + - ``_Py_IsImmortal`` Checks if an object has the immortal reference count. + - ``PyObject_HEAD_INIT`` This will now initialize reference count to + ``_Py_IMMORTAL_REFCNT`` when used with ``Py_BUILD_CORE``. + - ``SSTATE_INTERNED_IMMORTAL`` An identifier for interned unicode objects + that are immortal. + - ``SSTATE_INTERNED_IMMORTAL_STATIC`` An identifier for interned unicode + objects that are immortal and static + - ``sys.getunicodeinternedsize`` This returns the total number of unicode + objects that have been interned. This is now needed for refleak.py to + correctly track reference counts and allocated blocks + + (Contributed by Eddie Elizondo in :gh:`84436`.) + Porting to Python 3.12 ---------------------- @@ -1293,8 +1311,7 @@ Removed * :c:func:`!PyUnicode_GetSize` * :c:func:`!PyUnicode_GET_DATA_SIZE` -* Remove the ``PyUnicode_InternImmortal()`` function and the - ``SSTATE_INTERNED_IMMORTAL`` macro. +* Remove the ``PyUnicode_InternImmortal()`` function macro. (Contributed by Victor Stinner in :gh:`85858`.) * Remove ``Jython`` compatibility hacks from several stdlib modules and tests. diff --git a/Include/boolobject.h b/Include/boolobject.h index ca21fbfad8e827..976fa35201d035 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -11,8 +11,7 @@ PyAPI_DATA(PyTypeObject) PyBool_Type; #define PyBool_Check(x) Py_IS_TYPE((x), &PyBool_Type) -/* Py_False and Py_True are the only two bools in existence. -Don't forget to apply Py_INCREF() when returning either!!! */ +/* Py_False and Py_True are the only two bools in existence. */ /* Don't use these directly */ PyAPI_DATA(PyLongObject) _Py_FalseStruct; @@ -31,8 +30,8 @@ PyAPI_FUNC(int) Py_IsFalse(PyObject *x); #define Py_IsFalse(x) Py_Is((x), Py_False) /* Macros for returning Py_True or Py_False, respectively */ -#define Py_RETURN_TRUE return Py_NewRef(Py_True) -#define Py_RETURN_FALSE return Py_NewRef(Py_False) +#define Py_RETURN_TRUE return Py_True +#define Py_RETURN_FALSE return Py_False /* Function to return a bool from a C long */ PyAPI_FUNC(PyObject *) PyBool_FromLong(long); diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 75a74ffa2f9dff..3394726dfffd72 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -98,9 +98,16 @@ typedef struct { Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ struct { - /* If interned is set, the two references from the - dictionary to this object are *not* counted in ob_refcnt. */ - unsigned int interned:1; + /* If interned is non-zero, the two references from the + dictionary to this object are *not* counted in ob_refcnt. + The possible values here are: + 0: Not Interned + 1: Interned + 2: Interned and Immortal + 3: Interned, Immortal, and Static + This categorization allows the runtime to determine the right + cleanup mechanism at runtime shutdown. */ + unsigned int interned:2; /* Character size: - PyUnicode_1BYTE_KIND (1): @@ -135,7 +142,7 @@ typedef struct { unsigned int ascii:1; /* Padding to ensure that PyUnicode_DATA() is always aligned to 4 bytes (see issue #19537 on m68k). */ - unsigned int :26; + unsigned int :25; } state; } PyASCIIObject; @@ -183,6 +190,8 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( /* Interning state. */ #define SSTATE_NOT_INTERNED 0 #define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 +#define SSTATE_INTERNED_IMMORTAL_STATIC 3 /* Use only if you know it's a string */ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 14dfd9ea5823ed..fdfa80bd7d424a 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -8,15 +8,13 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_object.h" // _PyObject_IMMORTAL_REFCNT - #ifdef Py_DEBUG static inline void _PyStaticObject_CheckRefcnt(PyObject *obj) { - if (Py_REFCNT(obj) < _PyObject_IMMORTAL_REFCNT) { + if (Py_REFCNT(obj) < _Py_IMMORTAL_REFCNT) { _PyObject_ASSERT_FAILED_MSG(obj, "immortal object has less refcnt than expected " - "_PyObject_IMMORTAL_REFCNT"); + "_Py_IMMORTAL_REFCNT"); } } #endif diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index 137a0465d5ec60..fe86581e81f6b5 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -245,7 +245,7 @@ _PyLong_FlipSign(PyLongObject *op) { #define _PyLong_DIGIT_INIT(val) \ { \ - .ob_base = _PyObject_IMMORTAL_INIT(&PyLong_Type), \ + .ob_base = _PyObject_HEAD_INIT(&PyLong_Type) \ .long_value = { \ .lv_tag = TAG_FROM_SIGN_AND_SIZE( \ (val) == 0 ? 0 : ((val) < 0 ? -1 : 1), \ diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index b3d496ed6fc240..2ca047846e0935 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -14,21 +14,25 @@ extern "C" { #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_runtime.h" // _PyRuntime -/* This value provides *effective* immortality, meaning the object should never - be deallocated (until runtime finalization). See PEP 683 for more details about - immortality, as well as a proposed mechanism for proper immortality. */ -#define _PyObject_IMMORTAL_REFCNT 999999999 - -#define _PyObject_IMMORTAL_INIT(type) \ - { \ - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, \ - .ob_type = (type), \ - } -#define _PyVarObject_IMMORTAL_INIT(type, size) \ - { \ - .ob_base = _PyObject_IMMORTAL_INIT(type), \ - .ob_size = size, \ - } +/* We need to maintain an internal copy of Py{Var}Object_HEAD_INIT to avoid + designated initializer conflicts in C++20. If we use the deinition in + object.h, we will be mixing designated and non-designated initializers in + pycore objects which is forbiddent in C++20. However, if we then use + designated initializers in object.h then Extensions without designated break. + Furthermore, we can't use designated initializers in Extensions since these + are not supported pre-C++20. Thus, keeping an internal copy here is the most + backwards compatible solution */ +#define _PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + .ob_refcnt = _Py_IMMORTAL_REFCNT, \ + .ob_type = (type) \ + }, +#define _PyVarObject_HEAD_INIT(type, size) \ + { \ + .ob_base = _PyObject_HEAD_INIT(type) \ + .ob_size = size \ + }, PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc( const char *func, @@ -61,9 +65,20 @@ static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n) } #define _Py_RefcntAdd(op, n) _Py_RefcntAdd(_PyObject_CAST(op), n) +static inline void _Py_SetImmortal(PyObject *op) +{ + if (op) { + op->ob_refcnt = _Py_IMMORTAL_REFCNT; + } +} +#define _Py_SetImmortal(op) _Py_SetImmortal(_PyObject_CAST(op)) + static inline void _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); @@ -82,6 +97,9 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) static inline void _Py_DECREF_NO_DEALLOC(PyObject *op) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 5b09a45e41cd84..d8425b3199a89a 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -76,13 +76,13 @@ extern PyTypeObject _PyExc_MemoryError; .latin1 = _Py_str_latin1_INIT, \ }, \ .tuple_empty = { \ - .ob_base = _PyVarObject_IMMORTAL_INIT(&PyTuple_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&PyTuple_Type, 0) \ }, \ .hamt_bitmap_node_empty = { \ - .ob_base = _PyVarObject_IMMORTAL_INIT(&_PyHamt_BitmapNode_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&_PyHamt_BitmapNode_Type, 0) \ }, \ .context_token_missing = { \ - .ob_base = _PyObject_IMMORTAL_INIT(&_PyContextTokenMissing_Type), \ + .ob_base = _PyObject_HEAD_INIT(&_PyContextTokenMissing_Type) \ }, \ }, \ }, \ @@ -116,11 +116,11 @@ extern PyTypeObject _PyExc_MemoryError; .singletons = { \ ._not_used = 1, \ .hamt_empty = { \ - .ob_base = _PyObject_IMMORTAL_INIT(&_PyHamt_Type), \ + .ob_base = _PyObject_HEAD_INIT(&_PyHamt_Type) \ .h_root = (PyHamtNode*)&_Py_SINGLETON(hamt_bitmap_node_empty), \ }, \ .last_resort_memory_error = { \ - _PyObject_IMMORTAL_INIT(&_PyExc_MemoryError), \ + _PyObject_HEAD_INIT(&_PyExc_MemoryError) \ }, \ }, \ }, \ @@ -138,7 +138,7 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyBytes_SIMPLE_INIT(CH, LEN) \ { \ - _PyVarObject_IMMORTAL_INIT(&PyBytes_Type, (LEN)), \ + _PyVarObject_HEAD_INIT(&PyBytes_Type, (LEN)) \ .ob_shash = -1, \ .ob_sval = { (CH) }, \ } @@ -149,7 +149,7 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyUnicode_ASCII_BASE_INIT(LITERAL, ASCII) \ { \ - .ob_base = _PyObject_IMMORTAL_INIT(&PyUnicode_Type), \ + .ob_base = _PyObject_HEAD_INIT(&PyUnicode_Type) \ .length = sizeof(LITERAL) - 1, \ .hash = -1, \ .state = { \ diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index ff97b9a623d210..1bb0f366e78163 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -12,6 +12,7 @@ extern "C" { #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI void _PyUnicode_ExactDealloc(PyObject *op); +Py_ssize_t _PyUnicode_InternedSize(void); /* runtime lifecycle */ diff --git a/Include/object.h b/Include/object.h index 2943a6066818cd..66c3df0d7f780a 100644 --- a/Include/object.h +++ b/Include/object.h @@ -78,12 +78,76 @@ whose size is determined when the object is allocated. /* PyObject_HEAD defines the initial segment of every PyObject. */ #define PyObject_HEAD PyObject ob_base; -#define PyObject_HEAD_INIT(type) \ - { _PyObject_EXTRA_INIT \ - 1, (type) }, +/* +Immortalization: + +The following indicates the immortalization strategy depending on the amount +of available bits in the reference count field. All strategies are backwards +compatible but the specific reference count value or immortalization check +might change depending on the specializations for the underlying system. + +Proper deallocation of immortal instances requires distinguishing between +statically allocated immortal instances vs those promoted by the runtime to be +immortal. The latter should be the only instances that require +cleanup during runtime finalization. +*/ + +#if SIZEOF_VOID_P > 4 +/* +In 64+ bit systems, an object will be marked as immortal by setting all of the +lower 32 bits of the reference count field, which is equal to: 0xFFFFFFFF + +Using the lower 32 bits makes the value backwards compatible by allowing +C-Extensions without the updated checks in Py_INCREF and Py_DECREF to safely +increase and decrease the objects reference count. The object would lose its +immortality, but the execution would still be correct. + +Reference count increases will use saturated arithmetic, taking advantage of +having all the lower 32 bits set, which will avoid the reference count to go +beyond the refcount limit. Immortality checks for reference count decreases will +be done by checking the bit sign flag in the lower 32 bits. +*/ +#define _Py_IMMORTAL_REFCNT UINT_MAX + +#else +/* +In 32 bit systems, an object will be marked as immortal by setting all of the +lower 30 bits of the reference count field, which is equal to: 0x3FFFFFFF -#define PyVarObject_HEAD_INIT(type, size) \ - { PyObject_HEAD_INIT(type) (size) }, +Using the lower 30 bits makes the value backwards compatible by allowing +C-Extensions without the updated checks in Py_INCREF and Py_DECREF to safely +increase and decrease the objects reference count. The object would lose its +immortality, but the execution would still be correct. + +Reference count increases and decreases will first go through an immortality +check by comparing the reference count field to the immortality reference count. +*/ +#define _Py_IMMORTAL_REFCNT (UINT_MAX >> 2) +#endif + +// Make all internal uses of PyObject_HEAD_INIT immortal while preserving the +// C-API expectation that the refcnt will be set to 1. +#ifdef Py_BUILD_CORE +#define PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + { _Py_IMMORTAL_REFCNT }, \ + (type) \ + }, +#else +#define PyObject_HEAD_INIT(type) \ + { \ + _PyObject_EXTRA_INIT \ + { 1 }, \ + (type) \ + }, +#endif /* Py_BUILD_CORE */ + +#define PyVarObject_HEAD_INIT(type, size) \ + { \ + PyObject_HEAD_INIT(type) \ + (size) \ + }, /* PyObject_VAR_HEAD defines the initial segment of all variable-size * container objects. These end with a declaration of an array with 1 @@ -101,7 +165,12 @@ whose size is determined when the object is allocated. */ struct _object { _PyObject_HEAD_EXTRA - Py_ssize_t ob_refcnt; + union { + Py_ssize_t ob_refcnt; +#if SIZEOF_VOID_P > 4 + PY_UINT32_T ob_refcnt_split[2]; +#endif + }; PyTypeObject *ob_type; }; @@ -152,6 +221,15 @@ static inline Py_ssize_t Py_SIZE(PyObject *ob) { # define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) #endif +static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op) +{ +#if SIZEOF_VOID_P > 4 + return _Py_CAST(PY_INT32_T, op->ob_refcnt) < 0; +#else + return op->ob_refcnt == _Py_IMMORTAL_REFCNT; +#endif +} +#define _Py_IsImmortal(op) _Py_IsImmortal(_PyObject_CAST(op)) static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { return Py_TYPE(ob) == type; @@ -162,6 +240,13 @@ static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { + // This immortal check is for code that is unaware of immortal objects. + // The runtime tracks these objects and we should avoid as much + // as possible having extensions inadvertently change the refcnt + // of an immortalized object. + if (_Py_IsImmortal(ob)) { + return; + } ob->ob_refcnt = refcnt; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -524,19 +609,33 @@ PyAPI_FUNC(void) Py_DecRef(PyObject *); PyAPI_FUNC(void) _Py_IncRef(PyObject *); PyAPI_FUNC(void) _Py_DecRef(PyObject *); -static inline void Py_INCREF(PyObject *op) +static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op) { #if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 // Stable ABI for Python 3.10 built in debug mode. _Py_IncRef(op); #else - _Py_INCREF_STAT_INC(); // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. +#if SIZEOF_VOID_P > 4 + // Portable saturated add, branching on the carry flag and set low bits + PY_UINT32_T cur_refcnt = op->ob_refcnt_split[PY_BIG_ENDIAN]; + PY_UINT32_T new_refcnt = cur_refcnt + 1; + if (new_refcnt == 0) { + return; + } + op->ob_refcnt_split[PY_BIG_ENDIAN] = new_refcnt; +#else + // Explicitly check immortality against the immortal value + if (_Py_IsImmortal(op)) { + return; + } + op->ob_refcnt++; +#endif + _Py_INCREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_INC_REFTOTAL(); -#endif // Py_REF_DEBUG - op->ob_refcnt++; +#endif #endif } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -553,6 +652,9 @@ static inline void Py_DECREF(PyObject *op) { #elif defined(Py_REF_DEBUG) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { + if (_Py_IsImmortal(op)) { + return; + } _Py_DECREF_STAT_INC(); _Py_DEC_REFTOTAL(); if (--op->ob_refcnt != 0) { @@ -567,11 +669,14 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) #else -static inline void Py_DECREF(PyObject *op) +static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op) { - _Py_DECREF_STAT_INC(); // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. + if (_Py_IsImmortal(op)) { + return; + } + _Py_DECREF_STAT_INC(); if (--op->ob_refcnt == 0) { _Py_Dealloc(op); } @@ -721,7 +826,7 @@ PyAPI_FUNC(int) Py_IsNone(PyObject *x); #define Py_IsNone(x) Py_Is((x), Py_None) /* Macro for returning Py_None from a function */ -#define Py_RETURN_NONE return Py_NewRef(Py_None) +#define Py_RETURN_NONE return Py_None /* Py_NotImplemented is a singleton used to signal that an operation is @@ -731,7 +836,7 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_NotImplemented (&_Py_NotImplementedStruct) /* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) +#define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented /* Rich comparison opcodes */ #define Py_LT 0 diff --git a/Include/pyport.h b/Include/pyport.h index eef0fe1bfd71d8..5e226f5cb46751 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -184,7 +184,6 @@ typedef Py_ssize_t Py_ssize_clean_t; # define Py_LOCAL_INLINE(type) static inline type #endif -// bpo-28126: Py_MEMCPY is kept for backwards compatibility, #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_MEMCPY memcpy #endif diff --git a/Lib/test/_test_embed_structseq.py b/Lib/test/_test_embed_structseq.py index 868f9f83e8be77..834daa4df55fec 100644 --- a/Lib/test/_test_embed_structseq.py +++ b/Lib/test/_test_embed_structseq.py @@ -1,27 +1,31 @@ import sys import types -import unittest +# Note: This test file can't import `unittest` since the runtime can't +# currently guarantee that it will not leak memory. Doing so will mark +# the test as passing but with reference leaks. This can safely import +# the `unittest` library once there's a strict guarantee of no leaks +# during runtime shutdown. # bpo-46417: Test that structseq types used by the sys module are still # valid when Py_Finalize()/Py_Initialize() are called multiple times. -class TestStructSeq(unittest.TestCase): +class TestStructSeq: # test PyTypeObject members - def check_structseq(self, obj_type): + def _check_structseq(self, obj_type): # ob_refcnt - self.assertGreaterEqual(sys.getrefcount(obj_type), 1) + assert sys.getrefcount(obj_type) > 1 # tp_base - self.assertTrue(issubclass(obj_type, tuple)) + assert issubclass(obj_type, tuple) # tp_bases - self.assertEqual(obj_type.__bases__, (tuple,)) + assert obj_type.__bases__ == (tuple,) # tp_dict - self.assertIsInstance(obj_type.__dict__, types.MappingProxyType) + assert isinstance(obj_type.__dict__, types.MappingProxyType) # tp_mro - self.assertEqual(obj_type.__mro__, (obj_type, tuple, object)) + assert obj_type.__mro__ == (obj_type, tuple, object) # tp_name - self.assertIsInstance(type.__name__, str) + assert isinstance(type.__name__, str) # tp_subclasses - self.assertEqual(obj_type.__subclasses__(), []) + assert obj_type.__subclasses__() == [] def test_sys_attrs(self): for attr_name in ( @@ -32,23 +36,23 @@ def test_sys_attrs(self): 'thread_info', # ThreadInfoType 'version_info', # VersionInfoType ): - with self.subTest(attr=attr_name): - attr = getattr(sys, attr_name) - self.check_structseq(type(attr)) + attr = getattr(sys, attr_name) + self._check_structseq(type(attr)) def test_sys_funcs(self): func_names = ['get_asyncgen_hooks'] # AsyncGenHooksType if hasattr(sys, 'getwindowsversion'): func_names.append('getwindowsversion') # WindowsVersionType for func_name in func_names: - with self.subTest(func=func_name): - func = getattr(sys, func_name) - obj = func() - self.check_structseq(type(obj)) + func = getattr(sys, func_name) + obj = func() + self._check_structseq(type(obj)) try: - unittest.main() + tests = TestStructSeq() + tests.test_sys_attrs() + tests.test_sys_funcs() except SystemExit as exc: if exc.args[0] != 0: raise diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index 4298fa806e1065..2de8c6cfbc61a1 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -73,9 +73,10 @@ def get_pooled_int(value): fd_deltas = [0] * repcount getallocatedblocks = sys.getallocatedblocks gettotalrefcount = sys.gettotalrefcount + getunicodeinternedsize = sys.getunicodeinternedsize fd_count = os_helper.fd_count # initialize variables to make pyflakes quiet - rc_before = alloc_before = fd_before = 0 + rc_before = alloc_before = fd_before = interned_before = 0 if not ns.quiet: print("beginning", repcount, "repetitions", file=sys.stderr) @@ -91,9 +92,13 @@ def get_pooled_int(value): dash_R_cleanup(fs, ps, pic, zdc, abcs) support.gc_collect() - # Read memory statistics immediately after the garbage collection - alloc_after = getallocatedblocks() - rc_after = gettotalrefcount() + # Read memory statistics immediately after the garbage collection. + # Also, readjust the reference counts and alloc blocks by ignoring + # any strings that might have been interned during test_func. These + # strings will be deallocated at runtime shutdown + interned_after = getunicodeinternedsize() + alloc_after = getallocatedblocks() - interned_after + rc_after = gettotalrefcount() - interned_after * 2 fd_after = fd_count() if not ns.quiet: @@ -106,6 +111,7 @@ def get_pooled_int(value): alloc_before = alloc_after rc_before = rc_after fd_before = fd_after + interned_before = interned_after if not ns.quiet: print(file=sys.stderr) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index e7a79bc13b7f3d..04dd8ff3070c99 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -28,7 +28,7 @@ from types import AsyncGeneratorType, FunctionType, CellType from operator import neg from test import support -from test.support import (swap_attr, maybe_get_event_loop_policy) +from test.support import (cpython_only, swap_attr, maybe_get_event_loop_policy) from test.support.os_helper import (EnvironmentVarGuard, TESTFN, unlink) from test.support.script_helper import assert_python_ok from test.support.warnings_helper import check_warnings @@ -2370,6 +2370,28 @@ def __del__(self): self.assertEqual(["before", "after"], out.decode().splitlines()) +@cpython_only +class ImmortalTests(unittest.TestCase): + def test_immortal(self): + none_refcount = sys.getrefcount(None) + true_refcount = sys.getrefcount(True) + false_refcount = sys.getrefcount(False) + smallint_refcount = sys.getrefcount(100) + + # Assert that all of these immortal instances have large ref counts. + self.assertGreater(none_refcount, 2 ** 15) + self.assertGreater(true_refcount, 2 ** 15) + self.assertGreater(false_refcount, 2 ** 15) + self.assertGreater(smallint_refcount, 2 ** 15) + + # Confirm that the refcount doesn't change even with a new ref to them. + l = [None, True, False, 100] + self.assertEqual(sys.getrefcount(None), none_refcount) + self.assertEqual(sys.getrefcount(True), true_refcount) + self.assertEqual(sys.getrefcount(False), false_refcount) + self.assertEqual(sys.getrefcount(100), smallint_refcount) + + class TestType(unittest.TestCase): def test_new_type(self): A = type('A', (), {}) diff --git a/Lib/test/test_ctypes/test_python_api.py b/Lib/test/test_ctypes/test_python_api.py index 49571f97bbe152..de8989e2c3300f 100644 --- a/Lib/test/test_ctypes/test_python_api.py +++ b/Lib/test/test_ctypes/test_python_api.py @@ -46,7 +46,8 @@ def test_PyLong_Long(self): pythonapi.PyLong_AsLong.restype = c_long res = pythonapi.PyLong_AsLong(42) - self.assertEqual(grc(res), ref42 + 1) + # Small int refcnts don't change + self.assertEqual(grc(res), ref42) del res self.assertEqual(grc(42), ref42) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 1aebe1b111f2e9..611cd27ecf1240 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -385,7 +385,8 @@ def test_refcount(self): self.assertRaises(TypeError, sys.getrefcount) c = sys.getrefcount(None) n = None - self.assertEqual(sys.getrefcount(None), c+1) + # Singleton refcnts don't change + self.assertEqual(sys.getrefcount(None), c) del n self.assertEqual(sys.getrefcount(None), c) if hasattr(sys, "gettotalrefcount"): diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 333b97688af5b6..95944c7c711620 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -600,9 +600,15 @@ def test_zippath_from_non_installed_posix(self): ld_library_path_env = "DYLD_LIBRARY_PATH" else: ld_library_path_env = "LD_LIBRARY_PATH" - subprocess.check_call(cmd, - env={"PYTHONPATH": pythonpath, - ld_library_path_env: ld_library_path}) + # Note that in address sanitizer mode, the current runtime + # implementation leaks memory due to not being able to correctly + # clean all unicode objects during runtime shutdown. Therefore, + # this uses subprocess.run instead of subprocess.check_call to + # maintain the core of the test while not failing due to the refleaks. + # This should be able to use check_call once all refleaks are fixed. + subprocess.run(cmd, + env={"PYTHONPATH": pythonpath, + ld_library_path_env: ld_library_path}) envpy = os.path.join(self.env_dir, self.bindir, self.exe) # Now check the venv created from the non-installed python has # correct zip path in pythonpath. diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst new file mode 100644 index 00000000000000..c4d8ce75b35a30 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-02-22-14-57.gh-issue-84436.hvMgwF.rst @@ -0,0 +1,3 @@ +The implementation of PEP-683 which adds Immortal Objects by using a fixed +reference count that skips reference counting to make objects truly +immutable. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 4eaa5490b6134c..1d00fc3e717788 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -418,8 +418,20 @@ validate_list(PyGC_Head *head, enum flagstates flags) static void update_refs(PyGC_Head *containers) { + PyGC_Head *next; PyGC_Head *gc = GC_NEXT(containers); - for (; gc != containers; gc = GC_NEXT(gc)) { + + while (gc != containers) { + next = GC_NEXT(gc); + /* Move any object that might have become immortal to the + * permanent generation as the reference count is not accurately + * reflecting the actual number of live references to this object + */ + if (_Py_IsImmortal(FROM_GC(gc))) { + gc_list_move(gc, &get_gc_state()->permanent_generation.head); + gc = next; + continue; + } gc_reset_refs(gc, Py_REFCNT(FROM_GC(gc))); /* Python's cyclic gc should never see an incoming refcount * of 0: if something decref'ed to 0, it should have been @@ -440,6 +452,7 @@ update_refs(PyGC_Head *containers) * check instead of an assert? */ _PyObject_ASSERT(FROM_GC(gc), gc_get_refs(gc) != 0); + gc = next; } } diff --git a/Objects/boolobject.c b/Objects/boolobject.c index 9d8e956e06f712..597a76fa5cb162 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -145,10 +145,14 @@ static PyNumberMethods bool_as_number = { 0, /* nb_index */ }; -static void _Py_NO_RETURN -bool_dealloc(PyObject* Py_UNUSED(ignore)) +static void +bool_dealloc(PyObject *boolean) { - _Py_FatalRefcountError("deallocating True or False"); + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref Booleans out of existence. Instead, + * since bools are immortal, re-set the reference count. + */ + _Py_SetImmortal(boolean); } /* The type object for bool. Note that this cannot be subclassed! */ diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index ef9e65e566ece9..33aa9c3db6e805 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -258,9 +258,12 @@ _Py_bytes_istitle(const char *cptr, Py_ssize_t len) const unsigned char *e; int cased, previous_is_cased; - /* Shortcut for single character strings */ - if (len == 1) - return PyBool_FromLong(Py_ISUPPER(*p)); + if (len == 1) { + if (Py_ISUPPER(*p)) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; + } /* Special case for empty strings */ if (len == 0) diff --git a/Objects/longobject.c b/Objects/longobject.c index bb4eac0d932bb8..d98bbbb6d6ff46 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -52,8 +52,7 @@ static PyObject * get_small_int(sdigit ival) { assert(IS_SMALL_INT(ival)); - PyObject *v = (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival]; - return Py_NewRef(v); + return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS + ival]; } static PyLongObject * @@ -3271,6 +3270,27 @@ long_richcompare(PyObject *self, PyObject *other, int op) Py_RETURN_RICHCOMPARE(result, 0, op); } +static void +long_dealloc(PyObject *self) +{ + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref small Ints out of existence. Instead, + * since small Ints are immortal, re-set the reference count. + */ + PyLongObject *pylong = (PyLongObject*)self; + if (pylong && _PyLong_IsCompact(pylong)) { + stwodigits ival = medium_value(pylong); + if (IS_SMALL_INT(ival)) { + PyLongObject *small_pylong = (PyLongObject *)get_small_int((sdigit)ival); + if (pylong == small_pylong) { + _Py_SetImmortal(self); + return; + } + } + } + Py_TYPE(self)->tp_free(self); +} + static Py_hash_t long_hash(PyLongObject *v) { @@ -6233,7 +6253,7 @@ PyTypeObject PyLong_Type = { "int", /* tp_name */ offsetof(PyLongObject, long_value.ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ - 0, /* tp_dealloc */ + long_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ diff --git a/Objects/object.c b/Objects/object.c index e26f737fccd60f..e508881c67d277 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1754,10 +1754,14 @@ none_repr(PyObject *op) return PyUnicode_FromString("None"); } -static void _Py_NO_RETURN -none_dealloc(PyObject* Py_UNUSED(ignore)) +static void +none_dealloc(PyObject* none) { - _Py_FatalRefcountError("deallocating None"); + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref None out of existence. Instead, + * since None is an immortal object, re-set the reference count. + */ + _Py_SetImmortal(none); } static PyObject * @@ -1823,7 +1827,7 @@ PyTypeObject _PyNone_Type = { "NoneType", 0, 0, - none_dealloc, /*tp_dealloc*/ /*never called*/ + none_dealloc, /*tp_dealloc*/ 0, /*tp_vectorcall_offset*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -1860,8 +1864,9 @@ PyTypeObject _PyNone_Type = { }; PyObject _Py_NoneStruct = { - _PyObject_EXTRA_INIT - 1, &_PyNone_Type + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_REFCNT }, + &_PyNone_Type }; /* NotImplemented is an object that can be used to signal that an @@ -1894,13 +1899,14 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void _Py_NO_RETURN -notimplemented_dealloc(PyObject* ignore) +static void +notimplemented_dealloc(PyObject *notimplemented) { /* This should never get called, but we also don't want to SEGV if - * we accidentally decref NotImplemented out of existence. + * we accidentally decref NotImplemented out of existence. Instead, + * since Notimplemented is an immortal object, re-set the reference count. */ - Py_FatalError("deallocating NotImplemented"); + _Py_SetImmortal(notimplemented); } static int @@ -1962,7 +1968,8 @@ PyTypeObject _PyNotImplemented_Type = { PyObject _Py_NotImplementedStruct = { _PyObject_EXTRA_INIT - 1, &_PyNotImplemented_Type + { _Py_IMMORTAL_REFCNT }, + &_PyNotImplemented_Type }; extern PyTypeObject _Py_GenericAliasIterType; @@ -2143,7 +2150,8 @@ new_reference(PyObject *op) if (_PyRuntime.tracemalloc.config.tracing) { _PyTraceMalloc_NewReference(op); } - Py_SET_REFCNT(op, 1); + // Skip the immortal object check in Py_SET_REFCNT; always set refcnt to 1 + op->ob_refcnt = 1; #ifdef Py_TRACE_REFS _Py_AddToAllObjects(op, 1); #endif diff --git a/Objects/setobject.c b/Objects/setobject.c index fcdda2a0bca2b6..58f0ae73c0c403 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2543,6 +2543,7 @@ static PyTypeObject _PySetDummy_Type = { }; static PyObject _dummy_struct = { - _PyObject_EXTRA_INIT - 2, &_PySetDummy_Type + _PyObject_EXTRA_INIT + { _Py_IMMORTAL_REFCNT }, + &_PySetDummy_Type }; diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 584ebce721faed..e6776ac92b669c 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -29,6 +29,16 @@ ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) return Py_NewRef(Py_Ellipsis); } +static void +ellipsis_dealloc(PyObject *ellipsis) +{ + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref Ellipsis out of existence. Instead, + * since Ellipsis is an immortal object, re-set the reference count. + */ + _Py_SetImmortal(ellipsis); +} + static PyObject * ellipsis_repr(PyObject *op) { @@ -51,7 +61,7 @@ PyTypeObject PyEllipsis_Type = { "ellipsis", /* tp_name */ 0, /* tp_basicsize */ 0, /* tp_itemsize */ - 0, /*never called*/ /* tp_dealloc */ + ellipsis_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ @@ -89,7 +99,8 @@ PyTypeObject PyEllipsis_Type = { PyObject _Py_EllipsisObject = { _PyObject_EXTRA_INIT - 1, &PyEllipsis_Type + { _Py_IMMORTAL_REFCNT }, + &PyEllipsis_Type }; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9ea458f30394e3..85bcd05d5a29df 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -318,27 +318,11 @@ _PyType_InitCache(PyInterpreterState *interp) entry->version = 0; // Set to None so _PyType_Lookup() can use Py_SETREF(), // rather than using slower Py_XSETREF(). - // (See _PyType_FixCacheRefcounts() about the refcount.) entry->name = Py_None; entry->value = NULL; } } -// This is the temporary fix used by pycore_create_interpreter(), -// in pylifecycle.c. _PyType_InitCache() is called before the GIL -// has been created (for the main interpreter) and without the -// "current" thread state set. This causes crashes when the -// reftotal is updated, so we don't modify the refcount in -// _PyType_InitCache(), and instead do it later by calling -// _PyType_FixCacheRefcounts(). -// XXX This workaround should be removed once we have immortal -// objects (PEP 683). -void -_PyType_FixCacheRefcounts(void) -{ - _Py_RefcntAdd(Py_None, (1 << MCACHE_SIZE_EXP)); -} - static unsigned int _PyType_ClearCache(PyInterpreterState *interp) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 85e5ae735709fd..fd056e38f3f86b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -228,14 +228,18 @@ static inline PyObject* unicode_new_empty(void) to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation function will delete the reference from this dictionary. - Another way to look at this is that to say that the actual reference - count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ static inline PyObject *get_interned_dict(PyInterpreterState *interp) { return _Py_INTERP_CACHED_OBJECT(interp, interned_strings); } +Py_ssize_t +_PyUnicode_InternedSize() +{ + return PyObject_Length(get_interned_dict(_PyInterpreterState_GET())); +} + static int init_interned_dict(PyInterpreterState *interp) { @@ -1538,30 +1542,19 @@ find_maxchar_surrogates(const wchar_t *begin, const wchar_t *end, static void unicode_dealloc(PyObject *unicode) { - PyInterpreterState *interp = _PyInterpreterState_GET(); #ifdef Py_DEBUG if (!unicode_is_finalizing() && unicode_is_singleton(unicode)) { _Py_FatalRefcountError("deallocating an Unicode singleton"); } #endif + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref an immortal string out of existence. Since + * the string is an immortal object, just re-set the reference count. + */ if (PyUnicode_CHECK_INTERNED(unicode)) { - /* Revive the dead object temporarily. PyDict_DelItem() removes two - references (key and value) which were ignored by - PyUnicode_InternInPlace(). Use refcnt=3 rather than refcnt=2 - to prevent calling unicode_dealloc() again. Adjust refcnt after - PyDict_DelItem(). */ - assert(Py_REFCNT(unicode) == 0); - Py_SET_REFCNT(unicode, 3); - PyObject *interned = get_interned_dict(interp); - assert(interned != NULL); - if (PyDict_DelItem(interned, unicode) != 0) { - _PyErr_WriteUnraisableMsg("deletion of interned string failed", - NULL); - } - assert(Py_REFCNT(unicode) == 1); - Py_SET_REFCNT(unicode, 0); + _Py_SetImmortal(unicode); + return; } - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); } @@ -14637,11 +14630,21 @@ _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p) return; } - /* The two references in interned dict (key and value) are not counted by - refcnt. unicode_dealloc() and _PyUnicode_ClearInterned() take care of - this. */ - Py_SET_REFCNT(s, Py_REFCNT(s) - 2); - _PyUnicode_STATE(s).interned = 1; + if (_Py_IsImmortal(s)) { + _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL_STATIC; + return; + } +#ifdef Py_REF_DEBUG + /* The reference count value excluding the 2 references from the + interned dictionary should be excluded from the RefTotal. The + decrements to these objects will not be registered so they + need to be accounted for in here. */ + for (Py_ssize_t i = 0; i < Py_REFCNT(s) - 2; i++) { + _Py_DecRefTotal(_PyInterpreterState_GET()); + } +#endif + _Py_SetImmortal(s); + _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; } void @@ -14681,10 +14684,20 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) } assert(PyDict_CheckExact(interned)); - /* Interned unicode strings are not forcibly deallocated; rather, we give - them their stolen references back, and then clear and DECREF the - interned dict. */ - + /* TODO: + * Currently, the runtime is not able to guarantee that it can exit without + * allocations that carry over to a future initialization of Python within + * the same process. i.e: + * ./python -X showrefcount -c 'import itertools' + * [237 refs, 237 blocks] + * + * Therefore, this should remain disabled for until there is a strict guarantee + * that no memory will be left after `Py_Finalize`. + */ +#ifdef Py_DEBUG + /* For all non-singleton interned strings, restore the two valid references + to that instance from within the intern string dictionary and let the + normal reference counting process clean up these instances. */ #ifdef INTERNED_STATS fprintf(stderr, "releasing %zd interned strings\n", PyDict_GET_SIZE(interned)); @@ -14694,15 +14707,27 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) Py_ssize_t pos = 0; PyObject *s, *ignored_value; while (PyDict_Next(interned, &pos, &s, &ignored_value)) { - assert(PyUnicode_CHECK_INTERNED(s)); - // Restore the two references (key and value) ignored - // by PyUnicode_InternInPlace(). - Py_SET_REFCNT(s, Py_REFCNT(s) + 2); + assert(PyUnicode_IS_READY(s)); + switch (PyUnicode_CHECK_INTERNED(s)) { + case SSTATE_INTERNED_IMMORTAL: + // Skip the Immortal Instance check and restore + // the two references (key and value) ignored + // by PyUnicode_InternInPlace(). + s->ob_refcnt = 2; #ifdef INTERNED_STATS - total_length += PyUnicode_GET_LENGTH(s); + total_length += PyUnicode_GET_LENGTH(s); #endif - - _PyUnicode_STATE(s).interned = 0; + break; + case SSTATE_INTERNED_IMMORTAL_STATIC: + break; + case SSTATE_INTERNED_MORTAL: + /* fall through */ + case SSTATE_NOT_INTERNED: + /* fall through */ + default: + Py_UNREACHABLE(); + } + _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } #ifdef INTERNED_STATS fprintf(stderr, @@ -14710,6 +14735,12 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) total_length); #endif + struct _Py_unicode_state *state = &interp->unicode; + struct _Py_unicode_ids *ids = &state->ids; + for (Py_ssize_t i=0; i < ids->size; i++) { + Py_XINCREF(ids->array[i]); + } +#endif /* Py_DEBUG */ clear_interned_dict(interp); } diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 00717114b40286..f78ba41fe7b4eb 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1911,14 +1911,13 @@ static int test_unicode_id_init(void) str1 = _PyUnicode_FromId(&PyId_test_unicode_id_init); assert(str1 != NULL); - assert(Py_REFCNT(str1) == 1); + assert(_Py_IsImmortal(str1)); str2 = PyUnicode_FromString("test_unicode_id_init"); assert(str2 != NULL); assert(PyUnicode_Compare(str1, str2) == 0); - // str1 is a borrowed reference Py_DECREF(str2); Py_Finalize(); diff --git a/Python/ceval.c b/Python/ceval.c index d8495da81e94ec..358835024fd2d0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -53,8 +53,11 @@ #undef Py_DECREF #define Py_DECREF(arg) \ do { \ - _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ + if (_Py_IsImmortal(op)) { \ + break; \ + } \ + _Py_DECREF_STAT_INC(); \ if (--op->ob_refcnt == 0) { \ destructor dealloc = Py_TYPE(op)->tp_dealloc; \ (*dealloc)(op); \ @@ -77,8 +80,11 @@ #undef _Py_DECREF_SPECIALIZED #define _Py_DECREF_SPECIALIZED(arg, dealloc) \ do { \ - _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ + if (_Py_IsImmortal(op)) { \ + break; \ + } \ + _Py_DECREF_STAT_INC(); \ if (--op->ob_refcnt == 0) { \ destructor d = (destructor)(dealloc); \ d(op); \ diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 46252dd404325b..7a7c188bcccc37 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -912,6 +912,34 @@ sys_getallocatedblocks(PyObject *module, PyObject *Py_UNUSED(ignored)) return return_value; } +PyDoc_STRVAR(sys_getunicodeinternedsize__doc__, +"getunicodeinternedsize($module, /)\n" +"--\n" +"\n" +"Return the number of elements of the unicode interned dictionary"); + +#define SYS_GETUNICODEINTERNEDSIZE_METHODDEF \ + {"getunicodeinternedsize", (PyCFunction)sys_getunicodeinternedsize, METH_NOARGS, sys_getunicodeinternedsize__doc__}, + +static Py_ssize_t +sys_getunicodeinternedsize_impl(PyObject *module); + +static PyObject * +sys_getunicodeinternedsize(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + Py_ssize_t _return_value; + + _return_value = sys_getunicodeinternedsize_impl(module); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + PyDoc_STRVAR(sys__getframe__doc__, "_getframe($module, depth=0, /)\n" "--\n" @@ -1387,4 +1415,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=5c761f14326ced54 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6d598acc26237fbe input=a9049054013a1b77]*/ diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 2a3b2b8ebeead7..8334f596eb3e19 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -16,13 +16,13 @@ static PyObject DISABLE = { - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_refcnt = _Py_IMMORTAL_REFCNT, .ob_type = &PyBaseObject_Type }; PyObject _PyInstrumentation_MISSING = { - .ob_refcnt = _PyObject_IMMORTAL_REFCNT, + .ob_refcnt = _Py_IMMORTAL_REFCNT, .ob_type = &PyBaseObject_Type }; diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c index cf345bddda79b0..e509e63a087a52 100644 --- a/Python/legacy_tracing.c +++ b/Python/legacy_tracing.c @@ -324,7 +324,7 @@ sys_trace_exception_handled( PyTypeObject _PyLegacyEventHandler_Type = { - _PyVarObject_IMMORTAL_INIT(&PyType_Type, 0), + PyVarObject_HEAD_INIT(&PyType_Type, 0) "sys.legacy_event_handler", sizeof(_PyLegacyEventHandler), .tp_dealloc = (destructor)PyObject_Free, diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d6627bc6b7e86b..a510c9b22168bc 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -808,11 +808,6 @@ pycore_interp_init(PyThreadState *tstate) PyStatus status; PyObject *sysmod = NULL; - // This is a temporary fix until we have immortal objects. - // (See _PyType_InitCache() in typeobject.c.) - extern void _PyType_FixCacheRefcounts(void); - _PyType_FixCacheRefcounts(); - // Create singletons before the first PyType_Ready() call, since // PyType_Ready() uses singletons like the Unicode empty string (tp_doc) // and the empty tuple singletons (tp_bases). diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4d693a1be1f89e..1e42e8dfceb5cc 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1874,6 +1874,18 @@ sys_getallocatedblocks_impl(PyObject *module) return _Py_GetAllocatedBlocks(); } +/*[clinic input] +sys.getunicodeinternedsize -> Py_ssize_t + +Return the number of elements of the unicode interned dictionary +[clinic start generated code]*/ + +static Py_ssize_t +sys_getunicodeinternedsize_impl(PyObject *module) +/*[clinic end generated code: output=ad0e4c9738ed4129 input=726298eaa063347a]*/ +{ + return _PyUnicode_InternedSize(); +} /*[clinic input] sys._getframe @@ -2243,6 +2255,7 @@ static PyMethodDef sys_methods[] = { SYS_GETDEFAULTENCODING_METHODDEF SYS_GETDLOPENFLAGS_METHODDEF SYS_GETALLOCATEDBLOCKS_METHODDEF + SYS_GETUNICODEINTERNEDSIZE_METHODDEF SYS_GETFILESYSTEMENCODING_METHODDEF SYS_GETFILESYSTEMENCODEERRORS_METHODDEF #ifdef Py_TRACE_REFS diff --git a/Tools/build/deepfreeze.py b/Tools/build/deepfreeze.py index aba5fecd8b1a99..5cfef5c572c4ae 100644 --- a/Tools/build/deepfreeze.py +++ b/Tools/build/deepfreeze.py @@ -142,7 +142,7 @@ def block(self, prefix: str, suffix: str = "") -> None: def object_head(self, typename: str) -> None: with self.block(".ob_base =", ","): - self.write(f".ob_refcnt = 999999999,") + self.write(f".ob_refcnt = _Py_IMMORTAL_REFCNT,") self.write(f".ob_type = &{typename},") def object_var_head(self, typename: str, size: int) -> None: From 8cb2b0f953288ff8749e686c268097cdd5a393e2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 22 Apr 2023 15:41:58 -0600 Subject: [PATCH 21/24] Revert "Avoid error lexing multiprocessing docs code block on Pygments 2.15.0" (#103616) This reverts commit ace51dcdb781b0608b1273d246ebaee849561435. --- Doc/library/multiprocessing.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 84e309f1bc8326..8454296b815b41 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -452,9 +452,7 @@ process which created it. importable by the children. This is covered in :ref:`multiprocessing-programming` however it is worth pointing out here. This means that some examples, such as the :class:`multiprocessing.pool.Pool` examples will not work in the - interactive interpreter. For example: - - .. code-block:: text + interactive interpreter. For example:: >>> from multiprocessing import Pool >>> p = Pool(5) From 7bf94568a9a4101c72b8bf555a811028e5b45ced Mon Sep 17 00:00:00 2001 From: Randy <69558016+san-juan1667@users.noreply.github.com> Date: Sat, 22 Apr 2023 17:33:50 -0600 Subject: [PATCH 22/24] gh-68654: Clarify subdirectories used by pkgutil.extend_path (#103701) Clarify sub directories used by pkgutil.extend_path in the docs and the docstring --- Doc/library/pkgutil.rst | 6 +++--- Lib/pkgutil.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 788a02dcb8922f..66d753bd1a3c6c 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -25,9 +25,9 @@ support. from pkgutil import extend_path __path__ = extend_path(__path__, __name__) - This will add to the package's ``__path__`` all subdirectories of directories - on :data:`sys.path` named after the package. This is useful if one wants to - distribute different parts of a single logical package as multiple + For each directory on :data:`sys.path` that has a subdirectory that matches the + package name, add the subdirectory to the package's :attr:`__path__`. This is useful + if one wants to distribute different parts of a single logical package as multiple directories. It also looks for :file:`\*.pkg` files beginning where ``*`` matches the diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index bdebfd2fc8ac32..56731de64af494 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -511,10 +511,10 @@ def extend_path(path, name): from pkgutil import extend_path __path__ = extend_path(__path__, __name__) - This will add to the package's __path__ all subdirectories of - directories on sys.path named after the package. This is useful - if one wants to distribute different parts of a single logical - package as multiple directories. + For each directory on sys.path that has a subdirectory that + matches the package name, add the subdirectory to the package's + __path__. This is useful if one wants to distribute different + parts of a single logical package as multiple directories. It also looks for *.pkg files beginning where * matches the name argument. This feature is similar to *.pth files (see site.py), From 0fd38917582aae0728e20d8a641e56d9be9270c7 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Sun, 23 Apr 2023 03:08:27 +0300 Subject: [PATCH 23/24] gh-102310: Change error range for invalid bytes literals (#103663) --- Lib/test/test_syntax.py | 24 +++++++++++++++++++ ...-04-21-17-03-14.gh-issue-102310.anLjDx.rst | 1 + Parser/string_parser.c | 3 ++- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index f23653558a9119..f959bbb4400702 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -1853,6 +1853,30 @@ def f(x: *b) Traceback (most recent call last): ... SyntaxError: invalid syntax + +Invalid bytes literals: + + >>> b"Ā" + Traceback (most recent call last): + ... + b"Ā" + ^^^ + SyntaxError: bytes can only contain ASCII literal characters + + >>> b"абвгде" + Traceback (most recent call last): + ... + b"абвгде" + ^^^^^^^^ + SyntaxError: bytes can only contain ASCII literal characters + + >>> b"abc ъющый" # first 3 letters are ascii + Traceback (most recent call last): + ... + b"abc ъющый" + ^^^^^^^^^^^ + SyntaxError: bytes can only contain ASCII literal characters + """ import re diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst new file mode 100644 index 00000000000000..15cb6c64adbab1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-21-17-03-14.gh-issue-102310.anLjDx.rst @@ -0,0 +1 @@ +Change the error range for invalid bytes literals. diff --git a/Parser/string_parser.c b/Parser/string_parser.c index be5f0c4a60a663..d4ce33850f7c58 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -248,7 +248,8 @@ _PyPegen_parse_string(Parser *p, Token *t) const char *ch; for (ch = s; *ch; ch++) { if (Py_CHARMASK(*ch) >= 0x80) { - RAISE_SYNTAX_ERROR( + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + t, "bytes can only contain ASCII " "literal characters"); return NULL; From e38bebb9ee805df6848f42845e71c8da8a821ad3 Mon Sep 17 00:00:00 2001 From: Dan Hemberger <846186+hemberger@users.noreply.github.com> Date: Sat, 22 Apr 2023 21:41:23 -0700 Subject: [PATCH 24/24] gh-81403: Fix for CacheFTPHandler in urllib (#13951) bpo-37222: Fix for CacheFTPHandler in urllib A call to FTP.ntransfercmd must be followed by FTP.voidresp to clear the "end transfer" message. Without this, the client and server get out of sync, which will result in an error if the FTP instance is reused to open a second URL. This scenario occurs for even the most basic usage of CacheFTPHandler. Reverts the patch merged as a resolution to bpo-16270 and adds a test case for the CacheFTPHandler in test_urllib2net.py. Co-authored-by: Senthil Kumaran --- Lib/test/test_urllib2net.py | 2 ++ Lib/urllib/request.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 5da41c37bbfb8e..d8d882b2d33589 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -134,7 +134,9 @@ def setUp(self): # They do sometimes catch some major disasters, though. def test_ftp(self): + # Testing the same URL twice exercises the caching in CacheFTPHandler urls = [ + 'ftp://www.pythontest.net/README', 'ftp://www.pythontest.net/README', ('ftp://www.pythontest.net/non-existent-file', None, urllib.error.URLError), diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 19e2e5bd335627..5314b3f26021eb 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2475,7 +2475,13 @@ def retrfile(self, file, type): return (ftpobj, retrlen) def endtransfer(self): + if not self.busy: + return self.busy = 0 + try: + self.ftp.voidresp() + except ftperrors(): + pass def close(self): self.keepalive = False