diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 45d06317c265be..1b0e953234296a 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -316,3 +316,13 @@ Lib/test/test__colorize.py @hugovk
# Fuzzing
Modules/_xxtestfuzz/ @ammaraskar
+
+# t-strings
+Include/internal/pycore_interpolation.h @lysnikolaou
+Include/internal/pycore_template.h @lysnikolaou
+Objects/interpolationobject.c @lysnikolaou
+Objects/clinic/interpolationobject.c.h @lysnikolaou
+Objects/templateobject.c @lysnikolaou
+Modules/_templatelibmodule.c @lysnikolaou
+Lib/string/templatelib.py @lysnikolaou
+Lib/test/test_tstring.py @lysnikolaou
diff --git a/Doc/library/token.rst b/Doc/library/token.rst
index 24455b1ef77893..e671bce554ba30 100644
--- a/Doc/library/token.rst
+++ b/Doc/library/token.rst
@@ -131,6 +131,15 @@ The token constants are:
The token string contains the closing quote(s).
+.. data:: TSTRING_START
+
+ Token value used to indicate the beginning of a t-string literal.
+
+ .. impl-detail::
+
+ The token string includes the prefix and the opening quote(s), but none
+ of the contents of the literal.
+
.. data:: ENDMARKER
Token value that indicates the end of input.
diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html
index 69c2ab6ae0519d..56023ebf962703 100644
--- a/Doc/tools/templates/layout.html
+++ b/Doc/tools/templates/layout.html
@@ -27,8 +27,7 @@
{% block extrahead %}
{% if builder == "html" and enable_analytics %}
-
-
+
{% endif %}
{% if builder != "htmlhelp" %}
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index c50d1669fef84c..7d469e83dc27ad 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -469,6 +469,10 @@ Other language changes
of HMAC is not available.
(Contributed by Bénédikt Tran in :gh:`99108`.)
+* When subclassing from a pure C type, the C slots for the new type are no
+ longer replaced with a wrapped version on class creation if they are not
+ explicitly overridden in the subclass.
+ (Contributed by Tomasz Pytel in :gh:`132329`.)
.. _whatsnew314-pep765:
diff --git a/Grammar/Tokens b/Grammar/Tokens
index 20bb803b7d58a6..fdbce45d1e6e71 100644
--- a/Grammar/Tokens
+++ b/Grammar/Tokens
@@ -60,6 +60,7 @@ TYPE_IGNORE
TYPE_COMMENT
SOFT_KEYWORD
FSTRING_START
+TSTRING_START
FSTRING_MIDDLE
FSTRING_END
COMMENT
diff --git a/Grammar/python.gram b/Grammar/python.gram
index de2d9c7508fa0e..2e95101b1ed2d8 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -513,7 +513,7 @@ literal_pattern[pattern_ty]:
literal_expr[expr_ty]:
| signed_number !('+' | '-')
| complex_number
- | strings
+ | &(STRING|FSTRING_START|TSTRING_START) strings
| 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) }
| 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) }
| 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) }
@@ -853,7 +853,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|FSTRING_START) strings
+ | &(STRING|FSTRING_START|TSTRING_START) strings
| NUMBER
| &'(' (tuple | group | genexp)
| &'[' (list | listcomp)
@@ -940,8 +940,18 @@ fstring_format_spec[expr_ty]:
fstring[expr_ty]:
| a=FSTRING_START b=fstring_middle* c=FSTRING_END { _PyPegen_joined_str(p, a, (asdl_expr_seq*)b, c) }
+tstring_replacement_field[expr_ty]:
+ | '{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='}' {
+ _PyPegen_interpolation(p, a, debug_expr, conversion, format, rbrace, EXTRA) }
+ | invalid_replacement_field
+tstring_middle[expr_ty]:
+ | tstring_replacement_field
+ | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) }
+tstring[expr_ty] (memo):
+ | a=TSTRING_START b=tstring_middle* c=FSTRING_END { _PyPegen_template_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) }
+strings[expr_ty] (memo): a[asdl_expr_seq*]=(fstring|string|tstring)+ { _PyPegen_concatenate_strings(p, a, EXTRA) }
list[expr_ty]:
| '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) }
@@ -1205,7 +1215,8 @@ invalid_expression:
| a[stmt_ty]=(pass_stmt|break_stmt|continue_stmt) 'if' b=disjunction 'else' c=simple_stmt {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION (a, "expected expression before 'if', but statement is given") }
| a='lambda' [lambda_params] b=':' &FSTRING_MIDDLE {
- RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "f-string: lambda expressions are not allowed without parentheses") }
+ RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "%c-string: lambda expressions are not allowed without parentheses",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
invalid_named_expression(memo):
| a=expression ':=' expression {
@@ -1448,26 +1459,38 @@ invalid_starred_expression:
| '*' { RAISE_SYNTAX_ERROR("Invalid star expression") }
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 '}'") }
- | '{' !annotated_rhs { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '{'")}
+ | '{' a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "%c-string: valid expression required before '='",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
+ | '{' a='!' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "%c-string: valid expression required before '!'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
+ | '{' a=':' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "%c-string: valid expression required before ':'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
+ | '{' a='}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "%c-string: valid expression required before '}'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
+ | '{' !annotated_rhs { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting a valid expression after '{'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f')}
| '{' annotated_rhs !('=' | '!' | ':' | '}') {
- PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '}'") }
+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting '=', or '!', or ':', or '}'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
| '{' annotated_rhs '=' !('!' | ':' | '}') {
- PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '}'") }
+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting '!', or ':', or '}'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
| '{' annotated_rhs '='? invalid_conversion_character
| '{' annotated_rhs '='? ['!' NAME] !(':' | '}') {
- PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '}'") }
+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting ':' or '}'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
| '{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'}' {
- PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}', or format specs") }
+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting '}', or format specs",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
| '{' annotated_rhs '='? ['!' NAME] !'}' {
- PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}'") }
+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: expecting '}'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
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") }
+ | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: missing conversion character",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
+ | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("%c-string: invalid conversion character",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f') }
invalid_arithmetic:
| sum ('+'|'-'|'*'|'/'|'%'|'//'|'@') a='not' b=inversion { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") }
diff --git a/Include/internal/pycore_ast.h b/Include/internal/pycore_ast.h
index 69abc3536e312a..3c7798dc5d7edd 100644
--- a/Include/internal/pycore_ast.h
+++ b/Include/internal/pycore_ast.h
@@ -361,9 +361,10 @@ enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4,
ListComp_kind=9, SetComp_kind=10, DictComp_kind=11,
GeneratorExp_kind=12, Await_kind=13, Yield_kind=14,
YieldFrom_kind=15, Compare_kind=16, Call_kind=17,
- FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20,
- Attribute_kind=21, Subscript_kind=22, Starred_kind=23,
- Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27};
+ FormattedValue_kind=18, Interpolation_kind=19,
+ JoinedStr_kind=20, TemplateStr_kind=21, Constant_kind=22,
+ Attribute_kind=23, Subscript_kind=24, Starred_kind=25,
+ Name_kind=26, List_kind=27, Tuple_kind=28, Slice_kind=29};
struct _expr {
enum _expr_kind kind;
union {
@@ -459,10 +460,21 @@ struct _expr {
expr_ty format_spec;
} FormattedValue;
+ struct {
+ expr_ty value;
+ constant str;
+ constant conversion;
+ expr_ty format_spec;
+ } Interpolation;
+
struct {
asdl_expr_seq *values;
} JoinedStr;
+ struct {
+ asdl_expr_seq *values;
+ } TemplateStr;
+
struct {
constant value;
string kind;
@@ -820,8 +832,14 @@ expr_ty _PyAST_Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq *
expr_ty _PyAST_FormattedValue(expr_ty value, int conversion, expr_ty
format_spec, int lineno, int col_offset, int
end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_Interpolation(expr_ty value, constant str, constant conversion,
+ expr_ty format_spec, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena
+ *arena);
expr_ty _PyAST_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset,
int end_lineno, int end_col_offset, PyArena *arena);
+expr_ty _PyAST_TemplateStr(asdl_expr_seq * values, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena);
expr_ty _PyAST_Constant(constant value, string kind, int lineno, int
col_offset, int end_lineno, int end_col_offset, PyArena
*arena);
diff --git a/Include/internal/pycore_ast_state.h b/Include/internal/pycore_ast_state.h
index 2f9d5ea366eade..d4ac419f51d6b2 100644
--- a/Include/internal/pycore_ast_state.h
+++ b/Include/internal/pycore_ast_state.h
@@ -75,6 +75,7 @@ struct ast_state {
PyObject *In_singleton;
PyObject *In_type;
PyObject *Interactive_type;
+ PyObject *Interpolation_type;
PyObject *Invert_singleton;
PyObject *Invert_type;
PyObject *IsNot_singleton;
@@ -137,6 +138,7 @@ struct ast_state {
PyObject *Sub_singleton;
PyObject *Sub_type;
PyObject *Subscript_type;
+ PyObject *TemplateStr_type;
PyObject *TryStar_type;
PyObject *Try_type;
PyObject *Tuple_type;
@@ -242,6 +244,7 @@ struct ast_state {
PyObject *slice;
PyObject *step;
PyObject *stmt_type;
+ PyObject *str;
PyObject *subject;
PyObject *tag;
PyObject *target;
diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h
index 5485d0bd64f3f1..8679683a463c46 100644
--- a/Include/internal/pycore_global_objects_fini_generated.h
+++ b/Include/internal/pycore_global_objects_fini_generated.h
@@ -880,6 +880,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) {
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(consts));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(context));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(contravariant));
+ _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(conversion));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cookie));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(copy));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(copyreg));
@@ -937,6 +938,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) {
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(exception));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(existing_file_name));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(exp));
+ _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(expression));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(extend));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(extra_tokens));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(facility));
diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h
index 3ce192511e3879..c19e64aa4a3432 100644
--- a/Include/internal/pycore_global_strings.h
+++ b/Include/internal/pycore_global_strings.h
@@ -371,6 +371,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(consts)
STRUCT_FOR_ID(context)
STRUCT_FOR_ID(contravariant)
+ STRUCT_FOR_ID(conversion)
STRUCT_FOR_ID(cookie)
STRUCT_FOR_ID(copy)
STRUCT_FOR_ID(copyreg)
@@ -428,6 +429,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(exception)
STRUCT_FOR_ID(existing_file_name)
STRUCT_FOR_ID(exp)
+ STRUCT_FOR_ID(expression)
STRUCT_FOR_ID(extend)
STRUCT_FOR_ID(extra_tokens)
STRUCT_FOR_ID(facility)
diff --git a/Include/internal/pycore_interpolation.h b/Include/internal/pycore_interpolation.h
new file mode 100644
index 00000000000000..813bd945411e0b
--- /dev/null
+++ b/Include/internal/pycore_interpolation.h
@@ -0,0 +1,28 @@
+#ifndef Py_INTERNAL_INTERPOLATION_H
+#define Py_INTERNAL_INTERPOLATION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+#include "pycore_stackref.h" // _PyStackRef
+
+extern PyTypeObject _PyInterpolation_Type;
+
+#define _PyInterpolation_Check(op) PyObject_TypeCheck((op), &_PyInterpolation_Type)
+#define _PyInterpolation_CheckExact(op) Py_IS_TYPE((op), &_PyInterpolation_Type)
+
+PyAPI_FUNC(PyObject *) _PyInterpolation_FromStackRefStealOnSuccess(_PyStackRef *values);
+
+extern PyStatus _PyInterpolation_InitTypes(PyInterpreterState *interp);
+extern PyObject *_PyInterpolation_GetValue(PyObject *interpolation);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h
index f75b05893affc1..a96cb6236f78b7 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -275,6 +275,7 @@ Known values:
Python 3.14a6 3620 (Optimize bytecode for all/any/tuple called on a genexp)
Python 3.14a7 3621 (Optimize LOAD_FAST opcodes into LOAD_FAST_BORROW)
Python 3.14a7 3622 (Store annotations in different class dict keys)
+ Python 3.14a7 3623 (Add BUILD_INTERPOLATION & BUILD_TEMPLATE opcodes)
Python 3.15 will start with 3650
@@ -287,7 +288,7 @@ PC/launcher.c must also be updated.
*/
-#define PYC_MAGIC_NUMBER 3622
+#define PYC_MAGIC_NUMBER 3623
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
(little-endian) and then appending b'\r\n'. */
#define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h
index 521f7a92cf08c4..0e1ace6c6aa59e 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -67,6 +67,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 2;
case BINARY_SLICE:
return 3;
+ case BUILD_INTERPOLATION:
+ return 4;
case BUILD_LIST:
return oparg;
case BUILD_MAP:
@@ -77,6 +79,10 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return oparg;
case BUILD_STRING:
return oparg;
+ case BUILD_TEMPLATE:
+ return oparg;
+ case BUILD_TEMPLATE_LIST:
+ return 1;
case BUILD_TUPLE:
return oparg;
case CACHE:
@@ -546,6 +552,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1;
case BINARY_SLICE:
return 1;
+ case BUILD_INTERPOLATION:
+ return 1;
case BUILD_LIST:
return 1;
case BUILD_MAP:
@@ -556,6 +564,10 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1;
case BUILD_STRING:
return 1;
+ case BUILD_TEMPLATE:
+ return 1;
+ case BUILD_TEMPLATE_LIST:
+ return 1;
case BUILD_TUPLE:
return 1;
case CACHE:
@@ -1077,11 +1089,14 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
[BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
+ [BUILD_INTERPOLATION] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
[BUILD_LIST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
[BUILD_MAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BUILD_SET] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BUILD_SLICE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG },
[BUILD_STRING] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG },
+ [BUILD_TEMPLATE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
+ [BUILD_TEMPLATE_LIST] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BUILD_TUPLE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG },
[CACHE] = { true, INSTR_FMT_IX, 0 },
[CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG },
@@ -1324,11 +1339,14 @@ _PyOpcode_macro_expansion[256] = {
[BINARY_OP_SUBTRACT_FLOAT] = { .nuops = 3, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBTRACT_FLOAT, OPARG_SIMPLE, 5 } } },
[BINARY_OP_SUBTRACT_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_INT, OPARG_SIMPLE, 0 }, { _BINARY_OP_SUBTRACT_INT, OPARG_SIMPLE, 5 } } },
[BINARY_SLICE] = { .nuops = 1, .uops = { { _BINARY_SLICE, OPARG_SIMPLE, 0 } } },
+ [BUILD_INTERPOLATION] = { .nuops = 1, .uops = { { _BUILD_INTERPOLATION, OPARG_SIMPLE, 0 } } },
[BUILD_LIST] = { .nuops = 1, .uops = { { _BUILD_LIST, OPARG_SIMPLE, 0 } } },
[BUILD_MAP] = { .nuops = 1, .uops = { { _BUILD_MAP, OPARG_SIMPLE, 0 } } },
[BUILD_SET] = { .nuops = 1, .uops = { { _BUILD_SET, OPARG_SIMPLE, 0 } } },
[BUILD_SLICE] = { .nuops = 1, .uops = { { _BUILD_SLICE, OPARG_SIMPLE, 0 } } },
[BUILD_STRING] = { .nuops = 1, .uops = { { _BUILD_STRING, OPARG_SIMPLE, 0 } } },
+ [BUILD_TEMPLATE] = { .nuops = 1, .uops = { { _BUILD_TEMPLATE, OPARG_SIMPLE, 0 } } },
+ [BUILD_TEMPLATE_LIST] = { .nuops = 1, .uops = { { _BUILD_TEMPLATE_LIST, OPARG_SIMPLE, 0 } } },
[BUILD_TUPLE] = { .nuops = 1, .uops = { { _BUILD_TUPLE, OPARG_SIMPLE, 0 } } },
[CALL_ALLOC_AND_ENTER_INIT] = { .nuops = 4, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_AND_ALLOCATE_OBJECT, 2, 1 }, { _CREATE_INIT_FRAME, OPARG_SIMPLE, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
[CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 9, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, OPARG_SIMPLE, 1 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _CHECK_FUNCTION_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _CHECK_STACK_SPACE, OPARG_SIMPLE, 3 }, { _INIT_CALL_PY_EXACT_ARGS, OPARG_SIMPLE, 3 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 3 }, { _PUSH_FRAME, OPARG_SIMPLE, 3 } } },
@@ -1510,11 +1528,14 @@ const char *_PyOpcode_OpName[266] = {
[BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT",
[BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT",
[BINARY_SLICE] = "BINARY_SLICE",
+ [BUILD_INTERPOLATION] = "BUILD_INTERPOLATION",
[BUILD_LIST] = "BUILD_LIST",
[BUILD_MAP] = "BUILD_MAP",
[BUILD_SET] = "BUILD_SET",
[BUILD_SLICE] = "BUILD_SLICE",
[BUILD_STRING] = "BUILD_STRING",
+ [BUILD_TEMPLATE] = "BUILD_TEMPLATE",
+ [BUILD_TEMPLATE_LIST] = "BUILD_TEMPLATE_LIST",
[BUILD_TUPLE] = "BUILD_TUPLE",
[CACHE] = "CACHE",
[CALL] = "CALL",
@@ -1775,11 +1796,14 @@ const uint8_t _PyOpcode_Deopt[256] = {
[BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP,
[BINARY_OP_SUBTRACT_INT] = BINARY_OP,
[BINARY_SLICE] = BINARY_SLICE,
+ [BUILD_INTERPOLATION] = BUILD_INTERPOLATION,
[BUILD_LIST] = BUILD_LIST,
[BUILD_MAP] = BUILD_MAP,
[BUILD_SET] = BUILD_SET,
[BUILD_SLICE] = BUILD_SLICE,
[BUILD_STRING] = BUILD_STRING,
+ [BUILD_TEMPLATE] = BUILD_TEMPLATE,
+ [BUILD_TEMPLATE_LIST] = BUILD_TEMPLATE_LIST,
[BUILD_TUPLE] = BUILD_TUPLE,
[CACHE] = CACHE,
[CALL] = CALL,
@@ -1988,9 +2012,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
#endif // NEED_OPCODE_METADATA
#define EXTRA_CASES \
- case 119: \
- case 120: \
- case 121: \
case 122: \
case 123: \
case 124: \
diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h
index 5c95d0feddecba..6345140b0829bd 100644
--- a/Include/internal/pycore_runtime_init_generated.h
+++ b/Include/internal/pycore_runtime_init_generated.h
@@ -878,6 +878,7 @@ extern "C" {
INIT_ID(consts), \
INIT_ID(context), \
INIT_ID(contravariant), \
+ INIT_ID(conversion), \
INIT_ID(cookie), \
INIT_ID(copy), \
INIT_ID(copyreg), \
@@ -935,6 +936,7 @@ extern "C" {
INIT_ID(exception), \
INIT_ID(existing_file_name), \
INIT_ID(exp), \
+ INIT_ID(expression), \
INIT_ID(extend), \
INIT_ID(extra_tokens), \
INIT_ID(facility), \
diff --git a/Include/internal/pycore_template.h b/Include/internal/pycore_template.h
new file mode 100644
index 00000000000000..ccf837fc305d73
--- /dev/null
+++ b/Include/internal/pycore_template.h
@@ -0,0 +1,27 @@
+#ifndef Py_INTERNAL_TEMPLATE_H
+#define Py_INTERNAL_TEMPLATE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef Py_BUILD_CORE
+# error "this header requires Py_BUILD_CORE define"
+#endif
+
+extern PyTypeObject _PyTemplate_Type;
+extern PyTypeObject _PyTemplateIter_Type;
+
+#define _PyTemplate_Check(op) PyObject_TypeCheck((op), &_PyTemplate_Type)
+#define _PyTemplate_CheckExact(op) Py_IS_TYPE((op), &_PyTemplate_Type)
+
+extern PyObject *_PyTemplate_Concat(PyObject *self, PyObject *other);
+
+PyAPI_FUNC(PyObject *) _PyTemplate_FromValues(PyObject **values, Py_ssize_t n);
+PyAPI_FUNC(PyObject *) _PyTemplate_FromList(PyObject *list);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/Include/internal/pycore_token.h b/Include/internal/pycore_token.h
index 571cd6249f2812..d8e1de1f324db4 100644
--- a/Include/internal/pycore_token.h
+++ b/Include/internal/pycore_token.h
@@ -73,12 +73,13 @@ extern "C" {
#define TYPE_COMMENT 57
#define SOFT_KEYWORD 58
#define FSTRING_START 59
-#define FSTRING_MIDDLE 60
-#define FSTRING_END 61
-#define COMMENT 62
-#define NL 63
-#define ERRORTOKEN 64
-#define N_TOKENS 66
+#define TSTRING_START 60
+#define FSTRING_MIDDLE 61
+#define FSTRING_END 62
+#define COMMENT 63
+#define NL 64
+#define ERRORTOKEN 65
+#define N_TOKENS 67
#define NT_OFFSET 256
/* Special definitions for cooperation with parser */
diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h
index a1fc9736d66618..9b3a61fdd14339 100644
--- a/Include/internal/pycore_unicodeobject_generated.h
+++ b/Include/internal/pycore_unicodeobject_generated.h
@@ -1272,6 +1272,10 @@ _PyUnicode_InitStaticStrings(PyInterpreterState *interp) {
_PyUnicode_InternStatic(interp, &string);
assert(_PyUnicode_CheckConsistency(string, 1));
assert(PyUnicode_GET_LENGTH(string) != 1);
+ string = &_Py_ID(conversion);
+ _PyUnicode_InternStatic(interp, &string);
+ assert(_PyUnicode_CheckConsistency(string, 1));
+ assert(PyUnicode_GET_LENGTH(string) != 1);
string = &_Py_ID(cookie);
_PyUnicode_InternStatic(interp, &string);
assert(_PyUnicode_CheckConsistency(string, 1));
@@ -1500,6 +1504,10 @@ _PyUnicode_InitStaticStrings(PyInterpreterState *interp) {
_PyUnicode_InternStatic(interp, &string);
assert(_PyUnicode_CheckConsistency(string, 1));
assert(PyUnicode_GET_LENGTH(string) != 1);
+ string = &_Py_ID(expression);
+ _PyUnicode_InternStatic(interp, &string);
+ assert(_PyUnicode_CheckConsistency(string, 1));
+ assert(PyUnicode_GET_LENGTH(string) != 1);
string = &_Py_ID(extend);
_PyUnicode_InternStatic(interp, &string);
assert(_PyUnicode_CheckConsistency(string, 1));
diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h
index e9a536919da598..9da3209b21c62e 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -28,11 +28,14 @@ extern "C" {
#define _BINARY_OP_SUBTRACT_FLOAT 316
#define _BINARY_OP_SUBTRACT_INT 317
#define _BINARY_SLICE 318
+#define _BUILD_INTERPOLATION BUILD_INTERPOLATION
#define _BUILD_LIST BUILD_LIST
#define _BUILD_MAP BUILD_MAP
#define _BUILD_SET BUILD_SET
#define _BUILD_SLICE BUILD_SLICE
#define _BUILD_STRING BUILD_STRING
+#define _BUILD_TEMPLATE BUILD_TEMPLATE
+#define _BUILD_TEMPLATE_LIST BUILD_TEMPLATE_LIST
#define _BUILD_TUPLE BUILD_TUPLE
#define _CALL_BUILTIN_CLASS 319
#define _CALL_BUILTIN_FAST 320
diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h
index ab26543a26fa98..99701edc72e5c3 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -150,6 +150,9 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_STORE_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ESCAPES_FLAG,
[_COPY_FREE_VARS] = HAS_ARG_FLAG,
[_BUILD_STRING] = HAS_ARG_FLAG | HAS_ERROR_FLAG,
+ [_BUILD_INTERPOLATION] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG,
+ [_BUILD_TEMPLATE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
+ [_BUILD_TEMPLATE_LIST] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_BUILD_TUPLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG,
[_BUILD_LIST] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
[_LIST_EXTEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@@ -325,11 +328,14 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_BINARY_OP_SUBTRACT_FLOAT] = "_BINARY_OP_SUBTRACT_FLOAT",
[_BINARY_OP_SUBTRACT_INT] = "_BINARY_OP_SUBTRACT_INT",
[_BINARY_SLICE] = "_BINARY_SLICE",
+ [_BUILD_INTERPOLATION] = "_BUILD_INTERPOLATION",
[_BUILD_LIST] = "_BUILD_LIST",
[_BUILD_MAP] = "_BUILD_MAP",
[_BUILD_SET] = "_BUILD_SET",
[_BUILD_SLICE] = "_BUILD_SLICE",
[_BUILD_STRING] = "_BUILD_STRING",
+ [_BUILD_TEMPLATE] = "_BUILD_TEMPLATE",
+ [_BUILD_TEMPLATE_LIST] = "_BUILD_TEMPLATE_LIST",
[_BUILD_TUPLE] = "_BUILD_TUPLE",
[_CALL_BUILTIN_CLASS] = "_CALL_BUILTIN_CLASS",
[_CALL_BUILTIN_FAST] = "_CALL_BUILTIN_FAST",
@@ -852,6 +858,12 @@ int _PyUop_num_popped(int opcode, int oparg)
return 0;
case _BUILD_STRING:
return oparg;
+ case _BUILD_INTERPOLATION:
+ return 4;
+ case _BUILD_TEMPLATE:
+ return oparg;
+ case _BUILD_TEMPLATE_LIST:
+ return 1;
case _BUILD_TUPLE:
return oparg;
case _BUILD_LIST:
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index 898dc580f4148e..26a865490f9f6c 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -12,123 +12,126 @@ extern "C" {
/* Instruction opcodes for compiled code */
#define CACHE 0
#define BINARY_SLICE 1
-#define CALL_FUNCTION_EX 2
+#define BUILD_INTERPOLATION 2
#define BINARY_OP_INPLACE_ADD_UNICODE 3
-#define CHECK_EG_MATCH 4
-#define CHECK_EXC_MATCH 5
-#define CLEANUP_THROW 6
-#define DELETE_SUBSCR 7
-#define END_FOR 8
-#define END_SEND 9
-#define EXIT_INIT_CHECK 10
-#define FORMAT_SIMPLE 11
-#define FORMAT_WITH_SPEC 12
-#define GET_AITER 13
-#define GET_ANEXT 14
-#define GET_ITER 15
-#define GET_LEN 16
+#define BUILD_TEMPLATE_LIST 4
+#define CALL_FUNCTION_EX 5
+#define CHECK_EG_MATCH 6
+#define CHECK_EXC_MATCH 7
+#define CLEANUP_THROW 8
+#define DELETE_SUBSCR 9
+#define END_FOR 10
+#define END_SEND 11
+#define EXIT_INIT_CHECK 12
+#define FORMAT_SIMPLE 13
+#define FORMAT_WITH_SPEC 14
+#define GET_AITER 15
+#define GET_ANEXT 16
#define RESERVED 17
-#define GET_YIELD_FROM_ITER 18
-#define INTERPRETER_EXIT 19
-#define LOAD_BUILD_CLASS 20
-#define LOAD_LOCALS 21
-#define MAKE_FUNCTION 22
-#define MATCH_KEYS 23
-#define MATCH_MAPPING 24
-#define MATCH_SEQUENCE 25
-#define NOP 26
-#define NOT_TAKEN 27
-#define POP_EXCEPT 28
-#define POP_ITER 29
-#define POP_TOP 30
-#define PUSH_EXC_INFO 31
-#define PUSH_NULL 32
-#define RETURN_GENERATOR 33
-#define RETURN_VALUE 34
-#define SETUP_ANNOTATIONS 35
-#define STORE_SLICE 36
-#define STORE_SUBSCR 37
-#define TO_BOOL 38
-#define UNARY_INVERT 39
-#define UNARY_NEGATIVE 40
-#define UNARY_NOT 41
-#define WITH_EXCEPT_START 42
-#define BINARY_OP 43
-#define BUILD_LIST 44
-#define BUILD_MAP 45
-#define BUILD_SET 46
-#define BUILD_SLICE 47
-#define BUILD_STRING 48
-#define BUILD_TUPLE 49
-#define CALL 50
-#define CALL_INTRINSIC_1 51
-#define CALL_INTRINSIC_2 52
-#define CALL_KW 53
-#define COMPARE_OP 54
-#define CONTAINS_OP 55
-#define CONVERT_VALUE 56
-#define COPY 57
-#define COPY_FREE_VARS 58
-#define DELETE_ATTR 59
-#define DELETE_DEREF 60
-#define DELETE_FAST 61
-#define DELETE_GLOBAL 62
-#define DELETE_NAME 63
-#define DICT_MERGE 64
-#define DICT_UPDATE 65
-#define END_ASYNC_FOR 66
-#define EXTENDED_ARG 67
-#define FOR_ITER 68
-#define GET_AWAITABLE 69
-#define IMPORT_FROM 70
-#define IMPORT_NAME 71
-#define IS_OP 72
-#define JUMP_BACKWARD 73
-#define JUMP_BACKWARD_NO_INTERRUPT 74
-#define JUMP_FORWARD 75
-#define LIST_APPEND 76
-#define LIST_EXTEND 77
-#define LOAD_ATTR 78
-#define LOAD_COMMON_CONSTANT 79
-#define LOAD_CONST 80
-#define LOAD_DEREF 81
-#define LOAD_FAST 82
-#define LOAD_FAST_AND_CLEAR 83
-#define LOAD_FAST_BORROW 84
-#define LOAD_FAST_BORROW_LOAD_FAST_BORROW 85
-#define LOAD_FAST_CHECK 86
-#define LOAD_FAST_LOAD_FAST 87
-#define LOAD_FROM_DICT_OR_DEREF 88
-#define LOAD_FROM_DICT_OR_GLOBALS 89
-#define LOAD_GLOBAL 90
-#define LOAD_NAME 91
-#define LOAD_SMALL_INT 92
-#define LOAD_SPECIAL 93
-#define LOAD_SUPER_ATTR 94
-#define MAKE_CELL 95
-#define MAP_ADD 96
-#define MATCH_CLASS 97
-#define POP_JUMP_IF_FALSE 98
-#define POP_JUMP_IF_NONE 99
-#define POP_JUMP_IF_NOT_NONE 100
-#define POP_JUMP_IF_TRUE 101
-#define RAISE_VARARGS 102
-#define RERAISE 103
-#define SEND 104
-#define SET_ADD 105
-#define SET_FUNCTION_ATTRIBUTE 106
-#define SET_UPDATE 107
-#define STORE_ATTR 108
-#define STORE_DEREF 109
-#define STORE_FAST 110
-#define STORE_FAST_LOAD_FAST 111
-#define STORE_FAST_STORE_FAST 112
-#define STORE_GLOBAL 113
-#define STORE_NAME 114
-#define SWAP 115
-#define UNPACK_EX 116
-#define UNPACK_SEQUENCE 117
-#define YIELD_VALUE 118
+#define GET_ITER 18
+#define GET_LEN 19
+#define GET_YIELD_FROM_ITER 20
+#define INTERPRETER_EXIT 21
+#define LOAD_BUILD_CLASS 22
+#define LOAD_LOCALS 23
+#define MAKE_FUNCTION 24
+#define MATCH_KEYS 25
+#define MATCH_MAPPING 26
+#define MATCH_SEQUENCE 27
+#define NOP 28
+#define NOT_TAKEN 29
+#define POP_EXCEPT 30
+#define POP_ITER 31
+#define POP_TOP 32
+#define PUSH_EXC_INFO 33
+#define PUSH_NULL 34
+#define RETURN_GENERATOR 35
+#define RETURN_VALUE 36
+#define SETUP_ANNOTATIONS 37
+#define STORE_SLICE 38
+#define STORE_SUBSCR 39
+#define TO_BOOL 40
+#define UNARY_INVERT 41
+#define UNARY_NEGATIVE 42
+#define UNARY_NOT 43
+#define WITH_EXCEPT_START 44
+#define BINARY_OP 45
+#define BUILD_LIST 46
+#define BUILD_MAP 47
+#define BUILD_SET 48
+#define BUILD_SLICE 49
+#define BUILD_STRING 50
+#define BUILD_TEMPLATE 51
+#define BUILD_TUPLE 52
+#define CALL 53
+#define CALL_INTRINSIC_1 54
+#define CALL_INTRINSIC_2 55
+#define CALL_KW 56
+#define COMPARE_OP 57
+#define CONTAINS_OP 58
+#define CONVERT_VALUE 59
+#define COPY 60
+#define COPY_FREE_VARS 61
+#define DELETE_ATTR 62
+#define DELETE_DEREF 63
+#define DELETE_FAST 64
+#define DELETE_GLOBAL 65
+#define DELETE_NAME 66
+#define DICT_MERGE 67
+#define DICT_UPDATE 68
+#define END_ASYNC_FOR 69
+#define EXTENDED_ARG 70
+#define FOR_ITER 71
+#define GET_AWAITABLE 72
+#define IMPORT_FROM 73
+#define IMPORT_NAME 74
+#define IS_OP 75
+#define JUMP_BACKWARD 76
+#define JUMP_BACKWARD_NO_INTERRUPT 77
+#define JUMP_FORWARD 78
+#define LIST_APPEND 79
+#define LIST_EXTEND 80
+#define LOAD_ATTR 81
+#define LOAD_COMMON_CONSTANT 82
+#define LOAD_CONST 83
+#define LOAD_DEREF 84
+#define LOAD_FAST 85
+#define LOAD_FAST_AND_CLEAR 86
+#define LOAD_FAST_BORROW 87
+#define LOAD_FAST_BORROW_LOAD_FAST_BORROW 88
+#define LOAD_FAST_CHECK 89
+#define LOAD_FAST_LOAD_FAST 90
+#define LOAD_FROM_DICT_OR_DEREF 91
+#define LOAD_FROM_DICT_OR_GLOBALS 92
+#define LOAD_GLOBAL 93
+#define LOAD_NAME 94
+#define LOAD_SMALL_INT 95
+#define LOAD_SPECIAL 96
+#define LOAD_SUPER_ATTR 97
+#define MAKE_CELL 98
+#define MAP_ADD 99
+#define MATCH_CLASS 100
+#define POP_JUMP_IF_FALSE 101
+#define POP_JUMP_IF_NONE 102
+#define POP_JUMP_IF_NOT_NONE 103
+#define POP_JUMP_IF_TRUE 104
+#define RAISE_VARARGS 105
+#define RERAISE 106
+#define SEND 107
+#define SET_ADD 108
+#define SET_FUNCTION_ATTRIBUTE 109
+#define SET_UPDATE 110
+#define STORE_ATTR 111
+#define STORE_DEREF 112
+#define STORE_FAST 113
+#define STORE_FAST_LOAD_FAST 114
+#define STORE_FAST_STORE_FAST 115
+#define STORE_GLOBAL 116
+#define STORE_NAME 117
+#define SWAP 118
+#define UNPACK_EX 119
+#define UNPACK_SEQUENCE 120
+#define YIELD_VALUE 121
#define RESUME 128
#define BINARY_OP_ADD_FLOAT 129
#define BINARY_OP_ADD_INT 130
@@ -245,7 +248,7 @@ extern "C" {
#define SETUP_WITH 264
#define STORE_FAST_MAYBE_NULL 265
-#define HAVE_ARGUMENT 42
+#define HAVE_ARGUMENT 44
#define MIN_SPECIALIZED_OPCODE 129
#define MIN_INSTRUMENTED_OPCODE 234
diff --git a/Lib/_ast_unparse.py b/Lib/_ast_unparse.py
index 56d9e935dd9d87..2c37082b263aaf 100644
--- a/Lib/_ast_unparse.py
+++ b/Lib/_ast_unparse.py
@@ -573,21 +573,11 @@ def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES):
quote_type = quote_types[0]
self.write(f"{quote_type}{string}{quote_type}")
- def visit_JoinedStr(self, node):
- self.write("f")
-
- fstring_parts = []
- for value in node.values:
- with self.buffered() as buffer:
- self._write_fstring_inner(value)
- fstring_parts.append(
- ("".join(buffer), isinstance(value, Constant))
- )
-
- new_fstring_parts = []
+ def _ftstring_helper(self, node, ftstring_parts):
+ new_ftstring_parts = []
quote_types = list(_ALL_QUOTES)
fallback_to_repr = False
- for value, is_constant in fstring_parts:
+ for value, is_constant in ftstring_parts:
if is_constant:
value, new_quote_types = self._str_literal_helper(
value,
@@ -606,30 +596,47 @@ def visit_JoinedStr(self, node):
new_quote_types = [q for q in quote_types if q not in value]
if new_quote_types:
quote_types = new_quote_types
- new_fstring_parts.append(value)
+ new_ftstring_parts.append(value)
if fallback_to_repr:
# If we weren't able to find a quote type that works for all parts
# of the JoinedStr, fallback to using repr and triple single quotes.
quote_types = ["'''"]
- new_fstring_parts.clear()
- for value, is_constant in fstring_parts:
+ new_ftstring_parts.clear()
+ for value, is_constant in ftstring_parts:
if is_constant:
value = repr('"' + value) # force repr to use single quotes
expected_prefix = "'\""
assert value.startswith(expected_prefix), repr(value)
value = value[len(expected_prefix):-1]
- new_fstring_parts.append(value)
+ new_ftstring_parts.append(value)
- value = "".join(new_fstring_parts)
+ value = "".join(new_ftstring_parts)
quote_type = quote_types[0]
self.write(f"{quote_type}{value}{quote_type}")
- def _write_fstring_inner(self, node, is_format_spec=False):
+ def _write_ftstring(self, node, prefix):
+ self.write(prefix)
+ fstring_parts = []
+ for value in node.values:
+ with self.buffered() as buffer:
+ self._write_ftstring_inner(value)
+ fstring_parts.append(
+ ("".join(buffer), isinstance(value, Constant))
+ )
+ self._ftstring_helper(node, fstring_parts)
+
+ def visit_JoinedStr(self, node):
+ self._write_ftstring(node, "f")
+
+ def visit_TemplateStr(self, node):
+ self._write_ftstring(node, "t")
+
+ def _write_ftstring_inner(self, node, is_format_spec=False):
if isinstance(node, JoinedStr):
# for both the f-string itself, and format_spec
for value in node.values:
- self._write_fstring_inner(value, is_format_spec=is_format_spec)
+ self._write_ftstring_inner(value, is_format_spec=is_format_spec)
elif isinstance(node, Constant) and isinstance(node.value, str):
value = node.value.replace("{", "{{").replace("}", "}}")
@@ -641,26 +648,41 @@ def _write_fstring_inner(self, node, is_format_spec=False):
self.write(value)
elif isinstance(node, FormattedValue):
self.visit_FormattedValue(node)
+ elif isinstance(node, Interpolation):
+ self.visit_Interpolation(node)
else:
raise ValueError(f"Unexpected node inside JoinedStr, {node!r}")
- def visit_FormattedValue(self, node):
- def unparse_inner(inner):
- unparser = type(self)()
- unparser.set_precedence(_Precedence.TEST.next(), inner)
- return unparser.visit(inner)
+ def _unparse_interpolation_value(self, inner):
+ unparser = type(self)()
+ unparser.set_precedence(_Precedence.TEST.next(), inner)
+ return unparser.visit(inner)
+
+ def _write_fstring_conversion(self, node):
+ if node.conversion != -1:
+ self.write(f"!{chr(node.conversion)}")
+
+ def _write_tstring_conversion(self, node):
+ if node.conversion is not None:
+ self.write(f"!{node.conversion}")
+ def _write_interpolation(self, node, write_conversion):
with self.delimit("{", "}"):
- expr = unparse_inner(node.value)
+ expr = self._unparse_interpolation_value(node.value)
if expr.startswith("{"):
# Separate pair of opening brackets as "{ {"
self.write(" ")
self.write(expr)
- if node.conversion != -1:
- self.write(f"!{chr(node.conversion)}")
+ write_conversion(node)
if node.format_spec:
self.write(":")
- self._write_fstring_inner(node.format_spec, is_format_spec=True)
+ self._write_ftstring_inner(node.format_spec, is_format_spec=True)
+
+ def visit_FormattedValue(self, node):
+ self._write_interpolation(node, self._write_fstring_conversion)
+
+ def visit_Interpolation(self, node):
+ self._write_interpolation(node, self._write_tstring_conversion)
def visit_Name(self, node):
self.write(node.id)
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index 15900265a01270..fd3c5a19ef0b2b 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -215,121 +215,124 @@
'INSTRUMENTED_LINE': 254,
'ENTER_EXECUTOR': 255,
'BINARY_SLICE': 1,
- 'CALL_FUNCTION_EX': 2,
- 'CHECK_EG_MATCH': 4,
- 'CHECK_EXC_MATCH': 5,
- 'CLEANUP_THROW': 6,
- 'DELETE_SUBSCR': 7,
- 'END_FOR': 8,
- 'END_SEND': 9,
- 'EXIT_INIT_CHECK': 10,
- 'FORMAT_SIMPLE': 11,
- 'FORMAT_WITH_SPEC': 12,
- 'GET_AITER': 13,
- 'GET_ANEXT': 14,
- 'GET_ITER': 15,
- 'GET_LEN': 16,
- 'GET_YIELD_FROM_ITER': 18,
- 'INTERPRETER_EXIT': 19,
- 'LOAD_BUILD_CLASS': 20,
- 'LOAD_LOCALS': 21,
- 'MAKE_FUNCTION': 22,
- 'MATCH_KEYS': 23,
- 'MATCH_MAPPING': 24,
- 'MATCH_SEQUENCE': 25,
- 'NOP': 26,
- 'NOT_TAKEN': 27,
- 'POP_EXCEPT': 28,
- 'POP_ITER': 29,
- 'POP_TOP': 30,
- 'PUSH_EXC_INFO': 31,
- 'PUSH_NULL': 32,
- 'RETURN_GENERATOR': 33,
- 'RETURN_VALUE': 34,
- 'SETUP_ANNOTATIONS': 35,
- 'STORE_SLICE': 36,
- 'STORE_SUBSCR': 37,
- 'TO_BOOL': 38,
- 'UNARY_INVERT': 39,
- 'UNARY_NEGATIVE': 40,
- 'UNARY_NOT': 41,
- 'WITH_EXCEPT_START': 42,
- 'BINARY_OP': 43,
- 'BUILD_LIST': 44,
- 'BUILD_MAP': 45,
- 'BUILD_SET': 46,
- 'BUILD_SLICE': 47,
- 'BUILD_STRING': 48,
- 'BUILD_TUPLE': 49,
- 'CALL': 50,
- 'CALL_INTRINSIC_1': 51,
- 'CALL_INTRINSIC_2': 52,
- 'CALL_KW': 53,
- 'COMPARE_OP': 54,
- 'CONTAINS_OP': 55,
- 'CONVERT_VALUE': 56,
- 'COPY': 57,
- 'COPY_FREE_VARS': 58,
- 'DELETE_ATTR': 59,
- 'DELETE_DEREF': 60,
- 'DELETE_FAST': 61,
- 'DELETE_GLOBAL': 62,
- 'DELETE_NAME': 63,
- 'DICT_MERGE': 64,
- 'DICT_UPDATE': 65,
- 'END_ASYNC_FOR': 66,
- 'EXTENDED_ARG': 67,
- 'FOR_ITER': 68,
- 'GET_AWAITABLE': 69,
- 'IMPORT_FROM': 70,
- 'IMPORT_NAME': 71,
- 'IS_OP': 72,
- 'JUMP_BACKWARD': 73,
- 'JUMP_BACKWARD_NO_INTERRUPT': 74,
- 'JUMP_FORWARD': 75,
- 'LIST_APPEND': 76,
- 'LIST_EXTEND': 77,
- 'LOAD_ATTR': 78,
- 'LOAD_COMMON_CONSTANT': 79,
- 'LOAD_CONST': 80,
- 'LOAD_DEREF': 81,
- 'LOAD_FAST': 82,
- 'LOAD_FAST_AND_CLEAR': 83,
- 'LOAD_FAST_BORROW': 84,
- 'LOAD_FAST_BORROW_LOAD_FAST_BORROW': 85,
- 'LOAD_FAST_CHECK': 86,
- 'LOAD_FAST_LOAD_FAST': 87,
- 'LOAD_FROM_DICT_OR_DEREF': 88,
- 'LOAD_FROM_DICT_OR_GLOBALS': 89,
- 'LOAD_GLOBAL': 90,
- 'LOAD_NAME': 91,
- 'LOAD_SMALL_INT': 92,
- 'LOAD_SPECIAL': 93,
- 'LOAD_SUPER_ATTR': 94,
- 'MAKE_CELL': 95,
- 'MAP_ADD': 96,
- 'MATCH_CLASS': 97,
- 'POP_JUMP_IF_FALSE': 98,
- 'POP_JUMP_IF_NONE': 99,
- 'POP_JUMP_IF_NOT_NONE': 100,
- 'POP_JUMP_IF_TRUE': 101,
- 'RAISE_VARARGS': 102,
- 'RERAISE': 103,
- 'SEND': 104,
- 'SET_ADD': 105,
- 'SET_FUNCTION_ATTRIBUTE': 106,
- 'SET_UPDATE': 107,
- 'STORE_ATTR': 108,
- 'STORE_DEREF': 109,
- 'STORE_FAST': 110,
- 'STORE_FAST_LOAD_FAST': 111,
- 'STORE_FAST_STORE_FAST': 112,
- 'STORE_GLOBAL': 113,
- 'STORE_NAME': 114,
- 'SWAP': 115,
- 'UNPACK_EX': 116,
- 'UNPACK_SEQUENCE': 117,
- 'YIELD_VALUE': 118,
+ 'BUILD_INTERPOLATION': 2,
+ 'BUILD_TEMPLATE_LIST': 4,
+ 'CALL_FUNCTION_EX': 5,
+ 'CHECK_EG_MATCH': 6,
+ 'CHECK_EXC_MATCH': 7,
+ 'CLEANUP_THROW': 8,
+ 'DELETE_SUBSCR': 9,
+ 'END_FOR': 10,
+ 'END_SEND': 11,
+ 'EXIT_INIT_CHECK': 12,
+ 'FORMAT_SIMPLE': 13,
+ 'FORMAT_WITH_SPEC': 14,
+ 'GET_AITER': 15,
+ 'GET_ANEXT': 16,
+ 'GET_ITER': 18,
+ 'GET_LEN': 19,
+ 'GET_YIELD_FROM_ITER': 20,
+ 'INTERPRETER_EXIT': 21,
+ 'LOAD_BUILD_CLASS': 22,
+ 'LOAD_LOCALS': 23,
+ 'MAKE_FUNCTION': 24,
+ 'MATCH_KEYS': 25,
+ 'MATCH_MAPPING': 26,
+ 'MATCH_SEQUENCE': 27,
+ 'NOP': 28,
+ 'NOT_TAKEN': 29,
+ 'POP_EXCEPT': 30,
+ 'POP_ITER': 31,
+ 'POP_TOP': 32,
+ 'PUSH_EXC_INFO': 33,
+ 'PUSH_NULL': 34,
+ 'RETURN_GENERATOR': 35,
+ 'RETURN_VALUE': 36,
+ 'SETUP_ANNOTATIONS': 37,
+ 'STORE_SLICE': 38,
+ 'STORE_SUBSCR': 39,
+ 'TO_BOOL': 40,
+ 'UNARY_INVERT': 41,
+ 'UNARY_NEGATIVE': 42,
+ 'UNARY_NOT': 43,
+ 'WITH_EXCEPT_START': 44,
+ 'BINARY_OP': 45,
+ 'BUILD_LIST': 46,
+ 'BUILD_MAP': 47,
+ 'BUILD_SET': 48,
+ 'BUILD_SLICE': 49,
+ 'BUILD_STRING': 50,
+ 'BUILD_TEMPLATE': 51,
+ 'BUILD_TUPLE': 52,
+ 'CALL': 53,
+ 'CALL_INTRINSIC_1': 54,
+ 'CALL_INTRINSIC_2': 55,
+ 'CALL_KW': 56,
+ 'COMPARE_OP': 57,
+ 'CONTAINS_OP': 58,
+ 'CONVERT_VALUE': 59,
+ 'COPY': 60,
+ 'COPY_FREE_VARS': 61,
+ 'DELETE_ATTR': 62,
+ 'DELETE_DEREF': 63,
+ 'DELETE_FAST': 64,
+ 'DELETE_GLOBAL': 65,
+ 'DELETE_NAME': 66,
+ 'DICT_MERGE': 67,
+ 'DICT_UPDATE': 68,
+ 'END_ASYNC_FOR': 69,
+ 'EXTENDED_ARG': 70,
+ 'FOR_ITER': 71,
+ 'GET_AWAITABLE': 72,
+ 'IMPORT_FROM': 73,
+ 'IMPORT_NAME': 74,
+ 'IS_OP': 75,
+ 'JUMP_BACKWARD': 76,
+ 'JUMP_BACKWARD_NO_INTERRUPT': 77,
+ 'JUMP_FORWARD': 78,
+ 'LIST_APPEND': 79,
+ 'LIST_EXTEND': 80,
+ 'LOAD_ATTR': 81,
+ 'LOAD_COMMON_CONSTANT': 82,
+ 'LOAD_CONST': 83,
+ 'LOAD_DEREF': 84,
+ 'LOAD_FAST': 85,
+ 'LOAD_FAST_AND_CLEAR': 86,
+ 'LOAD_FAST_BORROW': 87,
+ 'LOAD_FAST_BORROW_LOAD_FAST_BORROW': 88,
+ 'LOAD_FAST_CHECK': 89,
+ 'LOAD_FAST_LOAD_FAST': 90,
+ 'LOAD_FROM_DICT_OR_DEREF': 91,
+ 'LOAD_FROM_DICT_OR_GLOBALS': 92,
+ 'LOAD_GLOBAL': 93,
+ 'LOAD_NAME': 94,
+ 'LOAD_SMALL_INT': 95,
+ 'LOAD_SPECIAL': 96,
+ 'LOAD_SUPER_ATTR': 97,
+ 'MAKE_CELL': 98,
+ 'MAP_ADD': 99,
+ 'MATCH_CLASS': 100,
+ 'POP_JUMP_IF_FALSE': 101,
+ 'POP_JUMP_IF_NONE': 102,
+ 'POP_JUMP_IF_NOT_NONE': 103,
+ 'POP_JUMP_IF_TRUE': 104,
+ 'RAISE_VARARGS': 105,
+ 'RERAISE': 106,
+ 'SEND': 107,
+ 'SET_ADD': 108,
+ 'SET_FUNCTION_ATTRIBUTE': 109,
+ 'SET_UPDATE': 110,
+ 'STORE_ATTR': 111,
+ 'STORE_DEREF': 112,
+ 'STORE_FAST': 113,
+ 'STORE_FAST_LOAD_FAST': 114,
+ 'STORE_FAST_STORE_FAST': 115,
+ 'STORE_GLOBAL': 116,
+ 'STORE_NAME': 117,
+ 'SWAP': 118,
+ 'UNPACK_EX': 119,
+ 'UNPACK_SEQUENCE': 120,
+ 'YIELD_VALUE': 121,
'INSTRUMENTED_END_FOR': 234,
'INSTRUMENTED_POP_ITER': 235,
'INSTRUMENTED_END_SEND': 236,
@@ -362,5 +365,5 @@
'STORE_FAST_MAYBE_NULL': 265,
}
-HAVE_ARGUMENT = 42
+HAVE_ARGUMENT = 44
MIN_INSTRUMENTED_OPCODE = 234
diff --git a/Lib/string.py b/Lib/string/__init__.py
similarity index 100%
rename from Lib/string.py
rename to Lib/string/__init__.py
diff --git a/Lib/string/templatelib.py b/Lib/string/templatelib.py
new file mode 100644
index 00000000000000..54ca4d3475068f
--- /dev/null
+++ b/Lib/string/templatelib.py
@@ -0,0 +1,3 @@
+"""Support for template string literals (t-strings)."""
+
+from _templatelib import Interpolation, Template
diff --git a/Lib/test/.ruff.toml b/Lib/test/.ruff.toml
index 1c9bac507209b1..079a6cf2084192 100644
--- a/Lib/test/.ruff.toml
+++ b/Lib/test/.ruff.toml
@@ -7,6 +7,8 @@ extend-exclude = [
# Failed to lint
"encoded_modules/module_iso_8859_1.py",
"encoded_modules/module_koi8_r.py",
+ # SyntaxError because of t-strings
+ "test_tstring.py",
# TODO Fix: F811 Redefinition of unused name
"test_buffer.py",
"test_dataclasses/__init__.py",
diff --git a/Lib/test/test_ctypes/test_find.py b/Lib/test/test_ctypes/test_find.py
index 85b28617d2d754..3bd41a0e435d91 100644
--- a/Lib/test/test_ctypes/test_find.py
+++ b/Lib/test/test_ctypes/test_find.py
@@ -5,7 +5,7 @@
import unittest.mock
from ctypes import CDLL, RTLD_GLOBAL
from ctypes.util import find_library
-from test.support import os_helper
+from test.support import os_helper, thread_unsafe
# On some systems, loading the OpenGL libraries needs the RTLD_GLOBAL mode.
@@ -78,6 +78,7 @@ def test_shell_injection(self):
@unittest.skipUnless(sys.platform.startswith('linux'),
'Test only valid for Linux')
class FindLibraryLinux(unittest.TestCase):
+ @thread_unsafe('uses setenv')
def test_find_on_libpath(self):
import subprocess
import tempfile
diff --git a/Lib/test/test_ctypes/test_values.py b/Lib/test/test_ctypes/test_values.py
index 1b757e020d5ce2..1e209797606275 100644
--- a/Lib/test/test_ctypes/test_values.py
+++ b/Lib/test/test_ctypes/test_values.py
@@ -9,7 +9,7 @@
from ctypes import (Structure, CDLL, POINTER, pythonapi,
_pointer_type_cache,
c_ubyte, c_char_p, c_int)
-from test.support import import_helper
+from test.support import import_helper, thread_unsafe
class ValuesTestCase(unittest.TestCase):
@@ -18,6 +18,7 @@ def setUp(self):
_ctypes_test = import_helper.import_module("_ctypes_test")
self.ctdll = CDLL(_ctypes_test.__file__)
+ @thread_unsafe("static global variables aren't thread-safe")
def test_an_integer(self):
# This test checks and changes an integer stored inside the
# _ctypes_test dll/shared lib.
@@ -46,6 +47,7 @@ def test_optimizeflag(self):
opt = c_int.in_dll(pythonapi, "Py_OptimizeFlag").value
self.assertEqual(opt, sys.flags.optimize)
+ @thread_unsafe('overrides frozen modules')
def test_frozentable(self):
# Python exports a PyImport_FrozenModules symbol. This is a
# pointer to an array of struct _frozen entries. The end of the
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index 5974024c170cef..60b55c853ca43d 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -1358,7 +1358,6 @@ def test_conversions(self):
self.assertAllRaise(SyntaxError, "f-string: expecting '}'",
["f'{3!'",
"f'{3!s'",
- "f'{3!g'",
])
self.assertAllRaise(SyntaxError, 'f-string: missing conversion character',
diff --git a/Lib/test/test_tstring.py b/Lib/test/test_tstring.py
new file mode 100644
index 00000000000000..e7b4078d6702a6
--- /dev/null
+++ b/Lib/test/test_tstring.py
@@ -0,0 +1,441 @@
+import ast
+import unittest
+
+from string.templatelib import Template, Interpolation
+
+
+def convert(value, conversion):
+ if conversion == "a":
+ return ascii(value)
+ elif conversion == "r":
+ return repr(value)
+ elif conversion == "s":
+ return str(value)
+ return value
+
+
+def f(template):
+ parts = []
+ for item in template:
+ match item:
+ case str() as s:
+ parts.append(s)
+ case Interpolation(value, _, conversion, format_spec):
+ value = convert(value, conversion)
+ value = format(value, format_spec)
+ parts.append(value)
+ return "".join(parts)
+
+
+class TestTString(unittest.TestCase):
+ def assertAllRaise(self, exception_type, regex, error_strings):
+ for s in error_strings:
+ with self.subTest(s=s):
+ with self.assertRaisesRegex(exception_type, regex):
+ eval(s)
+
+ def test_template_basic_creation(self):
+ # Simple t-string creation
+ t = t"Hello, world"
+ self.assertTrue(isinstance(t, Template))
+ self.assertEqual(t.strings, ("Hello, world",))
+ self.assertEqual(len(t.interpolations), 0)
+ self.assertEqual(f(t), "Hello, world")
+
+ # Empty t-string
+ t = t""
+ self.assertEqual(t.strings, ("",))
+ self.assertEqual(len(t.interpolations), 0)
+ self.assertEqual(f(t), "")
+
+ # Multi-line t-string
+ t = t"""Hello,
+world"""
+ self.assertEqual(t.strings, ("Hello,\nworld",))
+ self.assertEqual(len(t.interpolations), 0)
+ self.assertEqual(f(t), "Hello,\nworld")
+
+ def test_template_creation_interleaving(self):
+ # Should add strings on either side
+ t = Template(Interpolation("Maria", "name", None, ""))
+ self.assertEqual(t.strings, ("", ""))
+ self.assertEqual(t.interpolations[0].value, "Maria")
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Maria")
+
+ # Should prepend empty string
+ t = Template(Interpolation("Maria", "name", None, ""), " is my name")
+ self.assertEqual(t.strings, ("", " is my name"))
+ self.assertEqual(t.interpolations[0].value, "Maria")
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Maria is my name")
+
+ # Should append empty string
+ t = Template("Hello, ", Interpolation("Maria", "name", None, ""))
+ self.assertEqual(t.strings, ("Hello, ", ""))
+ self.assertEqual(t.interpolations[0].value, "Maria")
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Maria")
+
+ # Should concatenate strings
+ t = Template("Hello", ", ", Interpolation("Maria", "name", None, ""), "!")
+ self.assertEqual(t.strings, ("Hello, ", "!"))
+ self.assertEqual(t.interpolations[0].value, "Maria")
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Maria!")
+
+ # Should add strings on either side and in between
+ t = Template(Interpolation("Maria", "name", None, ""), Interpolation("Python", "language", None, ""))
+ self.assertEqual(t.strings, ("", "", ""))
+ self.assertEqual(t.interpolations[0].value, "Maria")
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(t.interpolations[1].value, "Python")
+ self.assertEqual(t.interpolations[1].expression, "language")
+ self.assertEqual(t.interpolations[1].conversion, None)
+ self.assertEqual(t.interpolations[1].format_spec, "")
+ self.assertEqual(f(t), "MariaPython")
+
+ def test_string_representation(self):
+ # Test __repr__
+ t = t"Hello"
+ self.assertEqual(repr(t), "Template(strings=('Hello',), interpolations=())")
+
+ name = "Python"
+ t = t"Hello, {name}"
+ self.assertEqual(repr(t),
+ "Template(strings=('Hello, ', ''), "
+ "interpolations=(Interpolation('Python', 'name', None, ''),))"
+ )
+
+ def test_interpolation_basics(self):
+ # Test basic interpolation
+ name = "Python"
+ t = t"Hello, {name}"
+ self.assertEqual(t.strings, ("Hello, ", ""))
+ self.assertEqual(t.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Python")
+
+ # Multiple interpolations
+ first = "Python"
+ last = "Developer"
+ t = t"{first} {last}"
+ self.assertEqual(t.strings, ("", " ", ""))
+ self.assertEqual(t.interpolations[0].value, first)
+ self.assertEqual(t.interpolations[0].expression, "first")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(t.interpolations[1].value, last)
+ self.assertEqual(t.interpolations[1].expression, "last")
+ self.assertEqual(t.interpolations[1].conversion, None)
+ self.assertEqual(t.interpolations[1].format_spec, "")
+ self.assertEqual(f(t), "Python Developer")
+
+ # Interpolation with expressions
+ a = 10
+ b = 20
+ t = t"Sum: {a + b}"
+ self.assertEqual(t.strings, ("Sum: ", ""))
+ self.assertEqual(t.interpolations[0].value, a + b)
+ self.assertEqual(t.interpolations[0].expression, "a + b")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Sum: 30")
+
+ # Interpolation with function
+ def square(x):
+ return x * x
+ t = t"Square: {square(5)}"
+ self.assertEqual(t.strings, ("Square: ", ""))
+ self.assertEqual(t.interpolations[0].value, square(5))
+ self.assertEqual(t.interpolations[0].expression, "square(5)")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Square: 25")
+
+ # Test attribute access in expressions
+ class Person:
+ def __init__(self, name):
+ self.name = name
+
+ def upper(self):
+ return self.name.upper()
+
+ person = Person("Alice")
+ t = t"Name: {person.name}"
+ self.assertEqual(t.strings, ("Name: ", ""))
+ self.assertEqual(t.interpolations[0].value, person.name)
+ self.assertEqual(t.interpolations[0].expression, "person.name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Name: Alice")
+
+ # Test method calls
+ t = t"Name: {person.upper()}"
+ self.assertEqual(t.strings, ("Name: ", ""))
+ self.assertEqual(t.interpolations[0].value, person.upper())
+ self.assertEqual(t.interpolations[0].expression, "person.upper()")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Name: ALICE")
+
+ # Test dictionary access
+ data = {"name": "Bob", "age": 30}
+ t = t"Name: {data['name']}, Age: {data['age']}"
+ self.assertEqual(t.strings, ("Name: ", ", Age: ", ""))
+ self.assertEqual(t.interpolations[0].value, data["name"])
+ self.assertEqual(t.interpolations[0].expression, "data['name']")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(t.interpolations[1].value, data["age"])
+ self.assertEqual(t.interpolations[1].expression, "data['age']")
+ self.assertEqual(t.interpolations[1].conversion, None)
+ self.assertEqual(t.interpolations[1].format_spec, "")
+ self.assertEqual(f(t), "Name: Bob, Age: 30")
+
+ def test_format_specifiers(self):
+ # Test basic format specifiers
+ value = 3.14159
+ t = t"Pi: {value:.2f}"
+ self.assertEqual(t.strings, ("Pi: ", ""))
+ self.assertEqual(t.interpolations[0].value, value)
+ self.assertEqual(t.interpolations[0].expression, "value")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, ".2f")
+ self.assertEqual(f(t), "Pi: 3.14")
+
+ def test_conversions(self):
+ # Test !s conversion (str)
+ obj = object()
+ t = t"Object: {obj!s}"
+ self.assertEqual(t.strings, ("Object: ", ""))
+ self.assertEqual(t.interpolations[0].value, obj)
+ self.assertEqual(t.interpolations[0].expression, "obj")
+ self.assertEqual(t.interpolations[0].conversion, "s")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), f"Object: {str(obj)}")
+
+ # Test !r conversion (repr)
+ t = t"Data: {obj!r}"
+ self.assertEqual(t.strings, ("Data: ", ""))
+ self.assertEqual(t.interpolations[0].value, obj)
+ self.assertEqual(t.interpolations[0].expression, "obj")
+ self.assertEqual(t.interpolations[0].conversion, "r")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), f"Data: {repr(obj)}")
+
+ # Test !a conversion (ascii)
+ text = "Café"
+ t = t"ASCII: {text!a}"
+ self.assertEqual(t.strings, ("ASCII: ", ""))
+ self.assertEqual(t.interpolations[0].value, text)
+ self.assertEqual(t.interpolations[0].expression, "text")
+ self.assertEqual(t.interpolations[0].conversion, "a")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), f"ASCII: {ascii(text)}")
+
+ # Test !z conversion (error)
+ num = 1
+ with self.assertRaises(SyntaxError):
+ eval("t'{num!z}'")
+
+ def test_debug_specifier(self):
+ # Test debug specifier
+ value = 42
+ t = t"Value: {value=}"
+ self.assertEqual(t.strings, ("Value: value=", ""))
+ self.assertEqual(t.interpolations[0].value, value)
+ self.assertEqual(t.interpolations[0].expression, "value")
+ self.assertEqual(t.interpolations[0].conversion, "r")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Value: value=42")
+
+ # Test debug specifier with format (conversion default to !r)
+ t = t"Value: {value=:.2f}"
+ self.assertEqual(t.strings, ("Value: value=", ""))
+ self.assertEqual(t.interpolations[0].value, value)
+ self.assertEqual(t.interpolations[0].expression, "value")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, ".2f")
+ self.assertEqual(f(t), "Value: value=42.00")
+
+ # Test debug specifier with conversion
+ t = t"Value: {value=!s}"
+ self.assertEqual(t.strings, ("Value: value=", ""))
+ self.assertEqual(t.interpolations[0].value, value)
+ self.assertEqual(t.interpolations[0].expression, "value")
+ self.assertEqual(t.interpolations[0].conversion, "s")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+
+ # Test white space in debug specifier
+ t = t"Value: {value = }"
+ self.assertEqual(t.strings, ("Value: value = ", ""))
+ self.assertEqual(t.interpolations[0].value, value)
+ self.assertEqual(t.interpolations[0].expression, "value")
+ self.assertEqual(t.interpolations[0].conversion, "r")
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Value: value = 42")
+
+ def test_raw_tstrings(self):
+ path = r"C:\Users"
+ t = rt"{path}\Documents"
+ self.assertEqual(t.strings, ("", r"\Documents",))
+ self.assertEqual(t.interpolations[0].value, path)
+ self.assertEqual(t.interpolations[0].expression, "path")
+ self.assertEqual(f(t), r"C:\Users\Documents")
+
+ # Test alternative prefix
+ t = tr"{path}\Documents"
+ self.assertEqual(t.strings, ("", r"\Documents",))
+ self.assertEqual(t.interpolations[0].value, path)
+
+
+ def test_template_concatenation(self):
+ # Test template + template
+ t1 = t"Hello, "
+ t2 = t"world"
+ combined = t1 + t2
+ self.assertEqual(combined.strings, ("Hello, world",))
+ self.assertEqual(len(combined.interpolations), 0)
+ self.assertEqual(f(combined), "Hello, world")
+
+ # Test template + string
+ t1 = t"Hello"
+ combined = t1 + ", world"
+ self.assertEqual(combined.strings, ("Hello, world",))
+ self.assertEqual(len(combined.interpolations), 0)
+ self.assertEqual(f(combined), "Hello, world")
+
+ # Test template + template with interpolation
+ name = "Python"
+ t1 = t"Hello, "
+ t2 = t"{name}"
+ combined = t1 + t2
+ self.assertEqual(combined.strings, ("Hello, ", ""))
+ self.assertEqual(combined.interpolations[0].value, name)
+ self.assertEqual(combined.interpolations[0].expression, "name")
+ self.assertEqual(combined.interpolations[0].conversion, None)
+ self.assertEqual(combined.interpolations[0].format_spec, "")
+ self.assertEqual(f(combined), "Hello, Python")
+
+ # Test string + template
+ t = "Hello, " + t"{name}"
+ self.assertEqual(t.strings, ("Hello, ", ""))
+ self.assertEqual(t.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Python")
+
+ def test_nested_templates(self):
+ # Test a template inside another template expression
+ name = "Python"
+ inner = t"{name}"
+ t = t"Language: {inner}"
+
+ self.assertEqual(t.strings, ("Language: ", ""))
+ self.assertEqual(t.interpolations[0].value.strings, ("", ""))
+ self.assertEqual(t.interpolations[0].value.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].value.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].value.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].value.interpolations[0].format_spec, "")
+ self.assertEqual(t.interpolations[0].expression, "inner")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+
+ def test_ast_structure(self):
+ # Test AST structure for simple t-string
+ tree = ast.parse('t"Hello"')
+ self.assertIsInstance(tree.body[0].value, ast.TemplateStr)
+ self.assertIsInstance(tree.body[0].value.values[0], ast.Constant)
+
+ # Test AST for t-string with interpolation
+ tree = ast.parse('t"Hello {name}"')
+ self.assertIsInstance(tree.body[0].value, ast.TemplateStr)
+ self.assertIsInstance(tree.body[0].value.values[0], ast.Constant)
+ self.assertIsInstance(tree.body[0].value.values[1], ast.Interpolation)
+
+ def test_error_conditions(self):
+ # Test syntax errors
+ with self.assertRaisesRegex(SyntaxError, "'{' was never closed"):
+ eval("t'{")
+
+ with self.assertRaisesRegex(SyntaxError, "t-string: expecting '}'"):
+ eval("t'{a'")
+
+ with self.assertRaisesRegex(SyntaxError, "t-string: single '}' is not allowed"):
+ eval("t'}'")
+
+ # Test missing variables
+ with self.assertRaises(NameError):
+ eval("t'Hello, {name}'")
+
+ # Test invalid conversion
+ num = 1
+ with self.assertRaises(SyntaxError):
+ eval("t'{num!z}'")
+
+ def test_literal_concatenation(self):
+ # Test concatenation of t-string literals
+ t = t"Hello, " t"world"
+ self.assertEqual(t.strings, ("Hello, world",))
+ self.assertEqual(len(t.interpolations), 0)
+ self.assertEqual(f(t), "Hello, world")
+
+ # Test concatenation with interpolation
+ name = "Python"
+ t = t"Hello, " t"{name}"
+ self.assertEqual(t.strings, ("Hello, ", ""))
+ self.assertEqual(t.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Python")
+
+ # Test concatenation with string literal
+ name = "Python"
+ t = t"Hello, {name}" "and welcome!"
+ self.assertEqual(t.strings, ("Hello, ", "and welcome!"))
+ self.assertEqual(t.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "Hello, Pythonand welcome!")
+
+ def test_triple_quoted(self):
+ # Test triple-quoted t-strings
+ t = t"""
+ Hello,
+ world
+ """
+ self.assertEqual(t.strings, ("\n Hello,\n world\n ",))
+ self.assertEqual(len(t.interpolations), 0)
+ self.assertEqual(f(t), "\n Hello,\n world\n ")
+
+ # Test triple-quoted with interpolation
+ name = "Python"
+ t = t"""
+ Hello,
+ {name}
+ """
+ self.assertEqual(t.strings, ("\n Hello,\n ", "\n "))
+ self.assertEqual(t.interpolations[0].value, name)
+ self.assertEqual(t.interpolations[0].expression, "name")
+ self.assertEqual(t.interpolations[0].conversion, None)
+ self.assertEqual(t.interpolations[0].format_spec, "")
+ self.assertEqual(f(t), "\n Hello,\n Python\n ")
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 87081a6db4ea48..e5d80ee8eb7aca 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -1838,6 +1838,23 @@ class Model(metaclass=ModelBase):
with self.assertRaises(RuntimeWarning):
type("SouthPonies", (Model,), {})
+ def test_subclass_inherited_slot_update(self):
+ # gh-132284: Make sure slot update still works after fix.
+ # Note that after assignment to D.__getitem__ the actual C slot will
+ # never go back to dict_subscript as it was on class type creation but
+ # rather be set to slot_mp_subscript, unfortunately there is no way to
+ # check that here.
+
+ class D(dict):
+ pass
+
+ d = D({None: None})
+ self.assertIs(d[None], None)
+ D.__getitem__ = lambda self, item: 42
+ self.assertEqual(d[None], 42)
+ D.__getitem__ = dict.__getitem__
+ self.assertIs(d[None], None)
+
def test_tuple_subclass_as_bases(self):
# gh-132176: it used to crash on using
# tuple subclass for as base classes.
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 81474a81be645d..4fd3d53b72c01b 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -3149,6 +3149,21 @@ def x(self): ...
with self.assertRaisesRegex(TypeError, only_classes_allowed):
issubclass(1, BadPG)
+ def test_isinstance_against_superproto_doesnt_affect_subproto_instance(self):
+ @runtime_checkable
+ class Base(Protocol):
+ x: int
+
+ @runtime_checkable
+ class Child(Base, Protocol):
+ y: str
+
+ class Capybara:
+ x = 43
+
+ self.assertIsInstance(Capybara(), Base)
+ self.assertNotIsInstance(Capybara(), Child)
+
def test_implicit_issubclass_between_two_protocols(self):
@runtime_checkable
class CallableMembersProto(Protocol):
@@ -6323,7 +6338,7 @@ def test_lazy_import(self):
"inspect",
"re",
"contextlib",
- # "annotationlib", # TODO
+ "annotationlib",
})
diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py
index 839326f6436809..041a4017a9fb78 100644
--- a/Lib/test/test_unparse.py
+++ b/Lib/test/test_unparse.py
@@ -918,7 +918,7 @@ class DirectoryTestCase(ASTTestCase):
run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py",
"test_ast.py", "test_asdl_parser.py", "test_fstring.py",
"test_patma.py", "test_type_alias.py", "test_type_params.py",
- "test_tokenize.py"}
+ "test_tokenize.py", "test_tstring.py"}
_files_to_test = None
diff --git a/Lib/token.py b/Lib/token.py
index 54d7cdccadc79a..6e7bb0c425b966 100644
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -64,14 +64,15 @@
TYPE_COMMENT = 57
SOFT_KEYWORD = 58
FSTRING_START = 59
-FSTRING_MIDDLE = 60
-FSTRING_END = 61
-COMMENT = 62
-NL = 63
+TSTRING_START = 60
+FSTRING_MIDDLE = 61
+FSTRING_END = 62
+COMMENT = 63
+NL = 64
# These aren't used by the C tokenizer but are needed for tokenize.py
-ERRORTOKEN = 64
-ENCODING = 65
-N_TOKENS = 66
+ERRORTOKEN = 65
+ENCODING = 66
+N_TOKENS = 67
# Special definitions for cooperation with parser
NT_OFFSET = 256
diff --git a/Lib/typing.py b/Lib/typing.py
index 245592b5678957..f70dcd0b5b7b5c 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1801,9 +1801,13 @@ def _get_protocol_attrs(cls):
for base in cls.__mro__[:-1]: # without object
if base.__name__ in {'Protocol', 'Generic'}:
continue
- annotations = _lazy_annotationlib.get_annotations(
- base, format=_lazy_annotationlib.Format.FORWARDREF
- )
+ try:
+ annotations = base.__annotations__
+ except Exception:
+ # Only go through annotationlib to handle deferred annotations if we need to
+ annotations = _lazy_annotationlib.get_annotations(
+ base, format=_lazy_annotationlib.Format.FORWARDREF
+ )
for attr in (*base.__dict__, *annotations):
if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
attrs.add(attr)
@@ -2020,14 +2024,17 @@ def _proto_hook(cls, other):
break
# ...or in annotations, if it is a sub-protocol.
- if (
- issubclass(other, Generic)
- and getattr(other, "_is_protocol", False)
- and attr in _lazy_annotationlib.get_annotations(
- base, format=_lazy_annotationlib.Format.FORWARDREF
- )
- ):
- break
+ if issubclass(other, Generic) and getattr(other, "_is_protocol", False):
+ # We avoid the slower path through annotationlib here because in most
+ # cases it should be unnecessary.
+ try:
+ annos = base.__annotations__
+ except Exception:
+ annos = _lazy_annotationlib.get_annotations(
+ base, format=_lazy_annotationlib.Format.FORWARDREF
+ )
+ if attr in annos:
+ break
else:
return NotImplemented
return True
diff --git a/Makefile.pre.in b/Makefile.pre.in
index e41a26e469dc22..ca8eea27756198 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -565,6 +565,8 @@ OBJECT_OBJS= \
Objects/unicodectype.o \
Objects/unionobject.o \
Objects/weakrefobject.o \
+ Objects/interpolationobject.o \
+ Objects/templateobject.o \
@PERF_TRAMPOLINE_OBJ@
##########################################################################
@@ -1312,6 +1314,7 @@ PYTHON_HEADERS= \
$(srcdir)/Include/internal/pycore_interp_structs.h \
$(srcdir)/Include/internal/pycore_interpframe.h \
$(srcdir)/Include/internal/pycore_interpframe_structs.h \
+ $(srcdir)/Include/internal/pycore_interpolation.h \
$(srcdir)/Include/internal/pycore_intrinsics.h \
$(srcdir)/Include/internal/pycore_jit.h \
$(srcdir)/Include/internal/pycore_list.h \
@@ -1366,6 +1369,7 @@ PYTHON_HEADERS= \
$(srcdir)/Include/internal/pycore_structseq.h \
$(srcdir)/Include/internal/pycore_symtable.h \
$(srcdir)/Include/internal/pycore_sysmodule.h \
+ $(srcdir)/Include/internal/pycore_template.h \
$(srcdir)/Include/internal/pycore_time.h \
$(srcdir)/Include/internal/pycore_token.h \
$(srcdir)/Include/internal/pycore_traceback.h \
@@ -2514,6 +2518,7 @@ LIBSUBDIRS= asyncio \
re \
site-packages \
sqlite3 \
+ string \
sysconfig \
tkinter \
tomllib \
diff --git a/Misc/NEWS.d/next/Build/2025-04-17-19-10-15.gh-issue-132649.DZqGoq.rst b/Misc/NEWS.d/next/Build/2025-04-17-19-10-15.gh-issue-132649.DZqGoq.rst
new file mode 100644
index 00000000000000..358d4b0f476db9
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2025-04-17-19-10-15.gh-issue-132649.DZqGoq.rst
@@ -0,0 +1,2 @@
+The :file:`PC\layout` script now allows passing ``--include-tcltk`` on
+Windows ARM64.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-09-20-49-04.gh-issue-132284.TxTNka.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-09-20-49-04.gh-issue-132284.TxTNka.rst
new file mode 100644
index 00000000000000..b63a75f1e7e058
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-09-20-49-04.gh-issue-132284.TxTNka.rst
@@ -0,0 +1 @@
+Don't wrap base ``PyCFunction`` slots on class creation if not overridden.
diff --git a/Modules/Setup b/Modules/Setup
index ef9cf80bbdb8eb..e033887b771f49 100644
--- a/Modules/Setup
+++ b/Modules/Setup
@@ -149,6 +149,7 @@ PYTHONPATH=$(COREPYTHONPATH)
#_socket socketmodule.c
#_statistics _statisticsmodule.c
#_struct _struct.c
+#_templatelib _templatelibmodule.c
#_types _typesmodule.c
#_typing _typingmodule.c
#_zoneinfo _zoneinfo.c
diff --git a/Modules/Setup.bootstrap.in b/Modules/Setup.bootstrap.in
index 2b2e8cb3e3cacd..ad44bf8b1e9cc6 100644
--- a/Modules/Setup.bootstrap.in
+++ b/Modules/Setup.bootstrap.in
@@ -26,6 +26,7 @@ time timemodule.c
_types _typesmodule.c
_typing _typingmodule.c
_weakref _weakref.c
+_templatelib _templatelibmodule.c
# commonly used core modules
_abc _abc.c
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 9858ec8e714dbb..5c25bff960e45f 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -4892,8 +4892,10 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
}
static PyObject *
-Array_item(PyObject *myself, Py_ssize_t index)
+Array_item_lock_held(PyObject *myself, Py_ssize_t index)
{
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
+
CDataObject *self = _CDataObject_CAST(myself);
Py_ssize_t offset, size;
@@ -4920,8 +4922,20 @@ Array_item(PyObject *myself, Py_ssize_t index)
}
static PyObject *
-Array_subscript(PyObject *myself, PyObject *item)
+Array_item(PyObject *myself, Py_ssize_t index)
{
+ PyObject *result;
+ Py_BEGIN_CRITICAL_SECTION(myself);
+ result = Array_item_lock_held(myself, index);
+ Py_END_CRITICAL_SECTION();
+ return result;
+}
+
+static PyObject *
+Array_subscript_lock_held(PyObject *myself, PyObject *item)
+{
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
+
CDataObject *self = _CDataObject_CAST(myself);
if (PyIndex_Check(item)) {
@@ -4931,7 +4945,7 @@ Array_subscript(PyObject *myself, PyObject *item)
return NULL;
if (i < 0)
i += self->b_length;
- return Array_item(myself, i);
+ return Array_item_lock_held(myself, i);
}
else if (PySlice_Check(item)) {
PyObject *proto;
@@ -4966,10 +4980,8 @@ Array_subscript(PyObject *myself, PyObject *item)
return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
if (step == 1) {
PyObject *res;
- Py_BEGIN_CRITICAL_SECTION(self);
res = PyBytes_FromStringAndSize(ptr + start,
slicelen);
- Py_END_CRITICAL_SECTION();
return res;
}
dest = (char *)PyMem_Malloc(slicelen);
@@ -4977,12 +4989,10 @@ Array_subscript(PyObject *myself, PyObject *item)
if (dest == NULL)
return PyErr_NoMemory();
- Py_BEGIN_CRITICAL_SECTION(self);
for (cur = start, i = 0; i < slicelen;
cur += step, i++) {
dest[i] = ptr[cur];
}
- Py_END_CRITICAL_SECTION();
np = PyBytes_FromStringAndSize(dest, slicelen);
PyMem_Free(dest);
@@ -4996,10 +5006,8 @@ Array_subscript(PyObject *myself, PyObject *item)
return Py_GetConstant(Py_CONSTANT_EMPTY_STR);
if (step == 1) {
PyObject *res;
- Py_BEGIN_CRITICAL_SECTION(self);
res = PyUnicode_FromWideChar(ptr + start,
slicelen);
- Py_END_CRITICAL_SECTION();
return res;
}
@@ -5009,12 +5017,10 @@ Array_subscript(PyObject *myself, PyObject *item)
return NULL;
}
- Py_BEGIN_CRITICAL_SECTION(self);
for (cur = start, i = 0; i < slicelen;
cur += step, i++) {
dest[i] = ptr[cur];
}
- Py_END_CRITICAL_SECTION();
np = PyUnicode_FromWideChar(dest, slicelen);
PyMem_Free(dest);
@@ -5027,7 +5033,7 @@ Array_subscript(PyObject *myself, PyObject *item)
for (cur = start, i = 0; i < slicelen;
cur += step, i++) {
- PyObject *v = Array_item(myself, cur);
+ PyObject *v = Array_item_lock_held(myself, cur);
if (v == NULL) {
Py_DECREF(np);
return NULL;
@@ -5041,12 +5047,24 @@ Array_subscript(PyObject *myself, PyObject *item)
"indices must be integers");
return NULL;
}
+}
+
+static PyObject *
+Array_subscript(PyObject *myself, PyObject *item)
+{
+ PyObject *result;
+ Py_BEGIN_CRITICAL_SECTION(myself);
+ result = Array_subscript_lock_held(myself, item);
+ Py_END_CRITICAL_SECTION();
+ return result;
}
static int
-Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
+Array_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
{
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
+
CDataObject *self = _CDataObject_CAST(myself);
Py_ssize_t size, offset;
char *ptr;
@@ -5078,7 +5096,18 @@ Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
}
static int
-Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
+Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
+{
+ int result;
+ Py_BEGIN_CRITICAL_SECTION(myself);
+ result = Array_ass_item_lock_held(myself, index, value);
+ Py_END_CRITICAL_SECTION();
+ return result;
+}
+
+
+static int
+Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
{
CDataObject *self = _CDataObject_CAST(myself);
@@ -5095,7 +5124,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
return -1;
if (i < 0)
i += self->b_length;
- return Array_ass_item(myself, i, value);
+ return Array_ass_item_lock_held(myself, i, value);
}
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelen, otherlen, i;
@@ -5120,7 +5149,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
int result;
if (item == NULL)
return -1;
- result = Array_ass_item(myself, cur, item);
+ result = Array_ass_item_lock_held(myself, cur, item);
Py_DECREF(item);
if (result == -1)
return -1;
@@ -5134,6 +5163,17 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
}
}
+static int
+Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
+{
+ int result;
+ Py_BEGIN_CRITICAL_SECTION(myself);
+ result = Array_ass_subscript_lock_held(myself, item, value);
+ Py_END_CRITICAL_SECTION();
+ return result;
+}
+
+
static Py_ssize_t
Array_length(PyObject *myself)
{
diff --git a/Modules/_templatelibmodule.c b/Modules/_templatelibmodule.c
new file mode 100644
index 00000000000000..3911bb4550cd11
--- /dev/null
+++ b/Modules/_templatelibmodule.c
@@ -0,0 +1,38 @@
+/* interpreter-internal types for string.templatelib */
+
+#include "Python.h"
+#include "pycore_interpolation.h" // _PyInterpolation_Type
+#include "pycore_template.h" // _PyTemplate_Type
+
+static int
+_templatelib_exec(PyObject *m)
+{
+ if (PyModule_AddObjectRef(m, "Template", (PyObject *)&_PyTemplate_Type) < 0) {
+ return -1;
+ }
+ if (PyModule_AddObjectRef(m, "Interpolation", (PyObject *)&_PyInterpolation_Type) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+static struct PyModuleDef_Slot _templatelib_slots[] = {
+ {Py_mod_exec, _templatelib_exec},
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
+ {0, NULL}
+};
+
+static struct PyModuleDef _templatemodule = {
+ .m_base = PyModuleDef_HEAD_INIT,
+ .m_name = "_templatelib",
+ .m_doc = "Interpreter types for template string literals (t-strings).",
+ .m_size = 0,
+ .m_slots = _templatelib_slots,
+};
+
+PyMODINIT_FUNC
+PyInit__templatelib(void)
+{
+ return PyModuleDef_Init(&_templatemodule);
+}
diff --git a/Objects/clinic/interpolationobject.c.h b/Objects/clinic/interpolationobject.c.h
new file mode 100644
index 00000000000000..7a94dabafc92f2
--- /dev/null
+++ b/Objects/clinic/interpolationobject.c.h
@@ -0,0 +1,89 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+# include "pycore_gc.h" // PyGC_Head
+# include "pycore_runtime.h" // _Py_ID()
+#endif
+#include "pycore_modsupport.h" // _PyArg_UnpackKeywords()
+
+static PyObject *
+interpolation_new_impl(PyTypeObject *type, PyObject *value,
+ PyObject *expression, PyObject *conversion,
+ PyObject *format_spec);
+
+static PyObject *
+interpolation_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 4
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ Py_hash_t ob_hash;
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_hash = -1,
+ .ob_item = { &_Py_ID(value), &_Py_ID(expression), &_Py_ID(conversion), &_Py_ID(format_spec), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"value", "expression", "conversion", "format_spec", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "Interpolation",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[4];
+ PyObject * const *fastargs;
+ Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+ Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2;
+ PyObject *value;
+ PyObject *expression;
+ PyObject *conversion = Py_None;
+ PyObject *format_spec = &_Py_STR(empty);
+
+ fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
+ /*minpos*/ 2, /*maxpos*/ 4, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
+ if (!fastargs) {
+ goto exit;
+ }
+ value = fastargs[0];
+ if (!PyUnicode_Check(fastargs[1])) {
+ _PyArg_BadArgument("Interpolation", "argument 'expression'", "str", fastargs[1]);
+ goto exit;
+ }
+ expression = fastargs[1];
+ if (!noptargs) {
+ goto skip_optional_pos;
+ }
+ if (fastargs[2]) {
+ if (!_conversion_converter(fastargs[2], &conversion)) {
+ goto exit;
+ }
+ if (!--noptargs) {
+ goto skip_optional_pos;
+ }
+ }
+ if (!PyUnicode_Check(fastargs[3])) {
+ _PyArg_BadArgument("Interpolation", "argument 'format_spec'", "str", fastargs[3]);
+ goto exit;
+ }
+ format_spec = fastargs[3];
+skip_optional_pos:
+ return_value = interpolation_new_impl(type, value, expression, conversion, format_spec);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=599742a5ccd6f060 input=a9049054013a1b77]*/
diff --git a/Objects/interpolationobject.c b/Objects/interpolationobject.c
new file mode 100644
index 00000000000000..5bc8b424d494c7
--- /dev/null
+++ b/Objects/interpolationobject.c
@@ -0,0 +1,217 @@
+/* t-string Interpolation object implementation */
+
+#include "Python.h"
+#include "pycore_initconfig.h" // _PyStatus_OK
+#include "pycore_interpolation.h"
+
+static int
+_conversion_converter(PyObject *arg, PyObject **conversion)
+{
+ if (arg == Py_None) {
+ return 1;
+ }
+
+ if (!PyUnicode_Check(arg)) {
+ PyErr_Format(PyExc_TypeError,
+ "%.200s() %.200s must be %.50s, not %.50s",
+ "Interpolation", "argument 'conversion'", "str",
+ arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
+ return 0;
+ }
+
+ Py_ssize_t len;
+ const char *conv_str = PyUnicode_AsUTF8AndSize(arg, &len);
+ if (len != 1 || !(conv_str[0] == 'a' || conv_str[0] == 'r' || conv_str[0] == 's')) {
+ PyErr_SetString(PyExc_ValueError,
+ "Interpolation() argument 'conversion' must be one of 's', 'a' or 'r'");
+ return 0;
+ }
+
+ *conversion = arg;
+ return 1;
+}
+
+#include "clinic/interpolationobject.c.h"
+
+/*[clinic input]
+class Interpolation "interpolationobject *" "&_PyInterpolation_Type"
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=161c64a16f9c4544]*/
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *value;
+ PyObject *expression;
+ PyObject *conversion;
+ PyObject *format_spec;
+} interpolationobject;
+
+/*[clinic input]
+@classmethod
+Interpolation.__new__ as interpolation_new
+
+ value: object
+ expression: object(subclass_of='&PyUnicode_Type')
+ conversion: object(converter='_conversion_converter') = None
+ format_spec: object(subclass_of='&PyUnicode_Type', c_default='&_Py_STR(empty)') = ""
+[clinic start generated code]*/
+
+static PyObject *
+interpolation_new_impl(PyTypeObject *type, PyObject *value,
+ PyObject *expression, PyObject *conversion,
+ PyObject *format_spec)
+/*[clinic end generated code: output=6488e288765bc1a9 input=d91711024068528c]*/
+{
+ interpolationobject *self = (interpolationobject *) type->tp_alloc(type, 0);
+ if (!self) {
+ return NULL;
+ }
+
+ self->value = Py_NewRef(value);
+ self->expression = Py_NewRef(expression);
+ self->conversion = Py_NewRef(conversion);
+ self->format_spec = Py_NewRef(format_spec);
+ return (PyObject *) self;
+}
+
+static void
+interpolation_dealloc(interpolationobject *self)
+{
+ PyObject_GC_UnTrack(self);
+ Py_CLEAR(self->value);
+ Py_CLEAR(self->expression);
+ Py_CLEAR(self->conversion);
+ Py_CLEAR(self->format_spec);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+interpolation_traverse(interpolationobject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->value);
+ Py_VISIT(self->expression);
+ Py_VISIT(self->conversion);
+ Py_VISIT(self->format_spec);
+ return 0;
+}
+
+static PyObject *
+interpolation_repr(interpolationobject *self)
+{
+ return PyUnicode_FromFormat("%s(%R, %R, %R, %R)",
+ _PyType_Name(Py_TYPE(self)),
+ self->value, self->expression,
+ self->conversion, self->format_spec);
+}
+
+static PyMemberDef interpolation_members[] = {
+ {"value", Py_T_OBJECT_EX, offsetof(interpolationobject, value), Py_READONLY, "Value"},
+ {"expression", Py_T_OBJECT_EX, offsetof(interpolationobject, expression), Py_READONLY, "Expression"},
+ {"conversion", Py_T_OBJECT_EX, offsetof(interpolationobject, conversion), Py_READONLY, "Conversion"},
+ {"format_spec", Py_T_OBJECT_EX, offsetof(interpolationobject, format_spec), Py_READONLY, "Format specifier"},
+ {NULL}
+};
+
+PyTypeObject _PyInterpolation_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "string.templatelib.Interpolation",
+ .tp_doc = PyDoc_STR("Interpolation object"),
+ .tp_basicsize = sizeof(interpolationobject),
+ .tp_itemsize = 0,
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+ .tp_new = (newfunc) interpolation_new,
+ .tp_alloc = PyType_GenericAlloc,
+ .tp_dealloc = (destructor) interpolation_dealloc,
+ .tp_free = PyObject_GC_Del,
+ .tp_repr = (reprfunc) interpolation_repr,
+ .tp_members = interpolation_members,
+ .tp_traverse = (traverseproc) interpolation_traverse,
+};
+
+static PyObject *
+_get_match_args(void)
+{
+ PyObject *value = NULL, *expression = NULL, *conversion = NULL, *format_spec = NULL;
+ PyObject *tuple = NULL;
+
+ value = PyUnicode_FromString("value");
+ if (!value) {
+ goto error;
+ }
+ expression = PyUnicode_FromString("expression");
+ if (!expression) {
+ goto error;
+ }
+ conversion = PyUnicode_FromString("conversion");
+ if (!conversion) {
+ goto error;
+ }
+ format_spec = PyUnicode_FromString("format_spec");
+ if (!format_spec) {
+ goto error;
+ }
+
+ tuple = PyTuple_Pack(4, value, expression, conversion, format_spec);
+
+error:
+ Py_XDECREF(value);
+ Py_XDECREF(expression);
+ Py_XDECREF(conversion);
+ Py_XDECREF(format_spec);
+ return tuple;
+
+}
+
+PyStatus
+_PyInterpolation_InitTypes(PyInterpreterState *interp)
+{
+ PyObject *tuple = _get_match_args();
+ if (!tuple) {
+ goto error;
+ }
+
+ int status = PyDict_SetItemString(_PyType_GetDict(&_PyInterpolation_Type),
+ "__match_args__",
+ tuple);
+ Py_DECREF(tuple);
+
+ if (status < 0) {
+ goto error;
+ }
+ return _PyStatus_OK();
+
+error:
+ return _PyStatus_ERR("Can't initialize interpolation types");
+}
+
+PyObject *
+_PyInterpolation_FromStackRefStealOnSuccess(_PyStackRef *values)
+{
+ interpolationobject *interpolation = (interpolationobject *) _PyInterpolation_Type.tp_alloc(&_PyInterpolation_Type, 0);
+ if (!interpolation) {
+ return NULL;
+ }
+
+ interpolation->value = PyStackRef_AsPyObjectSteal(values[0]);
+ interpolation->expression = PyStackRef_AsPyObjectSteal(values[1]);
+
+ if (PyStackRef_IsNull(values[2])) {
+ interpolation->conversion = Py_NewRef(Py_None);
+ } else {
+ interpolation->conversion = PyStackRef_AsPyObjectSteal(values[2]);
+ }
+
+ if (PyStackRef_IsNull(values[3])) {
+ interpolation->format_spec = Py_NewRef(&_Py_STR(empty));
+ } else {
+ interpolation->format_spec = PyStackRef_AsPyObjectSteal(values[3]);
+ }
+
+ return (PyObject *) interpolation;
+}
+
+PyObject *
+_PyInterpolation_GetValue(PyObject *interpolation)
+{
+ return ((interpolationobject *) interpolation)->value;
+}
diff --git a/Objects/object.c b/Objects/object.c
index 99bb1d9c0bfad5..a33a4267d62d65 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -15,6 +15,7 @@
#include "pycore_hamt.h" // _PyHamtItems_Type
#include "pycore_initconfig.h" // _PyStatus_OK()
#include "pycore_instruction_sequence.h" // _PyInstructionSequence_Type
+#include "pycore_interpolation.h" // _PyInterpolation_Type
#include "pycore_list.h" // _PyList_DebugMallocStats()
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_memoryobject.h" // _PyManagedBuffer_Type
@@ -25,6 +26,7 @@
#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_symtable.h" // PySTEntry_Type
+#include "pycore_template.h" // _PyTemplate_Type _PyTemplateIter_Type
#include "pycore_tuple.h" // _PyTuple_DebugMallocStats()
#include "pycore_typeobject.h" // _PyBufferWrapper_Type
#include "pycore_typevarobject.h" // _PyTypeAlias_Type
@@ -2409,6 +2411,7 @@ static PyTypeObject* static_types[] = {
&_PyHamt_CollisionNode_Type,
&_PyHamt_Type,
&_PyInstructionSequence_Type,
+ &_PyInterpolation_Type,
&_PyLegacyEventHandler_Type,
&_PyLineIterator,
&_PyManagedBuffer_Type,
@@ -2418,6 +2421,8 @@ static PyTypeObject* static_types[] = {
&_PyNone_Type,
&_PyNotImplemented_Type,
&_PyPositionsIterator,
+ &_PyTemplate_Type,
+ &_PyTemplateIter_Type,
&_PyUnicodeASCIIIter_Type,
&_PyUnion_Type,
#ifdef _Py_TIER2
diff --git a/Objects/templateobject.c b/Objects/templateobject.c
new file mode 100644
index 00000000000000..8d2fa7b4af9305
--- /dev/null
+++ b/Objects/templateobject.c
@@ -0,0 +1,506 @@
+/* t-string Template object implementation */
+
+#include "Python.h"
+#include "pycore_interpolation.h" // _PyInterpolation_Check()
+#include "pycore_template.h"
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *stringsiter;
+ PyObject *interpolationsiter;
+ int from_strings;
+} templateiterobject;
+
+static PyObject *
+templateiter_next(templateiterobject *self)
+{
+ PyObject *item;
+ if (self->from_strings) {
+ item = PyIter_Next(self->stringsiter);
+ self->from_strings = 0;
+ if (PyUnicode_GET_LENGTH(item) == 0) {
+ Py_SETREF(item, PyIter_Next(self->interpolationsiter));
+ self->from_strings = 1;
+ }
+ } else {
+ item = PyIter_Next(self->interpolationsiter);
+ self->from_strings = 1;
+ }
+ return item;
+}
+
+static void
+templateiter_dealloc(templateiterobject *self)
+{
+ PyObject_GC_UnTrack(self);
+ Py_CLEAR(self->stringsiter);
+ Py_CLEAR(self->interpolationsiter);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+templateiter_traverse(templateiterobject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->stringsiter);
+ Py_VISIT(self->interpolationsiter);
+ return 0;
+}
+
+PyTypeObject _PyTemplateIter_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "string.templatelib.TemplateIter",
+ .tp_doc = PyDoc_STR("Template iterator object"),
+ .tp_basicsize = sizeof(templateiterobject),
+ .tp_itemsize = 0,
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+ .tp_alloc = PyType_GenericAlloc,
+ .tp_dealloc = (destructor) templateiter_dealloc,
+ .tp_free = PyObject_GC_Del,
+ .tp_traverse = (traverseproc) templateiter_traverse,
+ .tp_iter = PyObject_SelfIter,
+ .tp_iternext = (iternextfunc) templateiter_next,
+};
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *strings;
+ PyObject *interpolations;
+} templateobject;
+
+static templateobject *
+template_from_strings_interpolations(PyTypeObject *type, PyObject *strings, PyObject *interpolations)
+{
+ templateobject *template = (templateobject *) type->tp_alloc(type, 0);
+ if (template == NULL) {
+ return NULL;
+ }
+
+ template->strings = Py_NewRef(strings);
+ template->interpolations = Py_NewRef(interpolations);
+ return template;
+}
+
+static templateobject *
+template_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ if (kwds != NULL) {
+ PyErr_SetString(PyExc_TypeError, "Template.__new__ only accepts *args arguments");
+ return NULL;
+ }
+
+ Py_ssize_t argslen = PyTuple_GET_SIZE(args);
+ Py_ssize_t stringslen = 0;
+ Py_ssize_t interpolationslen = 0;
+ int last_was_str = 0;
+
+ for (Py_ssize_t i = 0; i < argslen; i++) {
+ PyObject *item = PyTuple_GET_ITEM(args, i);
+ if (PyUnicode_Check(item)) {
+ if (!last_was_str) {
+ stringslen++;
+ }
+ last_was_str = 1;
+ }
+ else if (_PyInterpolation_Check(item)) {
+ if (!last_was_str) {
+ stringslen++;
+ }
+ interpolationslen++;
+ last_was_str = 0;
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "Template.__new__ *args need to be of type 'str' or 'Interpolation'");
+ return NULL;
+ }
+ }
+ if (!last_was_str) {
+ stringslen++;
+ }
+
+ PyObject *strings = PyTuple_New(stringslen);
+ if (!strings) {
+ return NULL;
+ }
+
+ PyObject *interpolations = PyTuple_New(interpolationslen);
+ if (!interpolations) {
+ Py_DECREF(strings);
+ return NULL;
+ }
+
+ last_was_str = 0;
+ Py_ssize_t stringsidx = 0, interpolationsidx = 0;
+ for (Py_ssize_t i = 0; i < argslen; i++) {
+ PyObject *item = PyTuple_GET_ITEM(args, i);
+ if (PyUnicode_Check(item)) {
+ if (last_was_str) {
+ PyObject *laststring = PyTuple_GET_ITEM(strings, stringsidx - 1);
+ PyObject *concat = PyUnicode_Concat(laststring, item);
+ Py_DECREF(laststring);
+ if (!concat) {
+ Py_DECREF(strings);
+ Py_DECREF(interpolations);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(strings, stringsidx - 1, concat);
+ }
+ else {
+ PyTuple_SET_ITEM(strings, stringsidx++, Py_NewRef(item));
+ }
+ last_was_str = 1;
+ }
+ else if (_PyInterpolation_Check(item)) {
+ if (!last_was_str) {
+ PyTuple_SET_ITEM(strings, stringsidx++, &_Py_STR(empty));
+ }
+ PyTuple_SET_ITEM(interpolations, interpolationsidx++, Py_NewRef(item));
+ last_was_str = 0;
+ }
+ }
+ if (!last_was_str) {
+ PyTuple_SET_ITEM(strings, stringsidx++, &_Py_STR(empty));
+ }
+
+ templateobject *template = template_from_strings_interpolations(type, strings, interpolations);
+ Py_DECREF(strings);
+ Py_DECREF(interpolations);
+ return template;
+}
+
+static void
+template_dealloc(templateobject *self)
+{
+ PyObject_GC_UnTrack(self);
+ Py_CLEAR(self->strings);
+ Py_CLEAR(self->interpolations);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+template_traverse(templateobject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->strings);
+ Py_VISIT(self->interpolations);
+ return 0;
+}
+
+static PyObject *
+template_repr(templateobject *self)
+{
+ return PyUnicode_FromFormat("%s(strings=%R, interpolations=%R)",
+ _PyType_Name(Py_TYPE(self)),
+ self->strings,
+ self->interpolations);
+}
+
+static templateiterobject *
+template_iter(templateobject *self)
+{
+ templateiterobject *iter = PyObject_GC_New(templateiterobject, &_PyTemplateIter_Type);
+ if (iter == NULL) {
+ return NULL;
+ }
+
+ PyObject *stringsiter = PyObject_GetIter(self->strings);
+ if (stringsiter == NULL) {
+ Py_DECREF(iter);
+ return NULL;
+ }
+
+ PyObject *interpolationsiter = PyObject_GetIter(self->interpolations);
+ if (interpolationsiter == NULL) {
+ Py_DECREF(iter);
+ Py_DECREF(stringsiter);
+ return NULL;
+ }
+
+ iter->stringsiter = stringsiter;
+ iter->interpolationsiter = interpolationsiter;
+ iter->from_strings = 1;
+ PyObject_GC_Track(iter);
+ return iter;
+}
+
+static PyObject *
+template_interpolations_copy(PyObject *interpolations) {
+ Py_ssize_t interpolationslen = PyTuple_GET_SIZE(interpolations);
+ PyObject *newinterpolations = PyTuple_New(interpolationslen);
+ if (!newinterpolations) {
+ return NULL;
+ }
+
+ for (Py_ssize_t i = 0; i < interpolationslen; i++) {
+ PyTuple_SET_ITEM(newinterpolations, i, Py_NewRef(PyTuple_GET_ITEM(interpolations, i)));
+ }
+ return newinterpolations;
+}
+
+static PyObject *
+template_interpolations_concat(PyObject *left, PyObject *right) {
+ Py_ssize_t leftlen = PyTuple_GET_SIZE(left);
+ Py_ssize_t rightlen = PyTuple_GET_SIZE(right);
+ Py_ssize_t interpolationslen = leftlen + rightlen;
+
+ PyObject *newinterpolations = PyTuple_New(interpolationslen);
+ if (!newinterpolations) {
+ return NULL;
+ }
+
+ Py_ssize_t index = 0;
+ for (Py_ssize_t i = 0; i < leftlen; i++) {
+ PyTuple_SET_ITEM(newinterpolations, index++, Py_NewRef(PyTuple_GET_ITEM(left, i)));
+ }
+ for (Py_ssize_t i = 0; i < rightlen; i++) {
+ PyTuple_SET_ITEM(newinterpolations, index++, Py_NewRef(PyTuple_GET_ITEM(right, i)));
+ }
+ return newinterpolations;
+}
+
+static PyObject *
+template_strings_append_str(PyObject *strings, PyObject *str)
+{
+ Py_ssize_t stringslen = PyTuple_GET_SIZE(strings);
+ PyObject *string = PyTuple_GET_ITEM(strings, stringslen - 1);
+ PyObject *concat = PyUnicode_Concat(string, str);
+ if (concat == NULL) {
+ return NULL;
+ }
+
+ PyObject *newstrings = PyTuple_New(stringslen);
+ if (newstrings == NULL) {
+ Py_DECREF(concat);
+ return NULL;
+ }
+
+ for (Py_ssize_t i = 0; i < stringslen - 1; i++) {
+ PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i)));
+ }
+ PyTuple_SET_ITEM(newstrings, stringslen - 1, concat);
+
+ return newstrings;
+}
+
+static PyObject *
+template_strings_prepend_str(PyObject *strings, PyObject *str)
+{
+ Py_ssize_t stringslen = PyTuple_GET_SIZE(strings);
+ PyObject *string = PyTuple_GET_ITEM(strings, 0);
+ PyObject *concat = PyUnicode_Concat(str, string);
+ if (concat == NULL) {
+ return NULL;
+ }
+
+ PyObject *newstrings = PyTuple_New(stringslen);
+ if (newstrings == NULL) {
+ Py_DECREF(concat);
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(newstrings, 0, concat);
+ for (Py_ssize_t i = 1; i < stringslen; i++) {
+ PyTuple_SET_ITEM(newstrings, i, Py_NewRef(PyTuple_GET_ITEM(strings, i)));
+ }
+
+ return newstrings;
+}
+
+static PyObject *
+template_strings_concat(PyObject *left, PyObject *right)
+{
+ Py_ssize_t left_stringslen = PyTuple_GET_SIZE(left);
+ PyObject *left_laststring = PyTuple_GET_ITEM(left, left_stringslen - 1);
+ Py_ssize_t right_stringslen = PyTuple_GET_SIZE(right);
+ PyObject *right_firststring = PyTuple_GET_ITEM(right, 0);
+
+ PyObject *concat = PyUnicode_Concat(left_laststring, right_firststring);
+ if (concat == NULL) {
+ return NULL;
+ }
+
+ PyObject *newstrings = PyTuple_New(left_stringslen + right_stringslen - 1);
+ if (newstrings == NULL) {
+ Py_DECREF(concat);
+ return NULL;
+ }
+
+ Py_ssize_t index = 0;
+ for (Py_ssize_t i = 0; i < left_stringslen - 1; i++) {
+ PyTuple_SET_ITEM(newstrings, index++, Py_NewRef(PyTuple_GET_ITEM(left, i)));
+ }
+ PyTuple_SET_ITEM(newstrings, index++, concat);
+ for (Py_ssize_t i = 1; i < right_stringslen; i++) {
+ PyTuple_SET_ITEM(newstrings, index++, Py_NewRef(PyTuple_GET_ITEM(right, i)));
+ }
+
+ return newstrings;
+}
+
+static PyObject *
+template_concat_templates(templateobject *self, templateobject *other)
+{
+ PyObject *newstrings = template_strings_concat(self->strings, other->strings);
+ if (newstrings == NULL) {
+ return NULL;
+ }
+
+ PyObject *newinterpolations = template_interpolations_concat(self->interpolations, other->interpolations);
+ if (newinterpolations == NULL) {
+ Py_DECREF(newstrings);
+ return NULL;
+ }
+
+ templateobject *newtemplate = template_from_strings_interpolations(Py_TYPE(self), newstrings, newinterpolations);
+ Py_DECREF(newstrings);
+ Py_DECREF(newinterpolations);
+ return (PyObject *) newtemplate;
+}
+
+static PyObject *
+template_concat_template_str(templateobject *self, PyObject *other)
+{
+ PyObject *newstrings = template_strings_append_str(self->strings, other);
+ if (newstrings == NULL) {
+ return NULL;
+ }
+
+ PyObject *newinterpolations = template_interpolations_copy(self->interpolations);
+ if (newinterpolations == NULL) {
+ Py_DECREF(newstrings);
+ return NULL;
+ }
+
+ templateobject *newtemplate = template_from_strings_interpolations(Py_TYPE(self), newstrings, newinterpolations);
+ Py_DECREF(newstrings);
+ Py_DECREF(newinterpolations);
+ return (PyObject *) newtemplate;
+}
+
+static PyObject *
+template_concat_str_template(templateobject *self, PyObject *other)
+{
+ PyObject *newstrings = template_strings_prepend_str(self->strings, other);
+ if (newstrings == NULL) {
+ return NULL;
+ }
+
+ PyObject *newinterpolations = template_interpolations_copy(self->interpolations);
+ if (newinterpolations == NULL) {
+ Py_DECREF(newstrings);
+ return NULL;
+ }
+
+ templateobject *newtemplate = template_from_strings_interpolations(Py_TYPE(self), newstrings, newinterpolations);
+ Py_DECREF(newstrings);
+ Py_DECREF(newinterpolations);
+ return (PyObject *) newtemplate;
+}
+
+PyObject *
+_PyTemplate_Concat(PyObject *self, PyObject *other)
+{
+ if (_PyTemplate_Check(self) && _PyTemplate_Check(other)) {
+ return template_concat_templates((templateobject *) self, (templateobject *) other);
+ }
+ else if ((_PyTemplate_Check(self)) && PyUnicode_Check(other)) {
+ return template_concat_template_str((templateobject *) self, other);
+ }
+ else if (PyUnicode_Check(self) && (_PyTemplate_Check(other))) {
+ return template_concat_str_template((templateobject *) other, self);
+ }
+ else {
+ Py_RETURN_NOTIMPLEMENTED;
+ }
+}
+
+static PyObject *
+template_values_get(templateobject *self, void *Py_UNUSED(data))
+{
+ PyObject *values = PyTuple_New(PyTuple_GET_SIZE(self->interpolations));
+ if (values == NULL) {
+ return NULL;
+ }
+
+ PyObject *interpolationsiter = PyObject_GetIter(self->interpolations);
+ if (interpolationsiter == NULL) {
+ Py_DECREF(values);
+ return NULL;
+ }
+
+ PyObject *item;
+ Py_ssize_t index = 0;
+ while ((item = PyIter_Next(interpolationsiter))) {
+ PyTuple_SET_ITEM(values, index++, Py_NewRef(_PyInterpolation_GetValue(item)));
+ Py_DECREF(item);
+ }
+
+ Py_DECREF(interpolationsiter);
+ if (PyErr_Occurred()) {
+ Py_DECREF(values);
+ return NULL;
+ }
+ return values;
+}
+
+static PyMemberDef template_members[] = {
+ {"strings", Py_T_OBJECT_EX, offsetof(templateobject, strings), Py_READONLY, "Strings"},
+ {"interpolations", Py_T_OBJECT_EX, offsetof(templateobject, interpolations), Py_READONLY, "Interpolations"},
+ {NULL},
+};
+
+static PyGetSetDef template_getset[] = {
+ {"values", (getter) template_values_get, NULL, "Values of interpolations", NULL},
+ {NULL},
+};
+
+static PySequenceMethods template_as_sequence = {
+ .sq_concat = _PyTemplate_Concat,
+};
+
+PyTypeObject _PyTemplate_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ .tp_name = "string.templatelib.Template",
+ .tp_doc = PyDoc_STR("Template object"),
+ .tp_basicsize = sizeof(templateobject),
+ .tp_itemsize = 0,
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
+ .tp_as_sequence = &template_as_sequence,
+ .tp_new = (newfunc) template_new,
+ .tp_alloc = PyType_GenericAlloc,
+ .tp_dealloc = (destructor) template_dealloc,
+ .tp_free = PyObject_GC_Del,
+ .tp_repr = (reprfunc) template_repr,
+ .tp_members = template_members,
+ .tp_getset = template_getset,
+ .tp_iter = (getiterfunc) template_iter,
+ .tp_traverse = (traverseproc) template_traverse,
+};
+
+PyObject *
+_PyTemplate_FromValues(PyObject **values, Py_ssize_t oparg)
+{
+ PyObject *tuple = PyTuple_New(oparg);
+ if (!tuple) {
+ return NULL;
+ }
+
+ for (Py_ssize_t i = 0; i < oparg; i++) {
+ PyTuple_SET_ITEM(tuple, i, Py_NewRef(values[i]));
+ }
+
+ PyObject *template = (PyObject *) template_new(&_PyTemplate_Type, tuple, NULL);
+ Py_DECREF(tuple);
+ return template;
+}
+
+PyObject *
+_PyTemplate_FromList(PyObject *list)
+{
+ PyObject *tuple = PyList_AsTuple(list);
+ if (!tuple) {
+ return NULL;
+ }
+
+ PyObject *template = (PyObject *) template_new(&_PyTemplate_Type, tuple, NULL);
+ Py_DECREF(tuple);
+ return template;
+}
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index f65695360a7483..982f41fd47f92c 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -11233,7 +11233,14 @@ update_one_slot(PyTypeObject *type, pytype_slotdef *p)
}
else {
use_generic = 1;
- generic = p->function;
+ if (generic == NULL && Py_IS_TYPE(descr, &PyMethodDescr_Type) &&
+ *ptr == ((PyMethodDescrObject *)descr)->d_method->ml_meth)
+ {
+ generic = *ptr;
+ }
+ else {
+ generic = p->function;
+ }
if (p->function == slot_tp_call) {
/* A generic __call__ is incompatible with vectorcall */
type_clear_flags(type, Py_TPFLAGS_HAVE_VECTORCALL);
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 7c735685e89389..38b33218ef694f 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -56,6 +56,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "pycore_pyhash.h" // _Py_HashSecret_t
#include "pycore_pylifecycle.h" // _Py_SetFileSystemEncoding()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
+#include "pycore_template.h" // _PyTemplate_Type
#include "pycore_tuple.h" // _PyTuple_FromArray()
#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI
#include "pycore_unicodeobject.h" // struct _Py_unicode_state
@@ -11617,10 +11618,16 @@ PyUnicode_Concat(PyObject *left, PyObject *right)
return NULL;
if (!PyUnicode_Check(right)) {
- PyErr_Format(PyExc_TypeError,
- "can only concatenate str (not \"%.200s\") to str",
- Py_TYPE(right)->tp_name);
- return NULL;
+ if (_PyTemplate_Check(right)) {
+ // str + tstring is implemented in the tstring type
+ return _PyTemplate_Concat(left, right);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "can only concatenate str (not \"%.200s\") to str",
+ Py_TYPE(right)->tp_name);
+ return NULL;
+ }
}
/* Shortcuts */
diff --git a/PC/config.c b/PC/config.c
index 6ce2131c7b84d0..e09ad0db2ef5ee 100644
--- a/PC/config.c
+++ b/PC/config.c
@@ -19,6 +19,7 @@ extern PyObject* PyInit__operator(void);
extern PyObject* PyInit__signal(void);
extern PyObject* PyInit__statistics(void);
extern PyObject* PyInit__sysconfig(void);
+extern PyObject* PyInit__templatelib(void);
extern PyObject* PyInit__types(void);
extern PyObject* PyInit__typing(void);
extern PyObject* PyInit_time(void);
@@ -106,6 +107,7 @@ struct _inittab _PyImport_Inittab[] = {
{"_signal", PyInit__signal},
{"_sysconfig", PyInit__sysconfig},
{"time", PyInit_time},
+ {"_templatelib", PyInit__templatelib},
{"_thread", PyInit__thread},
{"_tokenize", PyInit__tokenize},
{"_types", PyInit__types},
diff --git a/PC/layout/main.py b/PC/layout/main.py
index 8bd435456c635a..6321c33b3f780a 100644
--- a/PC/layout/main.py
+++ b/PC/layout/main.py
@@ -657,7 +657,7 @@ def main():
if ns.arch not in ("win32", "amd64", "arm32", "arm64"):
log_error("--arch is not a valid value (win32, amd64, arm32, arm64)")
return 4
- if ns.arch in ("arm32", "arm64"):
+ if ns.arch == "arm32":
for n in ("include_idle", "include_tcltk"):
if getattr(ns, n):
log_warning(f"Disabling --{n.replace('_', '-')} on unsupported platform")
diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj
index 59d664dc1745c1..1f3f3170f3fa48 100644
--- a/PCbuild/_freeze_module.vcxproj
+++ b/PCbuild/_freeze_module.vcxproj
@@ -143,6 +143,7 @@
+
@@ -158,6 +159,7 @@
+
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index ce9b056ac2561c..d101a0b9ebba0b 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -264,6 +264,7 @@
+
@@ -310,6 +311,7 @@
+
@@ -482,6 +484,7 @@
+
@@ -528,6 +531,7 @@
+
@@ -543,6 +547,7 @@
+
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
index 2c2eac85941f70..8fcb11f0bfd713 100644
--- a/PCbuild/pythoncore.vcxproj.filters
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -708,6 +708,9 @@
Include\internal
+
+ Include\internal
+
Include\cpython
@@ -840,6 +843,9 @@
Include\internal
+
+ Include\internal
+
Include\internal
@@ -998,6 +1004,9 @@
Modules
+
+ Modules
+
Modules
diff --git a/Parser/Python.asdl b/Parser/Python.asdl
index 80776ffe449393..0be4efc6687b90 100644
--- a/Parser/Python.asdl
+++ b/Parser/Python.asdl
@@ -78,7 +78,9 @@ module Python
| Compare(expr left, cmpop* ops, expr* comparators)
| Call(expr func, expr* args, keyword* keywords)
| FormattedValue(expr value, int conversion, expr? format_spec)
+ | Interpolation(expr value, constant str, constant? conversion, expr? format_spec)
| JoinedStr(expr* values)
+ | TemplateStr(expr* values)
| Constant(constant value, string? kind)
-- the following expression can appear in assignment context
diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c
index b72a69c242328a..1c63b97dac4670 100644
--- a/Parser/action_helpers.c
+++ b/Parser/action_helpers.c
@@ -965,9 +965,21 @@ _PyPegen_check_fstring_conversion(Parser *p, Token* conv_token, expr_ty conv)
if (conv_token->lineno != conv->lineno || conv_token->end_col_offset != conv->col_offset) {
return RAISE_SYNTAX_ERROR_KNOWN_RANGE(
conv_token, conv,
- "f-string: conversion type must come right after the exclamanation mark"
+ "%c-string: conversion type must come right after the exclamanation mark",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f'
);
}
+
+ Py_UCS4 first = PyUnicode_READ_CHAR(conv->v.Name.id, 0);
+ if (PyUnicode_GET_LENGTH(conv->v.Name.id) > 1 ||
+ !(first == 's' || first == 'r' || first == 'a')) {
+ RAISE_SYNTAX_ERROR_KNOWN_LOCATION(conv,
+ "%c-string: invalid conversion character %R: expected 's', 'r', or 'a'",
+ TOK_GET_MODE(p->tok)->tstring ? 't' : 'f',
+ conv->v.Name.id);
+ return NULL;
+ }
+
return result_token_with_metadata(p, conv, conv_token->metadata);
}
@@ -1070,6 +1082,9 @@ _PyPegen_get_expr_name(expr_ty e)
case JoinedStr_kind:
case FormattedValue_kind:
return "f-string expression";
+ case TemplateStr_kind:
+ case Interpolation_kind:
+ return "t-string expression";
case Constant_kind: {
PyObject *value = e->v.Constant.value;
if (value == Py_None) {
@@ -1279,20 +1294,13 @@ _PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant, Token* tok
p->arena);
}
-expr_ty
-_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b) {
-
- /* 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 n_items = asdl_seq_LEN(expr);
+static asdl_expr_seq *
+_get_resized_exprs(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b, int tstring)
+{
+ Py_ssize_t n_items = asdl_seq_LEN(raw_expressions);
Py_ssize_t total_items = n_items;
for (Py_ssize_t i = 0; i < n_items; i++) {
- expr_ty item = asdl_seq_GET(expr, i);
+ expr_ty item = asdl_seq_GET(raw_expressions, i);
if (item->kind == JoinedStr_kind) {
total_items += asdl_seq_LEN(item->v.JoinedStr.values) - 1;
}
@@ -1311,17 +1319,18 @@ _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b) {
Py_ssize_t index = 0;
for (Py_ssize_t i = 0; i < n_items; i++) {
- expr_ty item = asdl_seq_GET(expr, i);
+ expr_ty item = asdl_seq_GET(raw_expressions, i);
// This should correspond to a JoinedStr node of two elements
// created _PyPegen_formatted_value. This situation can only be the result of
- // a f-string debug expression where the first element is a constant with the text and the second
+ // a (f|t)-string debug expression where the first element is a constant with the text and the second
// a formatted value with the expression.
if (item->kind == JoinedStr_kind) {
asdl_expr_seq *values = item->v.JoinedStr.values;
if (asdl_seq_LEN(values) != 2) {
PyErr_Format(PyExc_SystemError,
- "unexpected JoinedStr node without debug data in f-string at line %d",
+ tstring ? "unexpected TemplateStr node without debug data in t-string at line %d"
+ : "unexpected JoinedStr node without debug data in f-string at line %d",
item->lineno);
return NULL;
}
@@ -1331,7 +1340,7 @@ _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b) {
asdl_seq_SET(seq, index++, first);
expr_ty second = asdl_seq_GET(values, 1);
- assert(second->kind == FormattedValue_kind);
+ assert((tstring && second->kind == Interpolation_kind) || second->kind == FormattedValue_kind);
asdl_seq_SET(seq, index++, second);
continue;
@@ -1367,7 +1376,22 @@ _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b) {
else {
resized_exprs = seq;
}
+ return resized_exprs;
+}
+expr_ty
+_PyPegen_template_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b) {
+
+ asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, 1);
+ return _PyAST_TemplateStr(resized_exprs, a->lineno, a->col_offset,
+ b->end_lineno, b->end_col_offset,
+ p->arena);
+}
+
+expr_ty
+_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) {
+
+ asdl_expr_seq *resized_exprs = _get_resized_exprs(p, a, raw_expressions, b, 0);
return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset,
b->end_lineno, b->end_col_offset,
p->arena);
@@ -1434,138 +1458,249 @@ expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok) {
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, ResultTokenWithMetadata *conversion,
- ResultTokenWithMetadata *format, Token *closing_brace, int lineno, int col_offset,
- int end_lineno, int end_col_offset, PyArena *arena) {
- int conversion_val = -1;
+static int
+_get_interpolation_conversion(Parser *p, Token *debug, ResultTokenWithMetadata *conversion,
+ ResultTokenWithMetadata *format)
+{
if (conversion != NULL) {
expr_ty conversion_expr = (expr_ty) conversion->result;
assert(conversion_expr->kind == Name_kind);
Py_UCS4 first = PyUnicode_READ_CHAR(conversion_expr->v.Name.id, 0);
+ return Py_SAFE_DOWNCAST(first, Py_UCS4, int);
+ }
+ else if (debug && !format) {
+ /* If no conversion is specified, use !r for debug expressions */
+ return (int)'r';
+ }
+ return -1;
+}
- if (PyUnicode_GET_LENGTH(conversion_expr->v.Name.id) > 1 ||
- !(first == 's' || first == 'r' || first == 'a')) {
- RAISE_SYNTAX_ERROR_KNOWN_LOCATION(conversion_expr,
- "f-string: invalid conversion character %R: expected 's', 'r', or 'a'",
- conversion_expr->v.Name.id);
+static PyObject *
+_strip_interpolation_expr(PyObject *exprstr)
+{
+ Py_ssize_t len = PyUnicode_GET_LENGTH(exprstr);
+
+ for (Py_ssize_t i = len - 1; i >= 0; i--) {
+ Py_UCS4 c = PyUnicode_READ_CHAR(exprstr, i);
+ if (_PyUnicode_IsWhitespace(c) || c == '=') {
+ len--;
+ }
+ else {
+ break;
+ }
+ }
+
+ return PyUnicode_Substring(exprstr, 0, len);
+}
+
+expr_ty _PyPegen_interpolation(Parser *p, expr_ty expression, Token *debug, ResultTokenWithMetadata *conversion,
+ ResultTokenWithMetadata *format, Token *closing_brace, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena) {
+
+ constant convstr = NULL;
+ int conversion_val = _get_interpolation_conversion(p, debug, conversion, format);
+ if (conversion_val >= 0) {
+ char buf[1];
+ buf[0] = conversion_val;
+ convstr = PyUnicode_FromStringAndSize(buf, 1);
+ if (convstr == NULL || _PyArena_AddPyObject(arena, convstr) < 0) {
+ Py_XDECREF(convstr);
return NULL;
}
+ }
- conversion_val = Py_SAFE_DOWNCAST(first, Py_UCS4, int);
+ /* Find the non whitespace token after the "=" */
+ int debug_end_line, debug_end_offset;
+ PyObject *debug_metadata;
+ constant exprstr;
+
+ if (conversion) {
+ debug_end_line = ((expr_ty) conversion->result)->lineno;
+ debug_end_offset = ((expr_ty) conversion->result)->col_offset;
+ debug_metadata = exprstr = conversion->metadata;
}
- else if (debug && !format) {
- /* If no conversion is specified, use !r for debug expressions */
- conversion_val = (int)'r';
+ else if (format) {
+ debug_end_line = ((expr_ty) format->result)->lineno;
+ debug_end_offset = ((expr_ty) format->result)->col_offset + 1;
+ debug_metadata = exprstr = format->metadata;
+ }
+ else {
+ debug_end_line = end_lineno;
+ debug_end_offset = end_col_offset;
+ debug_metadata = exprstr = closing_brace->metadata;
+ }
+
+ assert(exprstr != NULL);
+ PyObject *final_exprstr = _strip_interpolation_expr(exprstr);
+ if (!final_exprstr || _PyArena_AddPyObject(arena, final_exprstr) < 0) {
+ Py_XDECREF(final_exprstr);
+ return NULL;
+ }
+
+ expr_ty interpolation = _PyAST_Interpolation(
+ expression, final_exprstr, convstr, format ? (expr_ty) format->result : NULL,
+ lineno, col_offset, end_lineno,
+ end_col_offset, arena
+ );
+
+ if (!debug) {
+ return interpolation;
}
+ expr_ty debug_text = _PyAST_Constant(debug_metadata, NULL, lineno, col_offset + 1, debug_end_line,
+ debug_end_offset - 1, p->arena);
+ 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, interpolation);
+ return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line, debug_end_offset, p->arena);
+}
+
+expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, ResultTokenWithMetadata *conversion,
+ ResultTokenWithMetadata *format, Token *closing_brace, int lineno, int col_offset,
+ int end_lineno, int end_col_offset, PyArena *arena) {
+ int conversion_val = _get_interpolation_conversion(p, debug, conversion, format);
+
expr_ty formatted_value = _PyAST_FormattedValue(
expression, conversion_val, format ? (expr_ty) format->result : NULL,
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;
- PyObject *debug_metadata;
+ if (!debug) {
+ return formatted_value;
+ }
- if (conversion) {
- debug_end_line = ((expr_ty) conversion->result)->lineno;
- debug_end_offset = ((expr_ty) conversion->result)->col_offset;
- debug_metadata = conversion->metadata;
- }
- else if (format) {
- debug_end_line = ((expr_ty) format->result)->lineno;
- debug_end_offset = ((expr_ty) format->result)->col_offset + 1;
- debug_metadata = format->metadata;
- }
- else {
- debug_end_line = end_lineno;
- debug_end_offset = end_col_offset;
- debug_metadata = closing_brace->metadata;
- }
- expr_ty debug_text = _PyAST_Constant(debug_metadata, NULL, lineno, col_offset + 1, debug_end_line,
- debug_end_offset - 1, p->arena);
- if (!debug_text) {
- return NULL;
- }
+ /* Find the non whitespace token after the "=" */
+ int debug_end_line, debug_end_offset;
+ PyObject *debug_metadata;
- asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena);
- if (values == NULL) {
- return NULL;
- }
- 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);
+ if (conversion) {
+ debug_end_line = ((expr_ty) conversion->result)->lineno;
+ debug_end_offset = ((expr_ty) conversion->result)->col_offset;
+ debug_metadata = conversion->metadata;
+ }
+ else if (format) {
+ debug_end_line = ((expr_ty) format->result)->lineno;
+ debug_end_offset = ((expr_ty) format->result)->col_offset + 1;
+ debug_metadata = format->metadata;
}
else {
- return formatted_value;
+ debug_end_line = end_lineno;
+ debug_end_offset = end_col_offset;
+ debug_metadata = closing_brace->metadata;
}
+ expr_ty debug_text = _PyAST_Constant(debug_metadata, NULL, lineno, col_offset + 1, debug_end_line,
+ debug_end_offset - 1, p->arena);
+ 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);
}
-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)
+static expr_ty
+_build_concatenated_bytes(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;
+ PyObject* res = Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
- Py_ssize_t i = 0;
- Py_ssize_t n_flattened_elements = 0;
- for (i = 0; i < len; i++) {
+ /* 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 (Py_ssize_t i = 0; i < len; i++) {
expr_ty elem = asdl_seq_GET(strings, i);
- switch(elem->kind) {
- case Constant_kind:
- if (PyBytes_CheckExact(elem->v.Constant.value)) {
- bytes_found = 1;
- } else {
- unicode_string_found = 1;
- }
- n_flattened_elements++;
- break;
- case JoinedStr_kind:
- n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values);
- f_string_found = 1;
- break;
- default:
- n_flattened_elements++;
- f_string_found = 1;
- break;
- }
+ 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 ((unicode_string_found || f_string_found) && bytes_found) {
- RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals");
+static expr_ty
+_build_concatenated_unicode(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 > 1);
+
+ expr_ty first = asdl_seq_GET(strings, 0);
+
+ /* 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 = first->v.Constant.kind;
+
+ PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
+ if (writer == NULL) {
return NULL;
}
- if (bytes_found) {
- PyObject* res = Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
+ for (Py_ssize_t i = 0; i < len; i++) {
+ expr_ty current_elem = asdl_seq_GET(strings, i);
+ assert(current_elem->kind == Constant_kind);
- /* 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);
+ if (PyUnicodeWriter_WriteStr(writer,
+ current_elem->v.Constant.value)) {
+ PyUnicodeWriter_Discard(writer);
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);
+ PyObject *final = PyUnicodeWriter_Finish(writer);
+ if (final == NULL) {
+ return NULL;
}
+ if (_PyArena_AddPyObject(p->arena, final) < 0) {
+ Py_DECREF(final);
+ return NULL;
+ }
+ return _PyAST_Constant(final, kind, lineno, col_offset,
+ end_lineno, end_col_offset, arena);
+}
+
+static asdl_expr_seq *
+_build_concatenated_str(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);
+
+ Py_ssize_t n_flattened_elements = 0;
+ for (Py_ssize_t i = 0; i < len; i++) {
+ expr_ty elem = asdl_seq_GET(strings, i);
+ switch(elem->kind) {
+ case JoinedStr_kind:
+ n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values);
+ break;
+ case TemplateStr_kind:
+ n_flattened_elements += asdl_seq_LEN(elem->v.TemplateStr.values);
+ break;
+ default:
+ n_flattened_elements++;
+ break;
+ }
+ }
+
asdl_expr_seq* flattened = _Py_asdl_expr_seq_new(n_flattened_elements, p->arena);
if (flattened == NULL) {
@@ -1574,12 +1709,11 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
/* build flattened list */
Py_ssize_t current_pos = 0;
- Py_ssize_t j = 0;
- for (i = 0; i < len; i++) {
+ for (Py_ssize_t i = 0; i < len; i++) {
expr_ty elem = asdl_seq_GET(strings, i);
switch(elem->kind) {
case JoinedStr_kind:
- for (j = 0; j < asdl_seq_LEN(elem->v.JoinedStr.values); j++) {
+ for (Py_ssize_t 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;
@@ -1587,6 +1721,15 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
asdl_seq_SET(flattened, current_pos++, subvalue);
}
break;
+ case TemplateStr_kind:
+ for (Py_ssize_t j = 0; j < asdl_seq_LEN(elem->v.TemplateStr.values); j++) {
+ expr_ty subvalue = asdl_seq_GET(elem->v.TemplateStr.values, j);
+ if (subvalue == NULL) {
+ return NULL;
+ }
+ asdl_seq_SET(flattened, current_pos++, subvalue);
+ }
+ break;
default:
asdl_seq_SET(flattened, current_pos++, elem);
break;
@@ -1596,13 +1739,13 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
/* calculate folded element count */
Py_ssize_t n_elements = 0;
int prev_is_constant = 0;
- for (i = 0; i < n_flattened_elements; i++) {
+ for (Py_ssize_t i = 0; i < n_flattened_elements; i++) {
expr_ty elem = asdl_seq_GET(flattened, i);
/* The concatenation of a FormattedValue and an empty Constant 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 &&
+ if (elem->kind == Constant_kind &&
PyUnicode_CheckExact(elem->v.Constant.value) &&
PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0)
continue;
@@ -1620,7 +1763,7 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
/* build folded list */
current_pos = 0;
- for (i = 0; i < n_flattened_elements; i++) {
+ for (Py_ssize_t i = 0; i < n_flattened_elements; i++) {
expr_ty elem = asdl_seq_GET(flattened, i);
/* if the current elem and the following are constants,
@@ -1643,6 +1786,7 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
return NULL;
}
expr_ty last_elem = elem;
+ Py_ssize_t j;
for (j = i; j < n_flattened_elements; j++) {
expr_ty current_elem = asdl_seq_GET(flattened, j);
if (current_elem->kind == Constant_kind) {
@@ -1676,8 +1820,7 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
}
/* Drop all empty contanst strings */
- if (f_string_found &&
- PyUnicode_CheckExact(elem->v.Constant.value) &&
+ if (PyUnicode_CheckExact(elem->v.Constant.value) &&
PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) {
continue;
}
@@ -1686,17 +1829,97 @@ _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings,
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 values;
+}
+
+static expr_ty
+_build_concatenated_joined_str(Parser *p, asdl_expr_seq *strings,
+ int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena)
+{
+ asdl_expr_seq *values = _build_concatenated_str(p, strings, lineno,
+ col_offset, end_lineno, end_col_offset, arena);
return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, end_col_offset, p->arena);
}
+static expr_ty
+_build_concatenated_template_str(Parser *p, asdl_expr_seq *strings,
+ int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena)
+{
+ asdl_expr_seq *values = _build_concatenated_str(p, strings, lineno,
+ col_offset, end_lineno, end_col_offset, arena);
+ return _PyAST_TemplateStr(values, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+}
+
+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 t_string_found = 0;
+ int f_string_found = 0;
+ int unicode_string_found = 0;
+ int bytes_found = 0;
+
+ Py_ssize_t i = 0;
+ for (i = 0; i < len; i++) {
+ expr_ty elem = asdl_seq_GET(strings, i);
+ switch(elem->kind) {
+ case Constant_kind:
+ if (PyBytes_CheckExact(elem->v.Constant.value)) {
+ bytes_found = 1;
+ } else {
+ unicode_string_found = 1;
+ }
+ break;
+ case JoinedStr_kind:
+ f_string_found = 1;
+ break;
+ case TemplateStr_kind:
+ t_string_found = 1;
+ break;
+ default:
+ f_string_found = 1;
+ break;
+ }
+ }
+
+ // Cannot mix unicode and bytes
+ if ((unicode_string_found || f_string_found || t_string_found) && bytes_found) {
+ RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals");
+ return NULL;
+ }
+
+ // If it's only bytes or only unicode string, do a simple concat
+ if (!f_string_found && !t_string_found) {
+ if (len == 1) {
+ return asdl_seq_GET(strings, 0);
+ }
+ else if (bytes_found) {
+ return _build_concatenated_bytes(p, strings, lineno, col_offset,
+ end_lineno, end_col_offset, arena);
+ }
+ else {
+ return _build_concatenated_unicode(p, strings, lineno, col_offset,
+ end_lineno, end_col_offset, arena);
+ }
+ }
+
+ if (t_string_found) {
+ return _build_concatenated_template_str(p, strings, lineno,
+ col_offset, end_lineno, end_col_offset, arena);
+ }
+
+ return _build_concatenated_joined_str(p, strings, lineno,
+ col_offset, end_lineno, end_col_offset, arena);
+}
+
stmt_ty
_PyPegen_checked_future_import(Parser *p, identifier module, asdl_alias_seq * names, int level,
int lineno, int col_offset, int end_lineno, int end_col_offset,
diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c
index 45604b197f43f2..794b0e5bc81838 100644
--- a/Parser/lexer/lexer.c
+++ b/Parser/lexer/lexer.c
@@ -108,12 +108,12 @@ tok_backup(struct tok_state *tok, int c)
}
static int
-set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
+set_ftstring_expr(struct tok_state* tok, struct token *token, char c) {
assert(token != NULL);
assert(c == '}' || c == ':' || c == '!');
tokenizer_mode *tok_mode = TOK_GET_MODE(tok);
- if (!tok_mode->f_string_debug || token->metadata) {
+ if (!(tok_mode->f_string_debug || tok_mode->tstring) || token->metadata) {
return 0;
}
PyObject *res = NULL;
@@ -173,7 +173,7 @@ set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
}
int
-_PyLexer_update_fstring_expr(struct tok_state *tok, char cur)
+_PyLexer_update_ftstring_expr(struct tok_state *tok, char cur)
{
assert(tok->cur != NULL);
@@ -643,13 +643,13 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
nonascii = 0;
if (is_potential_identifier_start(c)) {
/* Process the various legal combinations of b"", r"", u"", and f"". */
- int saw_b = 0, saw_r = 0, saw_u = 0, saw_f = 0;
+ int saw_b = 0, saw_r = 0, saw_u = 0, saw_f = 0, saw_t = 0;
while (1) {
- if (!(saw_b || saw_u || saw_f) && (c == 'b' || c == 'B'))
+ if (!(saw_b || saw_u || saw_f || saw_t) && (c == 'b' || c == 'B'))
saw_b = 1;
/* Since this is a backwards compatibility support literal we don't
want to support it in arbitrary order like byte literals. */
- else if (!(saw_b || saw_u || saw_r || saw_f)
+ else if (!(saw_b || saw_u || saw_r || saw_f || saw_t)
&& (c == 'u'|| c == 'U')) {
saw_u = 1;
}
@@ -657,15 +657,18 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
else if (!(saw_r || saw_u) && (c == 'r' || c == 'R')) {
saw_r = 1;
}
- else if (!(saw_f || saw_b || saw_u) && (c == 'f' || c == 'F')) {
+ else if (!(saw_f || saw_b || saw_u || saw_t) && (c == 'f' || c == 'F')) {
saw_f = 1;
}
+ else if (!(saw_t || saw_b || saw_u || saw_f) && (c == 't' || c == 'T')) {
+ saw_t = 1;
+ }
else {
break;
}
c = tok_nextc(tok);
if (c == '"' || c == '\'') {
- if (saw_f) {
+ if (saw_f || saw_t) {
goto f_string_quote;
}
goto letter_quote;
@@ -939,7 +942,9 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
}
f_string_quote:
- if (((Py_TOLOWER(*tok->start) == 'f' || Py_TOLOWER(*tok->start) == 'r') && (c == '\'' || c == '"'))) {
+ if (((Py_TOLOWER(*tok->start) == 'f' || Py_TOLOWER(*tok->start) == 'r' || Py_TOLOWER(*tok->start) == 't')
+ && (c == '\'' || c == '"'))) {
+
int quote = c;
int quote_size = 1; /* 1 or 3 */
@@ -971,7 +976,7 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
p_start = tok->start;
p_end = tok->cur;
if (tok->tok_mode_stack_index + 1 >= MAXFSTRINGLEVEL) {
- return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "too many nested f-strings"));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "too many nested f-strings or t-strings"));
}
tokenizer_mode *the_current_tok = TOK_NEXT_MODE(tok);
the_current_tok->kind = TOK_FSTRING_MODE;
@@ -988,7 +993,13 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
the_current_tok->in_format_spec = 0;
the_current_tok->f_string_debug = 0;
+ int tstring = 0;
switch (*tok->start) {
+ case 'T':
+ case 't':
+ the_current_tok->f_string_raw = Py_TOLOWER(*(tok->start + 1)) == 'r';
+ tstring = 1;
+ break;
case 'F':
case 'f':
the_current_tok->f_string_raw = Py_TOLOWER(*(tok->start + 1)) == 'r';
@@ -996,14 +1007,16 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
case 'R':
case 'r':
the_current_tok->f_string_raw = 1;
+ tstring = Py_TOLOWER(*(tok->start + 1)) == 't';
break;
default:
Py_UNREACHABLE();
}
+ the_current_tok->tstring = tstring;
the_current_tok->curly_bracket_depth = 0;
the_current_tok->curly_bracket_expr_start_depth = -1;
- return MAKE_TOKEN(FSTRING_START);
+ return tstring ? MAKE_TOKEN(TSTRING_START) : MAKE_TOKEN(FSTRING_START);
}
letter_quote:
@@ -1065,7 +1078,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
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(_PyTokenizer_syntaxerror(tok, "f-string: expecting '}'", start));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+ "%c-string: expecting '}'", TOK_GET_MODE(tok)->tstring ? 't' : 'f'));
}
}
@@ -1138,10 +1152,10 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
int cursor_in_format_with_debug =
cursor == 1 && (current_tok->f_string_debug || in_format_spec);
int cursor_valid = cursor == 0 || cursor_in_format_with_debug;
- if ((cursor_valid) && !_PyLexer_update_fstring_expr(tok, c)) {
+ if ((cursor_valid) && !_PyLexer_update_ftstring_expr(tok, c)) {
return MAKE_TOKEN(ENDMARKER);
}
- if ((cursor_valid) && c != '{' && set_fstring_expr(tok, token, c)) {
+ if ((cursor_valid) && c != '{' && set_ftstring_expr(tok, token, c)) {
return MAKE_TOKEN(ERRORTOKEN);
}
@@ -1194,7 +1208,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
case ']':
case '}':
if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') {
- return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "f-string: single '}' is not allowed"));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+ "%c-string: single '}' is not allowed", TOK_GET_MODE(tok)->tstring ? 't' : 'f'));
}
if (!tok->tok_extra_tokens && !tok->level) {
return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "unmatched '%c'", c));
@@ -1214,7 +1229,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
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(_PyTokenizer_syntaxerror(tok, "f-string: unmatched '%c'", c));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+ "%c-string: unmatched '%c'", TOK_GET_MODE(tok)->tstring ? 't' : 'f', c));
}
}
if (tok->parenlinenostack[tok->level] != tok->lineno) {
@@ -1235,7 +1251,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
if (INSIDE_FSTRING(tok)) {
current_tok->curly_bracket_depth--;
if (current_tok->curly_bracket_depth < 0) {
- return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "f-string: unmatched '%c'", c));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "%c-string: unmatched '%c'",
+ TOK_GET_MODE(tok)->tstring ? 't' : 'f', c));
}
if (c == '}' && current_tok->curly_bracket_depth == current_tok->curly_bracket_expr_start_depth) {
current_tok->curly_bracket_expr_start_depth--;
@@ -1285,7 +1302,8 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct
if (peek1 != '{') {
current_tok->curly_bracket_expr_start_depth++;
if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) {
- return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "f-string: expressions nested too deeply"));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+ "%c-string: expressions nested too deeply", TOK_GET_MODE(tok)->tstring ? 't' : 'f'));
}
TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE;
return tok_get_normal_mode(tok, current_tok, token);
@@ -1363,8 +1381,9 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct
if (current_tok->f_string_quote_size == 3) {
_PyTokenizer_syntaxerror(tok,
- "unterminated triple-quoted f-string literal"
- " (detected at line %d)", start);
+ "unterminated triple-quoted %c-string literal"
+ " (detected at line %d)",
+ TOK_GET_MODE(tok)->tstring ? 't' : 'f', start);
if (c != '\n') {
tok->done = E_EOFS;
}
@@ -1372,8 +1391,8 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct
}
else {
return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
- "unterminated f-string literal (detected at"
- " line %d)", start));
+ "unterminated %c-string literal (detected at"
+ " line %d)", TOK_GET_MODE(tok)->tstring ? 't' : 'f', start));
}
}
@@ -1385,7 +1404,7 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct
}
if (c == '{') {
- if (!_PyLexer_update_fstring_expr(tok, c)) {
+ if (!_PyLexer_update_ftstring_expr(tok, c)) {
return MAKE_TOKEN(ENDMARKER);
}
int peek = tok_nextc(tok);
@@ -1394,7 +1413,8 @@ tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct
tok_backup(tok, c);
current_tok->curly_bracket_expr_start_depth++;
if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) {
- return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "f-string: expressions nested too deeply"));
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+ "%c-string: expressions nested too deeply", TOK_GET_MODE(tok)->tstring ? 't' : 'f'));
}
TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE;
current_tok->in_format_spec = 0;
diff --git a/Parser/lexer/lexer.h b/Parser/lexer/lexer.h
index 7f21bf56bba2d1..1d97ac57b745b0 100644
--- a/Parser/lexer/lexer.h
+++ b/Parser/lexer/lexer.h
@@ -3,7 +3,7 @@
#include "state.h"
-int _PyLexer_update_fstring_expr(struct tok_state *tok, char cur);
+int _PyLexer_update_ftstring_expr(struct tok_state *tok, char cur);
int _PyTokenizer_Get(struct tok_state *, struct token *);
diff --git a/Parser/lexer/state.h b/Parser/lexer/state.h
index 9ed3babfdbfbf1..022dcef9dd5e07 100644
--- a/Parser/lexer/state.h
+++ b/Parser/lexer/state.h
@@ -59,6 +59,8 @@ typedef struct _tokenizer_mode {
char* last_expr_buffer;
int f_string_debug;
int in_format_spec;
+
+ int tstring;
} tokenizer_mode;
/* Tokenizer state */
diff --git a/Parser/parser.c b/Parser/parser.c
index f39ad950e168b3..050bf26e0628d7 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -246,272 +246,276 @@ static char *soft_keywords[] = {
#define fstring_full_format_spec_type 1159
#define fstring_format_spec_type 1160
#define fstring_type 1161
-#define string_type 1162
-#define strings_type 1163
-#define list_type 1164
-#define tuple_type 1165
-#define set_type 1166
-#define dict_type 1167
-#define double_starred_kvpairs_type 1168
-#define double_starred_kvpair_type 1169
-#define kvpair_type 1170
-#define for_if_clauses_type 1171
-#define for_if_clause_type 1172
-#define listcomp_type 1173
-#define setcomp_type 1174
-#define genexp_type 1175
-#define dictcomp_type 1176
-#define arguments_type 1177
-#define args_type 1178
-#define kwargs_type 1179
-#define starred_expression_type 1180
-#define kwarg_or_starred_type 1181
-#define kwarg_or_double_starred_type 1182
-#define star_targets_type 1183
-#define star_targets_list_seq_type 1184
-#define star_targets_tuple_seq_type 1185
-#define star_target_type 1186
-#define target_with_star_atom_type 1187
-#define star_atom_type 1188
-#define single_target_type 1189
-#define single_subscript_attribute_target_type 1190
-#define t_primary_type 1191 // Left-recursive
-#define t_lookahead_type 1192
-#define del_targets_type 1193
-#define del_target_type 1194
-#define del_t_atom_type 1195
-#define type_expressions_type 1196
-#define func_type_comment_type 1197
-#define invalid_arguments_type 1198
-#define invalid_kwarg_type 1199
-#define expression_without_invalid_type 1200
-#define invalid_legacy_expression_type 1201
-#define invalid_type_param_type 1202
-#define invalid_expression_type 1203
-#define invalid_named_expression_type 1204
-#define invalid_assignment_type 1205
-#define invalid_ann_assign_target_type 1206
-#define invalid_del_stmt_type 1207
-#define invalid_block_type 1208
-#define invalid_comprehension_type 1209
-#define invalid_dict_comprehension_type 1210
-#define invalid_parameters_type 1211
-#define invalid_default_type 1212
-#define invalid_star_etc_type 1213
-#define invalid_kwds_type 1214
-#define invalid_parameters_helper_type 1215
-#define invalid_lambda_parameters_type 1216
-#define invalid_lambda_parameters_helper_type 1217
-#define invalid_lambda_star_etc_type 1218
-#define invalid_lambda_kwds_type 1219
-#define invalid_double_type_comments_type 1220
-#define invalid_with_item_type 1221
-#define invalid_for_if_clause_type 1222
-#define invalid_for_target_type 1223
-#define invalid_group_type 1224
-#define invalid_import_type 1225
-#define invalid_import_from_targets_type 1226
-#define invalid_with_stmt_type 1227
-#define invalid_with_stmt_indent_type 1228
-#define invalid_try_stmt_type 1229
-#define invalid_except_stmt_type 1230
-#define invalid_except_star_stmt_type 1231
-#define invalid_finally_stmt_type 1232
-#define invalid_except_stmt_indent_type 1233
-#define invalid_except_star_stmt_indent_type 1234
-#define invalid_match_stmt_type 1235
-#define invalid_case_block_type 1236
-#define invalid_as_pattern_type 1237
-#define invalid_class_pattern_type 1238
-#define invalid_class_argument_pattern_type 1239
-#define invalid_if_stmt_type 1240
-#define invalid_elif_stmt_type 1241
-#define invalid_else_stmt_type 1242
-#define invalid_while_stmt_type 1243
-#define invalid_for_stmt_type 1244
-#define invalid_def_raw_type 1245
-#define invalid_class_def_raw_type 1246
-#define invalid_double_starred_kvpairs_type 1247
-#define invalid_kvpair_type 1248
-#define invalid_starred_expression_unpacking_type 1249
-#define invalid_starred_expression_type 1250
-#define invalid_replacement_field_type 1251
-#define invalid_conversion_character_type 1252
-#define invalid_arithmetic_type 1253
-#define invalid_factor_type 1254
-#define invalid_type_params_type 1255
-#define _loop0_1_type 1256
-#define _loop1_2_type 1257
-#define _loop0_3_type 1258
-#define _gather_4_type 1259
-#define _tmp_5_type 1260
-#define _tmp_6_type 1261
-#define _tmp_7_type 1262
-#define _tmp_8_type 1263
-#define _tmp_9_type 1264
-#define _tmp_10_type 1265
-#define _tmp_11_type 1266
-#define _loop1_12_type 1267
-#define _tmp_13_type 1268
-#define _loop0_14_type 1269
-#define _gather_15_type 1270
-#define _tmp_16_type 1271
-#define _tmp_17_type 1272
-#define _loop0_18_type 1273
-#define _loop1_19_type 1274
-#define _loop0_20_type 1275
-#define _gather_21_type 1276
-#define _tmp_22_type 1277
-#define _loop0_23_type 1278
-#define _gather_24_type 1279
-#define _loop1_25_type 1280
-#define _tmp_26_type 1281
-#define _tmp_27_type 1282
-#define _loop0_28_type 1283
-#define _loop0_29_type 1284
-#define _loop1_30_type 1285
-#define _loop1_31_type 1286
-#define _loop0_32_type 1287
-#define _loop1_33_type 1288
-#define _loop0_34_type 1289
-#define _gather_35_type 1290
-#define _tmp_36_type 1291
-#define _loop1_37_type 1292
-#define _loop1_38_type 1293
-#define _loop1_39_type 1294
-#define _loop0_40_type 1295
-#define _gather_41_type 1296
-#define _tmp_42_type 1297
-#define _tmp_43_type 1298
-#define _loop0_44_type 1299
-#define _gather_45_type 1300
-#define _loop0_46_type 1301
-#define _gather_47_type 1302
-#define _tmp_48_type 1303
-#define _loop0_49_type 1304
-#define _gather_50_type 1305
-#define _loop0_51_type 1306
-#define _gather_52_type 1307
-#define _loop0_53_type 1308
-#define _gather_54_type 1309
-#define _loop1_55_type 1310
-#define _loop1_56_type 1311
-#define _loop0_57_type 1312
-#define _gather_58_type 1313
-#define _loop1_59_type 1314
-#define _loop1_60_type 1315
-#define _loop1_61_type 1316
-#define _tmp_62_type 1317
-#define _loop0_63_type 1318
-#define _gather_64_type 1319
-#define _tmp_65_type 1320
-#define _tmp_66_type 1321
-#define _tmp_67_type 1322
-#define _tmp_68_type 1323
-#define _tmp_69_type 1324
-#define _tmp_70_type 1325
-#define _loop0_71_type 1326
-#define _loop0_72_type 1327
-#define _loop1_73_type 1328
-#define _loop1_74_type 1329
-#define _loop0_75_type 1330
-#define _loop1_76_type 1331
-#define _loop0_77_type 1332
-#define _loop0_78_type 1333
-#define _loop1_79_type 1334
-#define _tmp_80_type 1335
-#define _loop0_81_type 1336
-#define _gather_82_type 1337
-#define _loop1_83_type 1338
-#define _loop0_84_type 1339
-#define _tmp_85_type 1340
-#define _loop0_86_type 1341
-#define _gather_87_type 1342
-#define _tmp_88_type 1343
-#define _loop0_89_type 1344
-#define _gather_90_type 1345
-#define _loop0_91_type 1346
-#define _gather_92_type 1347
-#define _loop0_93_type 1348
-#define _loop0_94_type 1349
-#define _gather_95_type 1350
-#define _loop1_96_type 1351
-#define _tmp_97_type 1352
-#define _loop0_98_type 1353
-#define _gather_99_type 1354
-#define _loop0_100_type 1355
-#define _gather_101_type 1356
-#define _tmp_102_type 1357
-#define _tmp_103_type 1358
-#define _loop0_104_type 1359
-#define _gather_105_type 1360
-#define _tmp_106_type 1361
-#define _tmp_107_type 1362
-#define _tmp_108_type 1363
-#define _tmp_109_type 1364
-#define _tmp_110_type 1365
-#define _loop1_111_type 1366
-#define _tmp_112_type 1367
-#define _tmp_113_type 1368
-#define _tmp_114_type 1369
-#define _tmp_115_type 1370
-#define _tmp_116_type 1371
-#define _loop0_117_type 1372
-#define _loop0_118_type 1373
-#define _tmp_119_type 1374
-#define _tmp_120_type 1375
-#define _tmp_121_type 1376
-#define _tmp_122_type 1377
-#define _tmp_123_type 1378
-#define _tmp_124_type 1379
-#define _tmp_125_type 1380
-#define _tmp_126_type 1381
-#define _tmp_127_type 1382
-#define _loop0_128_type 1383
-#define _gather_129_type 1384
-#define _tmp_130_type 1385
-#define _tmp_131_type 1386
-#define _tmp_132_type 1387
-#define _tmp_133_type 1388
-#define _loop0_134_type 1389
-#define _gather_135_type 1390
-#define _loop0_136_type 1391
-#define _gather_137_type 1392
-#define _loop0_138_type 1393
-#define _gather_139_type 1394
-#define _tmp_140_type 1395
-#define _loop0_141_type 1396
-#define _tmp_142_type 1397
-#define _tmp_143_type 1398
-#define _tmp_144_type 1399
-#define _tmp_145_type 1400
-#define _tmp_146_type 1401
-#define _tmp_147_type 1402
-#define _tmp_148_type 1403
-#define _tmp_149_type 1404
-#define _tmp_150_type 1405
-#define _tmp_151_type 1406
-#define _tmp_152_type 1407
-#define _tmp_153_type 1408
-#define _tmp_154_type 1409
-#define _tmp_155_type 1410
-#define _tmp_156_type 1411
-#define _tmp_157_type 1412
-#define _tmp_158_type 1413
-#define _tmp_159_type 1414
-#define _tmp_160_type 1415
-#define _tmp_161_type 1416
-#define _tmp_162_type 1417
-#define _tmp_163_type 1418
-#define _tmp_164_type 1419
-#define _tmp_165_type 1420
-#define _tmp_166_type 1421
-#define _tmp_167_type 1422
-#define _loop0_168_type 1423
-#define _tmp_169_type 1424
-#define _tmp_170_type 1425
-#define _tmp_171_type 1426
-#define _tmp_172_type 1427
+#define tstring_replacement_field_type 1162
+#define tstring_middle_type 1163
+#define tstring_type 1164
+#define string_type 1165
+#define strings_type 1166
+#define list_type 1167
+#define tuple_type 1168
+#define set_type 1169
+#define dict_type 1170
+#define double_starred_kvpairs_type 1171
+#define double_starred_kvpair_type 1172
+#define kvpair_type 1173
+#define for_if_clauses_type 1174
+#define for_if_clause_type 1175
+#define listcomp_type 1176
+#define setcomp_type 1177
+#define genexp_type 1178
+#define dictcomp_type 1179
+#define arguments_type 1180
+#define args_type 1181
+#define kwargs_type 1182
+#define starred_expression_type 1183
+#define kwarg_or_starred_type 1184
+#define kwarg_or_double_starred_type 1185
+#define star_targets_type 1186
+#define star_targets_list_seq_type 1187
+#define star_targets_tuple_seq_type 1188
+#define star_target_type 1189
+#define target_with_star_atom_type 1190
+#define star_atom_type 1191
+#define single_target_type 1192
+#define single_subscript_attribute_target_type 1193
+#define t_primary_type 1194 // Left-recursive
+#define t_lookahead_type 1195
+#define del_targets_type 1196
+#define del_target_type 1197
+#define del_t_atom_type 1198
+#define type_expressions_type 1199
+#define func_type_comment_type 1200
+#define invalid_arguments_type 1201
+#define invalid_kwarg_type 1202
+#define expression_without_invalid_type 1203
+#define invalid_legacy_expression_type 1204
+#define invalid_type_param_type 1205
+#define invalid_expression_type 1206
+#define invalid_named_expression_type 1207
+#define invalid_assignment_type 1208
+#define invalid_ann_assign_target_type 1209
+#define invalid_del_stmt_type 1210
+#define invalid_block_type 1211
+#define invalid_comprehension_type 1212
+#define invalid_dict_comprehension_type 1213
+#define invalid_parameters_type 1214
+#define invalid_default_type 1215
+#define invalid_star_etc_type 1216
+#define invalid_kwds_type 1217
+#define invalid_parameters_helper_type 1218
+#define invalid_lambda_parameters_type 1219
+#define invalid_lambda_parameters_helper_type 1220
+#define invalid_lambda_star_etc_type 1221
+#define invalid_lambda_kwds_type 1222
+#define invalid_double_type_comments_type 1223
+#define invalid_with_item_type 1224
+#define invalid_for_if_clause_type 1225
+#define invalid_for_target_type 1226
+#define invalid_group_type 1227
+#define invalid_import_type 1228
+#define invalid_import_from_targets_type 1229
+#define invalid_with_stmt_type 1230
+#define invalid_with_stmt_indent_type 1231
+#define invalid_try_stmt_type 1232
+#define invalid_except_stmt_type 1233
+#define invalid_except_star_stmt_type 1234
+#define invalid_finally_stmt_type 1235
+#define invalid_except_stmt_indent_type 1236
+#define invalid_except_star_stmt_indent_type 1237
+#define invalid_match_stmt_type 1238
+#define invalid_case_block_type 1239
+#define invalid_as_pattern_type 1240
+#define invalid_class_pattern_type 1241
+#define invalid_class_argument_pattern_type 1242
+#define invalid_if_stmt_type 1243
+#define invalid_elif_stmt_type 1244
+#define invalid_else_stmt_type 1245
+#define invalid_while_stmt_type 1246
+#define invalid_for_stmt_type 1247
+#define invalid_def_raw_type 1248
+#define invalid_class_def_raw_type 1249
+#define invalid_double_starred_kvpairs_type 1250
+#define invalid_kvpair_type 1251
+#define invalid_starred_expression_unpacking_type 1252
+#define invalid_starred_expression_type 1253
+#define invalid_replacement_field_type 1254
+#define invalid_conversion_character_type 1255
+#define invalid_arithmetic_type 1256
+#define invalid_factor_type 1257
+#define invalid_type_params_type 1258
+#define _loop0_1_type 1259
+#define _loop1_2_type 1260
+#define _loop0_3_type 1261
+#define _gather_4_type 1262
+#define _tmp_5_type 1263
+#define _tmp_6_type 1264
+#define _tmp_7_type 1265
+#define _tmp_8_type 1266
+#define _tmp_9_type 1267
+#define _tmp_10_type 1268
+#define _tmp_11_type 1269
+#define _loop1_12_type 1270
+#define _tmp_13_type 1271
+#define _loop0_14_type 1272
+#define _gather_15_type 1273
+#define _tmp_16_type 1274
+#define _tmp_17_type 1275
+#define _loop0_18_type 1276
+#define _loop1_19_type 1277
+#define _loop0_20_type 1278
+#define _gather_21_type 1279
+#define _tmp_22_type 1280
+#define _loop0_23_type 1281
+#define _gather_24_type 1282
+#define _loop1_25_type 1283
+#define _tmp_26_type 1284
+#define _tmp_27_type 1285
+#define _loop0_28_type 1286
+#define _loop0_29_type 1287
+#define _loop1_30_type 1288
+#define _loop1_31_type 1289
+#define _loop0_32_type 1290
+#define _loop1_33_type 1291
+#define _loop0_34_type 1292
+#define _gather_35_type 1293
+#define _tmp_36_type 1294
+#define _loop1_37_type 1295
+#define _loop1_38_type 1296
+#define _loop1_39_type 1297
+#define _loop0_40_type 1298
+#define _gather_41_type 1299
+#define _tmp_42_type 1300
+#define _tmp_43_type 1301
+#define _tmp_44_type 1302
+#define _loop0_45_type 1303
+#define _gather_46_type 1304
+#define _loop0_47_type 1305
+#define _gather_48_type 1306
+#define _tmp_49_type 1307
+#define _loop0_50_type 1308
+#define _gather_51_type 1309
+#define _loop0_52_type 1310
+#define _gather_53_type 1311
+#define _loop0_54_type 1312
+#define _gather_55_type 1313
+#define _loop1_56_type 1314
+#define _loop1_57_type 1315
+#define _loop0_58_type 1316
+#define _gather_59_type 1317
+#define _loop1_60_type 1318
+#define _loop1_61_type 1319
+#define _loop1_62_type 1320
+#define _tmp_63_type 1321
+#define _loop0_64_type 1322
+#define _gather_65_type 1323
+#define _tmp_66_type 1324
+#define _tmp_67_type 1325
+#define _tmp_68_type 1326
+#define _tmp_69_type 1327
+#define _tmp_70_type 1328
+#define _loop0_71_type 1329
+#define _loop0_72_type 1330
+#define _loop1_73_type 1331
+#define _loop1_74_type 1332
+#define _loop0_75_type 1333
+#define _loop1_76_type 1334
+#define _loop0_77_type 1335
+#define _loop0_78_type 1336
+#define _loop0_79_type 1337
+#define _loop1_80_type 1338
+#define _tmp_81_type 1339
+#define _loop0_82_type 1340
+#define _gather_83_type 1341
+#define _loop1_84_type 1342
+#define _loop0_85_type 1343
+#define _tmp_86_type 1344
+#define _loop0_87_type 1345
+#define _gather_88_type 1346
+#define _tmp_89_type 1347
+#define _loop0_90_type 1348
+#define _gather_91_type 1349
+#define _loop0_92_type 1350
+#define _gather_93_type 1351
+#define _loop0_94_type 1352
+#define _loop0_95_type 1353
+#define _gather_96_type 1354
+#define _loop1_97_type 1355
+#define _tmp_98_type 1356
+#define _loop0_99_type 1357
+#define _gather_100_type 1358
+#define _loop0_101_type 1359
+#define _gather_102_type 1360
+#define _tmp_103_type 1361
+#define _tmp_104_type 1362
+#define _loop0_105_type 1363
+#define _gather_106_type 1364
+#define _tmp_107_type 1365
+#define _tmp_108_type 1366
+#define _tmp_109_type 1367
+#define _tmp_110_type 1368
+#define _tmp_111_type 1369
+#define _loop1_112_type 1370
+#define _tmp_113_type 1371
+#define _tmp_114_type 1372
+#define _tmp_115_type 1373
+#define _tmp_116_type 1374
+#define _tmp_117_type 1375
+#define _loop0_118_type 1376
+#define _loop0_119_type 1377
+#define _tmp_120_type 1378
+#define _tmp_121_type 1379
+#define _tmp_122_type 1380
+#define _tmp_123_type 1381
+#define _tmp_124_type 1382
+#define _tmp_125_type 1383
+#define _tmp_126_type 1384
+#define _tmp_127_type 1385
+#define _tmp_128_type 1386
+#define _loop0_129_type 1387
+#define _gather_130_type 1388
+#define _tmp_131_type 1389
+#define _tmp_132_type 1390
+#define _tmp_133_type 1391
+#define _tmp_134_type 1392
+#define _loop0_135_type 1393
+#define _gather_136_type 1394
+#define _loop0_137_type 1395
+#define _gather_138_type 1396
+#define _loop0_139_type 1397
+#define _gather_140_type 1398
+#define _tmp_141_type 1399
+#define _loop0_142_type 1400
+#define _tmp_143_type 1401
+#define _tmp_144_type 1402
+#define _tmp_145_type 1403
+#define _tmp_146_type 1404
+#define _tmp_147_type 1405
+#define _tmp_148_type 1406
+#define _tmp_149_type 1407
+#define _tmp_150_type 1408
+#define _tmp_151_type 1409
+#define _tmp_152_type 1410
+#define _tmp_153_type 1411
+#define _tmp_154_type 1412
+#define _tmp_155_type 1413
+#define _tmp_156_type 1414
+#define _tmp_157_type 1415
+#define _tmp_158_type 1416
+#define _tmp_159_type 1417
+#define _tmp_160_type 1418
+#define _tmp_161_type 1419
+#define _tmp_162_type 1420
+#define _tmp_163_type 1421
+#define _tmp_164_type 1422
+#define _tmp_165_type 1423
+#define _tmp_166_type 1424
+#define _tmp_167_type 1425
+#define _tmp_168_type 1426
+#define _loop0_169_type 1427
+#define _tmp_170_type 1428
+#define _tmp_171_type 1429
+#define _tmp_172_type 1430
+#define _tmp_173_type 1431
static mod_ty file_rule(Parser *p);
static mod_ty interactive_rule(Parser *p);
@@ -675,6 +679,9 @@ static ResultTokenWithMetadata* fstring_conversion_rule(Parser *p);
static ResultTokenWithMetadata* fstring_full_format_spec_rule(Parser *p);
static expr_ty fstring_format_spec_rule(Parser *p);
static expr_ty fstring_rule(Parser *p);
+static expr_ty tstring_replacement_field_rule(Parser *p);
+static expr_ty tstring_middle_rule(Parser *p);
+static expr_ty tstring_rule(Parser *p);
static expr_ty string_rule(Parser *p);
static expr_ty strings_rule(Parser *p);
static expr_ty list_rule(Parser *p);
@@ -812,28 +819,28 @@ static asdl_seq *_loop0_40_rule(Parser *p);
static asdl_seq *_gather_41_rule(Parser *p);
static void *_tmp_42_rule(Parser *p);
static void *_tmp_43_rule(Parser *p);
-static asdl_seq *_loop0_44_rule(Parser *p);
-static asdl_seq *_gather_45_rule(Parser *p);
-static asdl_seq *_loop0_46_rule(Parser *p);
-static asdl_seq *_gather_47_rule(Parser *p);
-static void *_tmp_48_rule(Parser *p);
-static asdl_seq *_loop0_49_rule(Parser *p);
-static asdl_seq *_gather_50_rule(Parser *p);
-static asdl_seq *_loop0_51_rule(Parser *p);
-static asdl_seq *_gather_52_rule(Parser *p);
-static asdl_seq *_loop0_53_rule(Parser *p);
-static asdl_seq *_gather_54_rule(Parser *p);
-static asdl_seq *_loop1_55_rule(Parser *p);
+static void *_tmp_44_rule(Parser *p);
+static asdl_seq *_loop0_45_rule(Parser *p);
+static asdl_seq *_gather_46_rule(Parser *p);
+static asdl_seq *_loop0_47_rule(Parser *p);
+static asdl_seq *_gather_48_rule(Parser *p);
+static void *_tmp_49_rule(Parser *p);
+static asdl_seq *_loop0_50_rule(Parser *p);
+static asdl_seq *_gather_51_rule(Parser *p);
+static asdl_seq *_loop0_52_rule(Parser *p);
+static asdl_seq *_gather_53_rule(Parser *p);
+static asdl_seq *_loop0_54_rule(Parser *p);
+static asdl_seq *_gather_55_rule(Parser *p);
static asdl_seq *_loop1_56_rule(Parser *p);
-static asdl_seq *_loop0_57_rule(Parser *p);
-static asdl_seq *_gather_58_rule(Parser *p);
-static asdl_seq *_loop1_59_rule(Parser *p);
+static asdl_seq *_loop1_57_rule(Parser *p);
+static asdl_seq *_loop0_58_rule(Parser *p);
+static asdl_seq *_gather_59_rule(Parser *p);
static asdl_seq *_loop1_60_rule(Parser *p);
static asdl_seq *_loop1_61_rule(Parser *p);
-static void *_tmp_62_rule(Parser *p);
-static asdl_seq *_loop0_63_rule(Parser *p);
-static asdl_seq *_gather_64_rule(Parser *p);
-static void *_tmp_65_rule(Parser *p);
+static asdl_seq *_loop1_62_rule(Parser *p);
+static void *_tmp_63_rule(Parser *p);
+static asdl_seq *_loop0_64_rule(Parser *p);
+static asdl_seq *_gather_65_rule(Parser *p);
static void *_tmp_66_rule(Parser *p);
static void *_tmp_67_rule(Parser *p);
static void *_tmp_68_rule(Parser *p);
@@ -847,47 +854,47 @@ static asdl_seq *_loop0_75_rule(Parser *p);
static asdl_seq *_loop1_76_rule(Parser *p);
static asdl_seq *_loop0_77_rule(Parser *p);
static asdl_seq *_loop0_78_rule(Parser *p);
-static asdl_seq *_loop1_79_rule(Parser *p);
-static void *_tmp_80_rule(Parser *p);
-static asdl_seq *_loop0_81_rule(Parser *p);
-static asdl_seq *_gather_82_rule(Parser *p);
-static asdl_seq *_loop1_83_rule(Parser *p);
-static asdl_seq *_loop0_84_rule(Parser *p);
-static void *_tmp_85_rule(Parser *p);
-static asdl_seq *_loop0_86_rule(Parser *p);
-static asdl_seq *_gather_87_rule(Parser *p);
-static void *_tmp_88_rule(Parser *p);
-static asdl_seq *_loop0_89_rule(Parser *p);
-static asdl_seq *_gather_90_rule(Parser *p);
-static asdl_seq *_loop0_91_rule(Parser *p);
-static asdl_seq *_gather_92_rule(Parser *p);
-static asdl_seq *_loop0_93_rule(Parser *p);
+static asdl_seq *_loop0_79_rule(Parser *p);
+static asdl_seq *_loop1_80_rule(Parser *p);
+static void *_tmp_81_rule(Parser *p);
+static asdl_seq *_loop0_82_rule(Parser *p);
+static asdl_seq *_gather_83_rule(Parser *p);
+static asdl_seq *_loop1_84_rule(Parser *p);
+static asdl_seq *_loop0_85_rule(Parser *p);
+static void *_tmp_86_rule(Parser *p);
+static asdl_seq *_loop0_87_rule(Parser *p);
+static asdl_seq *_gather_88_rule(Parser *p);
+static void *_tmp_89_rule(Parser *p);
+static asdl_seq *_loop0_90_rule(Parser *p);
+static asdl_seq *_gather_91_rule(Parser *p);
+static asdl_seq *_loop0_92_rule(Parser *p);
+static asdl_seq *_gather_93_rule(Parser *p);
static asdl_seq *_loop0_94_rule(Parser *p);
-static asdl_seq *_gather_95_rule(Parser *p);
-static asdl_seq *_loop1_96_rule(Parser *p);
-static void *_tmp_97_rule(Parser *p);
-static asdl_seq *_loop0_98_rule(Parser *p);
-static asdl_seq *_gather_99_rule(Parser *p);
-static asdl_seq *_loop0_100_rule(Parser *p);
-static asdl_seq *_gather_101_rule(Parser *p);
-static void *_tmp_102_rule(Parser *p);
+static asdl_seq *_loop0_95_rule(Parser *p);
+static asdl_seq *_gather_96_rule(Parser *p);
+static asdl_seq *_loop1_97_rule(Parser *p);
+static void *_tmp_98_rule(Parser *p);
+static asdl_seq *_loop0_99_rule(Parser *p);
+static asdl_seq *_gather_100_rule(Parser *p);
+static asdl_seq *_loop0_101_rule(Parser *p);
+static asdl_seq *_gather_102_rule(Parser *p);
static void *_tmp_103_rule(Parser *p);
-static asdl_seq *_loop0_104_rule(Parser *p);
-static asdl_seq *_gather_105_rule(Parser *p);
-static void *_tmp_106_rule(Parser *p);
+static void *_tmp_104_rule(Parser *p);
+static asdl_seq *_loop0_105_rule(Parser *p);
+static asdl_seq *_gather_106_rule(Parser *p);
static void *_tmp_107_rule(Parser *p);
static void *_tmp_108_rule(Parser *p);
static void *_tmp_109_rule(Parser *p);
static void *_tmp_110_rule(Parser *p);
-static asdl_seq *_loop1_111_rule(Parser *p);
-static void *_tmp_112_rule(Parser *p);
+static void *_tmp_111_rule(Parser *p);
+static asdl_seq *_loop1_112_rule(Parser *p);
static void *_tmp_113_rule(Parser *p);
static void *_tmp_114_rule(Parser *p);
static void *_tmp_115_rule(Parser *p);
static void *_tmp_116_rule(Parser *p);
-static asdl_seq *_loop0_117_rule(Parser *p);
+static void *_tmp_117_rule(Parser *p);
static asdl_seq *_loop0_118_rule(Parser *p);
-static void *_tmp_119_rule(Parser *p);
+static asdl_seq *_loop0_119_rule(Parser *p);
static void *_tmp_120_rule(Parser *p);
static void *_tmp_121_rule(Parser *p);
static void *_tmp_122_rule(Parser *p);
@@ -896,21 +903,21 @@ static void *_tmp_124_rule(Parser *p);
static void *_tmp_125_rule(Parser *p);
static void *_tmp_126_rule(Parser *p);
static void *_tmp_127_rule(Parser *p);
-static asdl_seq *_loop0_128_rule(Parser *p);
-static asdl_seq *_gather_129_rule(Parser *p);
-static void *_tmp_130_rule(Parser *p);
+static void *_tmp_128_rule(Parser *p);
+static asdl_seq *_loop0_129_rule(Parser *p);
+static asdl_seq *_gather_130_rule(Parser *p);
static void *_tmp_131_rule(Parser *p);
static void *_tmp_132_rule(Parser *p);
static void *_tmp_133_rule(Parser *p);
-static asdl_seq *_loop0_134_rule(Parser *p);
-static asdl_seq *_gather_135_rule(Parser *p);
-static asdl_seq *_loop0_136_rule(Parser *p);
-static asdl_seq *_gather_137_rule(Parser *p);
-static asdl_seq *_loop0_138_rule(Parser *p);
-static asdl_seq *_gather_139_rule(Parser *p);
-static void *_tmp_140_rule(Parser *p);
-static asdl_seq *_loop0_141_rule(Parser *p);
-static void *_tmp_142_rule(Parser *p);
+static void *_tmp_134_rule(Parser *p);
+static asdl_seq *_loop0_135_rule(Parser *p);
+static asdl_seq *_gather_136_rule(Parser *p);
+static asdl_seq *_loop0_137_rule(Parser *p);
+static asdl_seq *_gather_138_rule(Parser *p);
+static asdl_seq *_loop0_139_rule(Parser *p);
+static asdl_seq *_gather_140_rule(Parser *p);
+static void *_tmp_141_rule(Parser *p);
+static asdl_seq *_loop0_142_rule(Parser *p);
static void *_tmp_143_rule(Parser *p);
static void *_tmp_144_rule(Parser *p);
static void *_tmp_145_rule(Parser *p);
@@ -936,11 +943,12 @@ static void *_tmp_164_rule(Parser *p);
static void *_tmp_165_rule(Parser *p);
static void *_tmp_166_rule(Parser *p);
static void *_tmp_167_rule(Parser *p);
-static asdl_seq *_loop0_168_rule(Parser *p);
-static void *_tmp_169_rule(Parser *p);
+static void *_tmp_168_rule(Parser *p);
+static asdl_seq *_loop0_169_rule(Parser *p);
static void *_tmp_170_rule(Parser *p);
static void *_tmp_171_rule(Parser *p);
static void *_tmp_172_rule(Parser *p);
+static void *_tmp_173_rule(Parser *p);
// file: statements? $
@@ -8444,7 +8452,7 @@ literal_pattern_rule(Parser *p)
// literal_expr:
// | signed_number !('+' | '-')
// | complex_number
-// | strings
+// | &(STRING | FSTRING_START | TSTRING_START) strings
// | 'None'
// | 'True'
// | 'False'
@@ -8509,24 +8517,26 @@ literal_expr_rule(Parser *p)
D(fprintf(stderr, "%*c%s literal_expr[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "complex_number"));
}
- { // strings
+ { // &(STRING | FSTRING_START | TSTRING_START) strings
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "strings"));
+ D(fprintf(stderr, "%*c> literal_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_START) strings"));
expr_ty strings_var;
if (
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_43_rule, p)
+ &&
(strings_var = strings_rule(p)) // strings
)
{
- D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "strings"));
+ D(fprintf(stderr, "%*c+ literal_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_START) strings"));
_res = strings_var;
goto done;
}
p->mark = _mark;
D(fprintf(stderr, "%*c%s literal_expr[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "strings"));
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_START) strings"));
}
{ // 'None'
if (p->error_indicator) {
@@ -9079,7 +9089,7 @@ pattern_capture_target_rule(Parser *p)
&&
(name = _PyPegen_name_token(p)) // NAME
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_43_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_44_rule, p)
)
{
D(fprintf(stderr, "%*c+ pattern_capture_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!\"_\" NAME !('.' | '(' | '=')"));
@@ -9194,7 +9204,7 @@ value_pattern_rule(Parser *p)
if (
(attr = attr_rule(p)) // attr
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_43_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_44_rule, p)
)
{
D(fprintf(stderr, "%*c+ value_pattern[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr !('.' | '(' | '=')"));
@@ -9613,7 +9623,7 @@ maybe_sequence_pattern_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_seq * patterns;
if (
- (patterns = _gather_45_rule(p)) // ','.maybe_star_pattern+
+ (patterns = _gather_46_rule(p)) // ','.maybe_star_pattern+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -10021,13 +10031,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_47_var;
+ asdl_seq * _gather_48_var;
if (
- (_gather_47_var = _gather_47_rule(p)) // ','.key_value_pattern+
+ (_gather_48_var = _gather_48_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_47_var;
+ _res = _gather_48_var;
goto done;
}
p->mark = _mark;
@@ -10063,7 +10073,7 @@ key_value_pattern_rule(Parser *p)
void *key;
pattern_ty pattern;
if (
- (key = _tmp_48_rule(p)) // literal_expr | attr
+ (key = _tmp_49_rule(p)) // literal_expr | attr
&&
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
&&
@@ -10391,7 +10401,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_50_rule(p)) // ','.pattern+
+ (args = (asdl_pattern_seq*)_gather_51_rule(p)) // ','.pattern+
)
{
D(fprintf(stderr, "%*c+ positional_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.pattern+"));
@@ -10432,13 +10442,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_52_var;
+ asdl_seq * _gather_53_var;
if (
- (_gather_52_var = _gather_52_rule(p)) // ','.keyword_pattern+
+ (_gather_53_var = _gather_53_rule(p)) // ','.keyword_pattern+
)
{
D(fprintf(stderr, "%*c+ keyword_patterns[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.keyword_pattern+"));
- _res = _gather_52_var;
+ _res = _gather_53_var;
goto done;
}
p->mark = _mark;
@@ -10664,7 +10674,7 @@ type_param_seq_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_type_param_seq* a;
if (
- (a = (asdl_type_param_seq*)_gather_54_rule(p)) // ','.type_param+
+ (a = (asdl_type_param_seq*)_gather_55_rule(p)) // ','.type_param+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -11034,7 +11044,7 @@ expressions_rule(Parser *p)
if (
(a = expression_rule(p)) // expression
&&
- (b = _loop1_55_rule(p)) // ((',' expression))+
+ (b = _loop1_56_rule(p)) // ((',' expression))+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -11422,7 +11432,7 @@ star_expressions_rule(Parser *p)
if (
(a = star_expression_rule(p)) // star_expression
&&
- (b = _loop1_56_rule(p)) // ((',' star_expression))+
+ (b = _loop1_57_rule(p)) // ((',' star_expression))+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -11621,7 +11631,7 @@ star_named_expressions_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_expr_seq* a;
if (
- (a = (asdl_expr_seq*)_gather_58_rule(p)) // ','.star_named_expression+
+ (a = (asdl_expr_seq*)_gather_59_rule(p)) // ','.star_named_expression+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -11917,7 +11927,7 @@ disjunction_rule(Parser *p)
if (
(a = conjunction_rule(p)) // conjunction
&&
- (b = _loop1_59_rule(p)) // (('or' conjunction))+
+ (b = _loop1_60_rule(p)) // (('or' conjunction))+
)
{
D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+"));
@@ -12005,7 +12015,7 @@ conjunction_rule(Parser *p)
if (
(a = inversion_rule(p)) // inversion
&&
- (b = _loop1_60_rule(p)) // (('and' inversion))+
+ (b = _loop1_61_rule(p)) // (('and' inversion))+
)
{
D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+"));
@@ -12177,7 +12187,7 @@ comparison_rule(Parser *p)
if (
(a = bitwise_or_rule(p)) // bitwise_or
&&
- (b = _loop1_61_rule(p)) // compare_op_bitwise_or_pair+
+ (b = _loop1_62_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+"));
@@ -12511,10 +12521,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_62_var;
+ void *_tmp_63_var;
expr_ty a;
if (
- (_tmp_62_var = _tmp_62_rule(p)) // '!='
+ (_tmp_63_var = _tmp_63_rule(p)) // '!='
&&
(a = bitwise_or_rule(p)) // bitwise_or
)
@@ -14562,7 +14572,7 @@ slices_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_expr_seq* a;
if (
- (a = (asdl_expr_seq*)_gather_64_rule(p)) // ','.(slice | starred_expression)+
+ (a = (asdl_expr_seq*)_gather_65_rule(p)) // ','.(slice | starred_expression)+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -14634,7 +14644,7 @@ slice_rule(Parser *p)
&&
(b = expression_rule(p), !p->error_indicator) // expression?
&&
- (c = _tmp_65_rule(p), !p->error_indicator) // [':' expression?]
+ (c = _tmp_66_rule(p), !p->error_indicator) // [':' expression?]
)
{
D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]"));
@@ -14694,7 +14704,7 @@ slice_rule(Parser *p)
// | 'True'
// | 'False'
// | 'None'
-// | &(STRING | FSTRING_START) strings
+// | &(STRING | FSTRING_START | TSTRING_START) strings
// | NUMBER
// | &'(' (tuple | group | genexp)
// | &'[' (list | listcomp)
@@ -14839,26 +14849,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 | FSTRING_START) strings
+ { // &(STRING | FSTRING_START | TSTRING_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 | FSTRING_START) strings"));
+ D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_START) strings"));
expr_ty strings_var;
if (
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_66_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_43_rule, p)
&&
(strings_var = strings_rule(p)) // strings
)
{
- D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START) strings"));
+ D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_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 | FSTRING_START) strings"));
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&(STRING | FSTRING_START | TSTRING_START) strings"));
}
{ // NUMBER
if (p->error_indicator) {
@@ -16376,6 +16386,219 @@ fstring_rule(Parser *p)
return _res;
}
+// tstring_replacement_field:
+// | '{' annotated_rhs '='? fstring_conversion? fstring_full_format_spec? '}'
+// | invalid_replacement_field
+static expr_ty
+tstring_replacement_field_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ 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
+ { // '{' annotated_rhs '='? fstring_conversion? fstring_full_format_spec? '}'
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> tstring_replacement_field[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? fstring_conversion? fstring_full_format_spec? '}'"));
+ Token * _literal;
+ expr_ty a;
+ void *conversion;
+ void *debug_expr;
+ void *format;
+ Token * rbrace;
+ if (
+ (_literal = _PyPegen_expect_token(p, 25)) // token='{'
+ &&
+ (a = annotated_rhs_rule(p)) // annotated_rhs
+ &&
+ (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?
+ &&
+ (rbrace = _PyPegen_expect_token(p, 26)) // token='}'
+ )
+ {
+ D(fprintf(stderr, "%*c+ tstring_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? 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_interpolation ( p , a , debug_expr , conversion , format , rbrace , EXTRA );
+ if (_res == NULL && PyErr_Occurred()) {
+ p->error_indicator = 1;
+ p->level--;
+ return NULL;
+ }
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s tstring_replacement_field[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' annotated_rhs '='? 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> tstring_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+ tstring_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 tstring_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;
+}
+
+// tstring_middle: tstring_replacement_field | FSTRING_MIDDLE
+static expr_ty
+tstring_middle_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ expr_ty _res = NULL;
+ int _mark = p->mark;
+ { // tstring_replacement_field
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> tstring_middle[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring_replacement_field"));
+ expr_ty tstring_replacement_field_var;
+ if (
+ (tstring_replacement_field_var = tstring_replacement_field_rule(p)) // tstring_replacement_field
+ )
+ {
+ D(fprintf(stderr, "%*c+ tstring_middle[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tstring_replacement_field"));
+ _res = tstring_replacement_field_var;
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s tstring_middle[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_replacement_field"));
+ }
+ { // FSTRING_MIDDLE
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> tstring_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+ tstring_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 tstring_middle[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_MIDDLE"));
+ }
+ _res = NULL;
+ done:
+ p->level--;
+ return _res;
+}
+
+// tstring: TSTRING_START tstring_middle* FSTRING_END
+static expr_ty
+tstring_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ expr_ty _res = NULL;
+ if (_PyPegen_is_memoized(p, tstring_type, &_res)) {
+ p->level--;
+ return _res;
+ }
+ int _mark = p->mark;
+ { // TSTRING_START tstring_middle* FSTRING_END
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> tstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TSTRING_START tstring_middle* FSTRING_END"));
+ Token * a;
+ asdl_seq * b;
+ Token * c;
+ if (
+ (a = _PyPegen_expect_token(p, TSTRING_START)) // token='TSTRING_START'
+ &&
+ (b = _loop0_79_rule(p)) // tstring_middle*
+ &&
+ (c = _PyPegen_expect_token(p, FSTRING_END)) // token='FSTRING_END'
+ )
+ {
+ D(fprintf(stderr, "%*c+ tstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TSTRING_START tstring_middle* FSTRING_END"));
+ _res = _PyPegen_template_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 tstring[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TSTRING_START tstring_middle* FSTRING_END"));
+ }
+ _res = NULL;
+ done:
+ _PyPegen_insert_memo(p, _mark, tstring_type, _res);
+ p->level--;
+ return _res;
+}
+
// string: STRING
static expr_ty
string_rule(Parser *p)
@@ -16419,7 +16642,7 @@ string_rule(Parser *p)
return _res;
}
-// strings: ((fstring | string))+
+// strings: ((fstring | string | tstring))+
static expr_ty
strings_rule(Parser *p)
{
@@ -16445,18 +16668,18 @@ strings_rule(Parser *p)
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))+
+ { // ((fstring | string | tstring))+
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string))+"));
+ D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((fstring | string | tstring))+"));
asdl_expr_seq* a;
if (
- (a = (asdl_expr_seq*)_loop1_79_rule(p)) // ((fstring | string))+
+ (a = (asdl_expr_seq*)_loop1_80_rule(p)) // ((fstring | string | tstring))+
)
{
- D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string))+"));
+ D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((fstring | string | tstring))+"));
Token *_token = _PyPegen_get_last_nonnwhitespace_token(p);
if (_token == NULL) {
p->level--;
@@ -16476,7 +16699,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, "((fstring | string))+"));
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((fstring | string | tstring))+"));
}
_res = NULL;
done:
@@ -16586,7 +16809,7 @@ tuple_rule(Parser *p)
if (
(_literal = _PyPegen_expect_token(p, 7)) // token='('
&&
- (a = _tmp_80_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?]
+ (a = _tmp_81_rule(p), !p->error_indicator) // [star_named_expression ',' star_named_expressions?]
&&
(_literal_1 = _PyPegen_expect_token(p, 8)) // token=')'
)
@@ -16801,7 +17024,7 @@ double_starred_kvpairs_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_seq * a;
if (
- (a = _gather_82_rule(p)) // ','.double_starred_kvpair+
+ (a = _gather_83_rule(p)) // ','.double_starred_kvpair+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -16960,7 +17183,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_83_rule(p)) // for_if_clause+
+ (a = (asdl_comprehension_seq*)_loop1_84_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+"));
@@ -17025,7 +17248,7 @@ for_if_clause_rule(Parser *p)
&&
(b = disjunction_rule(p)) // disjunction
&&
- (c = (asdl_expr_seq*)_loop0_84_rule(p)) // (('if' disjunction))*
+ (c = (asdl_expr_seq*)_loop0_85_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))*"));
@@ -17068,7 +17291,7 @@ for_if_clause_rule(Parser *p)
&&
(b = disjunction_rule(p)) // disjunction
&&
- (c = (asdl_expr_seq*)_loop0_84_rule(p)) // (('if' disjunction))*
+ (c = (asdl_expr_seq*)_loop0_85_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))*"));
@@ -17347,7 +17570,7 @@ genexp_rule(Parser *p)
if (
(_literal = _PyPegen_expect_token(p, 7)) // token='('
&&
- (a = _tmp_85_rule(p)) // assignment_expression | expression !':='
+ (a = _tmp_86_rule(p)) // assignment_expression | expression !':='
&&
(b = for_if_clauses_rule(p)) // for_if_clauses
&&
@@ -17596,9 +17819,9 @@ args_rule(Parser *p)
asdl_expr_seq* a;
void *b;
if (
- (a = (asdl_expr_seq*)_gather_87_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+
+ (a = (asdl_expr_seq*)_gather_88_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+
&&
- (b = _tmp_88_rule(p), !p->error_indicator) // [',' kwargs]
+ (b = _tmp_89_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]"));
@@ -17688,11 +17911,11 @@ kwargs_rule(Parser *p)
asdl_seq * a;
asdl_seq * b;
if (
- (a = _gather_90_rule(p)) // ','.kwarg_or_starred+
+ (a = _gather_91_rule(p)) // ','.kwarg_or_starred+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (b = _gather_92_rule(p)) // ','.kwarg_or_double_starred+
+ (b = _gather_93_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+"));
@@ -17714,13 +17937,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_90_var;
+ asdl_seq * _gather_91_var;
if (
- (_gather_90_var = _gather_90_rule(p)) // ','.kwarg_or_starred+
+ (_gather_91_var = _gather_91_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_90_var;
+ _res = _gather_91_var;
goto done;
}
p->mark = _mark;
@@ -17733,13 +17956,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_92_var;
+ asdl_seq * _gather_93_var;
if (
- (_gather_92_var = _gather_92_rule(p)) // ','.kwarg_or_double_starred+
+ (_gather_93_var = _gather_93_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_92_var;
+ _res = _gather_93_var;
goto done;
}
p->mark = _mark;
@@ -18150,7 +18373,7 @@ star_targets_rule(Parser *p)
if (
(a = star_target_rule(p)) // star_target
&&
- (b = _loop0_93_rule(p)) // ((',' star_target))*
+ (b = _loop0_94_rule(p)) // ((',' star_target))*
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -18206,7 +18429,7 @@ star_targets_list_seq_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_expr_seq* a;
if (
- (a = (asdl_expr_seq*)_gather_95_rule(p)) // ','.star_target+
+ (a = (asdl_expr_seq*)_gather_96_rule(p)) // ','.star_target+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -18256,7 +18479,7 @@ star_targets_tuple_seq_rule(Parser *p)
if (
(a = star_target_rule(p)) // star_target
&&
- (b = _loop1_96_rule(p)) // ((',' star_target))+
+ (b = _loop1_97_rule(p)) // ((',' star_target))+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -18344,7 +18567,7 @@ star_target_rule(Parser *p)
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (a = _tmp_97_rule(p)) // !'*' star_target
+ (a = _tmp_98_rule(p)) // !'*' star_target
)
{
D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)"));
@@ -19267,7 +19490,7 @@ del_targets_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_expr_seq* a;
if (
- (a = (asdl_expr_seq*)_gather_99_rule(p)) // ','.del_target+
+ (a = (asdl_expr_seq*)_gather_100_rule(p)) // ','.del_target+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
@@ -19625,7 +19848,7 @@ type_expressions_rule(Parser *p)
expr_ty b;
expr_ty c;
if (
- (a = _gather_101_rule(p)) // ','.expression+
+ (a = _gather_102_rule(p)) // ','.expression+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
@@ -19664,7 +19887,7 @@ type_expressions_rule(Parser *p)
asdl_seq * a;
expr_ty b;
if (
- (a = _gather_101_rule(p)) // ','.expression+
+ (a = _gather_102_rule(p)) // ','.expression+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
@@ -19697,7 +19920,7 @@ type_expressions_rule(Parser *p)
asdl_seq * a;
expr_ty b;
if (
- (a = _gather_101_rule(p)) // ','.expression+
+ (a = _gather_102_rule(p)) // ','.expression+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
@@ -19817,7 +20040,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_101_rule(p)) // ','.expression+
+ (a = (asdl_expr_seq*)_gather_102_rule(p)) // ','.expression+
)
{
D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+"));
@@ -19868,7 +20091,7 @@ func_type_comment_rule(Parser *p)
&&
(t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT'
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_102_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_103_rule, p)
)
{
D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)"));
@@ -19954,15 +20177,15 @@ invalid_arguments_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) ',' ','.(starred_expression !'=')+"));
- asdl_seq * _gather_105_var;
- void *_tmp_103_var;
+ asdl_seq * _gather_106_var;
+ void *_tmp_104_var;
Token * a;
if (
- (_tmp_103_var = _tmp_103_rule(p)) // (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs
+ (_tmp_104_var = _tmp_104_rule(p)) // (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs
&&
(a = _PyPegen_expect_token(p, 12)) // token=','
&&
- (_gather_105_var = _gather_105_rule(p)) // ','.(starred_expression !'=')+
+ (_gather_106_var = _gather_106_rule(p)) // ','.(starred_expression !'=')+
)
{
D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) ',' ','.(starred_expression !'=')+"));
@@ -19996,7 +20219,7 @@ invalid_arguments_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (_opt_var = _tmp_106_rule(p), !p->error_indicator) // [args | expression for_if_clauses]
+ (_opt_var = _tmp_107_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]"));
@@ -20056,13 +20279,13 @@ invalid_arguments_rule(Parser *p)
expr_ty a;
Token * b;
if (
- (_opt_var = _tmp_107_rule(p), !p->error_indicator) // [(args ',')]
+ (_opt_var = _tmp_108_rule(p), !p->error_indicator) // [(args ',')]
&&
(a = _PyPegen_name_token(p)) // NAME
&&
(b = _PyPegen_expect_token(p, 22)) // token='='
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_108_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_109_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "[(args ',')] NAME '=' &(',' | ')')"));
@@ -20200,7 +20423,7 @@ invalid_kwarg_rule(Parser *p)
Token* a;
Token * b;
if (
- (a = (Token*)_tmp_109_rule(p)) // 'True' | 'False' | 'None'
+ (a = (Token*)_tmp_110_rule(p)) // 'True' | 'False' | 'None'
&&
(b = _PyPegen_expect_token(p, 22)) // token='='
)
@@ -20260,7 +20483,7 @@ invalid_kwarg_rule(Parser *p)
expr_ty a;
Token * b;
if (
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_110_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_111_rule, p)
&&
(a = expression_rule(p)) // expression
&&
@@ -20607,7 +20830,7 @@ invalid_expression_rule(Parser *p)
if (
(string_var = _PyPegen_string_token(p)) // STRING
&&
- (a = _loop1_111_rule(p)) // ((!STRING expression_without_invalid))+
+ (a = _loop1_112_rule(p)) // ((!STRING expression_without_invalid))+
&&
(string_var_1 = _PyPegen_string_token(p)) // STRING
)
@@ -20634,7 +20857,7 @@ invalid_expression_rule(Parser *p)
expr_ty a;
expr_ty b;
if (
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_112_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_113_rule, p)
&&
(a = disjunction_rule(p)) // disjunction
&&
@@ -20670,7 +20893,7 @@ invalid_expression_rule(Parser *p)
&&
(b = disjunction_rule(p)) // disjunction
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_113_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_114_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction !('else' | ':')"));
@@ -20733,7 +20956,7 @@ invalid_expression_rule(Parser *p)
expr_ty b;
stmt_ty c;
if (
- (a = (stmt_ty)_tmp_114_rule(p)) // pass_stmt | break_stmt | continue_stmt
+ (a = (stmt_ty)_tmp_115_rule(p)) // pass_stmt | break_stmt | continue_stmt
&&
(_keyword = _PyPegen_expect_token(p, 677)) // token='if'
&&
@@ -20778,7 +21001,7 @@ invalid_expression_rule(Parser *p)
)
{
D(fprintf(stderr, "%*c+ invalid_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' &FSTRING_MIDDLE"));
- _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( a , b , "f-string: lambda expressions are not allowed without parentheses" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_RANGE ( a , b , "%c-string: lambda expressions are not allowed without parentheses" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -20862,7 +21085,7 @@ invalid_named_expression_rule(Parser *p)
&&
(b = bitwise_or_rule(p)) // bitwise_or
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_115_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_116_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' bitwise_or !('=' | ':=')"));
@@ -20888,7 +21111,7 @@ invalid_named_expression_rule(Parser *p)
Token * b;
expr_ty bitwise_or_var;
if (
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_116_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_117_rule, p)
&&
(a = bitwise_or_rule(p)) // bitwise_or
&&
@@ -20896,7 +21119,7 @@ invalid_named_expression_rule(Parser *p)
&&
(bitwise_or_var = bitwise_or_rule(p)) // bitwise_or
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_115_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_116_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 !('=' | ':=')"));
@@ -20976,7 +21199,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_117_var;
+ asdl_seq * _loop0_118_var;
expr_ty a;
expr_ty expression_var;
if (
@@ -20984,7 +21207,7 @@ invalid_assignment_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (_loop0_117_var = _loop0_117_rule(p)) // star_named_expressions*
+ (_loop0_118_var = _loop0_118_rule(p)) // star_named_expressions*
&&
(_literal_1 = _PyPegen_expect_token(p, 11)) // token=':'
&&
@@ -21041,10 +21264,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_118_var;
+ asdl_seq * _loop0_119_var;
expr_ty a;
if (
- (_loop0_118_var = _loop0_118_rule(p)) // ((star_targets '='))*
+ (_loop0_119_var = _loop0_119_rule(p)) // ((star_targets '='))*
&&
(a = star_expressions_rule(p)) // star_expressions
&&
@@ -21071,10 +21294,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_118_var;
+ asdl_seq * _loop0_119_var;
expr_ty a;
if (
- (_loop0_118_var = _loop0_118_rule(p)) // ((star_targets '='))*
+ (_loop0_119_var = _loop0_119_rule(p)) // ((star_targets '='))*
&&
(a = yield_expr_rule(p)) // yield_expr
&&
@@ -21330,11 +21553,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_119_var;
+ void *_tmp_120_var;
expr_ty a;
asdl_comprehension_seq* for_if_clauses_var;
if (
- (_tmp_119_var = _tmp_119_rule(p)) // '[' | '(' | '{'
+ (_tmp_120_var = _tmp_120_rule(p)) // '[' | '(' | '{'
&&
(a = starred_expression_rule(p)) // starred_expression
&&
@@ -21361,12 +21584,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_120_var;
+ void *_tmp_121_var;
expr_ty a;
asdl_expr_seq* b;
asdl_comprehension_seq* for_if_clauses_var;
if (
- (_tmp_120_var = _tmp_120_rule(p)) // '[' | '{'
+ (_tmp_121_var = _tmp_121_rule(p)) // '[' | '{'
&&
(a = star_named_expression_rule(p)) // star_named_expression
&&
@@ -21396,12 +21619,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_120_var;
+ void *_tmp_121_var;
expr_ty a;
Token * b;
asdl_comprehension_seq* for_if_clauses_var;
if (
- (_tmp_120_var = _tmp_120_rule(p)) // '[' | '{'
+ (_tmp_121_var = _tmp_121_rule(p)) // '[' | '{'
&&
(a = star_named_expression_rule(p)) // star_named_expression
&&
@@ -21537,10 +21760,10 @@ 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* '/'"));
asdl_seq * _loop0_32_var;
- void *_tmp_121_var;
+ void *_tmp_122_var;
Token * a;
if (
- (_tmp_121_var = _tmp_121_rule(p)) // slash_no_default | slash_with_default
+ (_tmp_122_var = _tmp_122_rule(p)) // slash_no_default | slash_with_default
&&
(_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default*
&&
@@ -21642,16 +21865,16 @@ invalid_parameters_rule(Parser *p)
asdl_seq * _loop0_32_var_1;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
- void *_tmp_122_var;
+ void *_tmp_123_var;
Token * a;
if (
- (_opt_var = _tmp_121_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)]
+ (_opt_var = _tmp_122_rule(p), !p->error_indicator) // [(slash_no_default | slash_with_default)]
&&
(_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default*
&&
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_122_var = _tmp_122_rule(p)) // ',' | param_no_default
+ (_tmp_123_var = _tmp_123_rule(p)) // ',' | param_no_default
&&
(_loop0_32_var_1 = _loop0_32_rule(p)) // param_maybe_default*
&&
@@ -21730,7 +21953,7 @@ invalid_default_rule(Parser *p)
if (
(a = _PyPegen_expect_token(p, 22)) // token='='
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_123_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_124_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' &(')' | ',')"));
@@ -21775,12 +21998,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_124_var;
+ void *_tmp_125_var;
Token * a;
if (
(a = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_124_var = _tmp_124_rule(p)) // ')' | ',' (')' | '**')
+ (_tmp_125_var = _tmp_125_rule(p)) // ')' | ',' (')' | '**')
)
{
D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))"));
@@ -21864,19 +22087,19 @@ 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_32_var;
- void *_tmp_125_var;
- void *_tmp_125_var_1;
+ void *_tmp_126_var;
+ void *_tmp_126_var_1;
Token * a;
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_125_var = _tmp_125_rule(p)) // param_no_default | ','
+ (_tmp_126_var = _tmp_126_rule(p)) // param_no_default | ','
&&
(_loop0_32_var = _loop0_32_rule(p)) // param_maybe_default*
&&
(a = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_125_var_1 = _tmp_125_rule(p)) // param_no_default | ','
+ (_tmp_126_var_1 = _tmp_126_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 | ',')"));
@@ -21991,7 +22214,7 @@ invalid_kwds_rule(Parser *p)
&&
(_literal_1 = _PyPegen_expect_token(p, 12)) // token=','
&&
- (a = (Token*)_tmp_126_rule(p)) // '*' | '**' | '/'
+ (a = (Token*)_tmp_127_rule(p)) // '*' | '**' | '/'
)
{
D(fprintf(stderr, "%*c+ invalid_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param ',' ('*' | '**' | '/')"));
@@ -22128,10 +22351,10 @@ 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* '/'"));
asdl_seq * _loop0_75_var;
- void *_tmp_127_var;
+ void *_tmp_128_var;
Token * a;
if (
- (_tmp_127_var = _tmp_127_rule(p)) // lambda_slash_no_default | lambda_slash_with_default
+ (_tmp_128_var = _tmp_128_rule(p)) // lambda_slash_no_default | lambda_slash_with_default
&&
(_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default*
&&
@@ -22191,7 +22414,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_param_no_default* '(' ','.lambda_param+ ','? ')'"));
- asdl_seq * _gather_129_var;
+ asdl_seq * _gather_130_var;
asdl_seq * _loop0_71_var;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
@@ -22202,7 +22425,7 @@ invalid_lambda_parameters_rule(Parser *p)
&&
(a = _PyPegen_expect_token(p, 7)) // token='('
&&
- (_gather_129_var = _gather_129_rule(p)) // ','.lambda_param+
+ (_gather_130_var = _gather_130_rule(p)) // ','.lambda_param+
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
&&
@@ -22233,16 +22456,16 @@ invalid_lambda_parameters_rule(Parser *p)
asdl_seq * _loop0_75_var_1;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
- void *_tmp_130_var;
+ void *_tmp_131_var;
Token * a;
if (
- (_opt_var = _tmp_127_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)]
+ (_opt_var = _tmp_128_rule(p), !p->error_indicator) // [(lambda_slash_no_default | lambda_slash_with_default)]
&&
(_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default*
&&
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_130_var = _tmp_130_rule(p)) // ',' | lambda_param_no_default
+ (_tmp_131_var = _tmp_131_rule(p)) // ',' | lambda_param_no_default
&&
(_loop0_75_var_1 = _loop0_75_rule(p)) // lambda_param_maybe_default*
&&
@@ -22385,11 +22608,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_131_var;
+ void *_tmp_132_var;
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_131_var = _tmp_131_rule(p)) // ':' | ',' (':' | '**')
+ (_tmp_132_var = _tmp_132_rule(p)) // ':' | ',' (':' | '**')
)
{
D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))"));
@@ -22443,19 +22666,19 @@ 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_75_var;
- void *_tmp_132_var;
- void *_tmp_132_var_1;
+ void *_tmp_133_var;
+ void *_tmp_133_var_1;
Token * a;
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_132_var = _tmp_132_rule(p)) // lambda_param_no_default | ','
+ (_tmp_133_var = _tmp_133_rule(p)) // lambda_param_no_default | ','
&&
(_loop0_75_var = _loop0_75_rule(p)) // lambda_param_maybe_default*
&&
(a = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_132_var_1 = _tmp_132_rule(p)) // lambda_param_no_default | ','
+ (_tmp_133_var_1 = _tmp_133_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 | ',')"));
@@ -22573,7 +22796,7 @@ invalid_lambda_kwds_rule(Parser *p)
&&
(_literal_1 = _PyPegen_expect_token(p, 12)) // token=','
&&
- (a = (Token*)_tmp_126_rule(p)) // '*' | '**' | '/'
+ (a = (Token*)_tmp_127_rule(p)) // '*' | '**' | '/'
)
{
D(fprintf(stderr, "%*c+ invalid_lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param ',' ('*' | '**' | '/')"));
@@ -22723,13 +22946,13 @@ invalid_for_if_clause_rule(Parser *p)
Token * _keyword;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
- void *_tmp_133_var;
+ void *_tmp_134_var;
if (
(_opt_var = _PyPegen_expect_token(p, 691), !p->error_indicator) // 'async'?
&&
(_keyword = _PyPegen_expect_token(p, 687)) // token='for'
&&
- (_tmp_133_var = _tmp_133_rule(p)) // bitwise_or ((',' bitwise_or))* ','?
+ (_tmp_134_var = _tmp_134_rule(p)) // bitwise_or ((',' bitwise_or))* ','?
&&
_PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 688) // token='in'
)
@@ -22904,14 +23127,14 @@ invalid_import_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> invalid_import[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' ','.dotted_name+ 'from' dotted_name"));
- asdl_seq * _gather_135_var;
+ asdl_seq * _gather_136_var;
Token * _keyword;
Token * a;
expr_ty dotted_name_var;
if (
(a = _PyPegen_expect_token(p, 631)) // token='import'
&&
- (_gather_135_var = _gather_135_rule(p)) // ','.dotted_name+
+ (_gather_136_var = _gather_136_rule(p)) // ','.dotted_name+
&&
(_keyword = _PyPegen_expect_token(p, 630)) // token='from'
&&
@@ -23058,7 +23281,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_137_var;
+ asdl_seq * _gather_138_var;
Token * _keyword;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
@@ -23068,7 +23291,7 @@ invalid_with_stmt_rule(Parser *p)
&&
(_keyword = _PyPegen_expect_token(p, 642)) // token='with'
&&
- (_gather_137_var = _gather_137_rule(p)) // ','.(expression ['as' star_target])+
+ (_gather_138_var = _gather_138_rule(p)) // ','.(expression ['as' star_target])+
&&
(newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE'
)
@@ -23092,7 +23315,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_139_var;
+ asdl_seq * _gather_140_var;
Token * _keyword;
Token * _literal;
Token * _literal_1;
@@ -23108,7 +23331,7 @@ invalid_with_stmt_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 7)) // token='('
&&
- (_gather_139_var = _gather_139_rule(p)) // ','.(expressions ['as' star_target])+
+ (_gather_140_var = _gather_140_rule(p)) // ','.(expressions ['as' star_target])+
&&
(_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
&&
@@ -23157,7 +23380,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_137_var;
+ asdl_seq * _gather_138_var;
Token * _literal;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
@@ -23168,7 +23391,7 @@ invalid_with_stmt_indent_rule(Parser *p)
&&
(a = _PyPegen_expect_token(p, 642)) // token='with'
&&
- (_gather_137_var = _gather_137_rule(p)) // ','.(expression ['as' star_target])+
+ (_gather_138_var = _gather_138_rule(p)) // ','.(expression ['as' star_target])+
&&
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
&&
@@ -23196,7 +23419,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_139_var;
+ asdl_seq * _gather_140_var;
Token * _literal;
Token * _literal_1;
Token * _literal_2;
@@ -23213,7 +23436,7 @@ invalid_with_stmt_indent_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 7)) // token='('
&&
- (_gather_139_var = _gather_139_rule(p)) // ','.(expressions ['as' star_target])+
+ (_gather_140_var = _gather_140_rule(p)) // ','.(expressions ['as' star_target])+
&&
(_opt_var_1 = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
&&
@@ -23310,7 +23533,7 @@ invalid_try_stmt_rule(Parser *p)
&&
(block_var = block_rule(p)) // block
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_140_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_141_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block !('except' | 'finally')"));
@@ -23335,7 +23558,7 @@ invalid_try_stmt_rule(Parser *p)
Token * _keyword;
Token * _literal;
Token * _literal_1;
- asdl_seq * _loop0_141_var;
+ asdl_seq * _loop0_142_var;
asdl_seq * _loop1_37_var;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
@@ -23347,7 +23570,7 @@ invalid_try_stmt_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
&&
- (_loop0_141_var = _loop0_141_rule(p)) // block*
+ (_loop0_142_var = _loop0_142_rule(p)) // block*
&&
(_loop1_37_var = _loop1_37_rule(p)) // except_block+
&&
@@ -23384,7 +23607,7 @@ invalid_try_stmt_rule(Parser *p)
Token * _keyword;
Token * _literal;
Token * _literal_1;
- asdl_seq * _loop0_141_var;
+ asdl_seq * _loop0_142_var;
asdl_seq * _loop1_38_var;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
@@ -23394,13 +23617,13 @@ invalid_try_stmt_rule(Parser *p)
&&
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
&&
- (_loop0_141_var = _loop0_141_rule(p)) // block*
+ (_loop0_142_var = _loop0_142_rule(p)) // block*
&&
(_loop1_38_var = _loop1_38_rule(p)) // except_star_block+
&&
(a = _PyPegen_expect_token(p, 672)) // token='except'
&&
- (_opt_var = _tmp_142_rule(p), !p->error_indicator) // [expression ['as' NAME]]
+ (_opt_var = _tmp_143_rule(p), !p->error_indicator) // [expression ['as' NAME]]
&&
(_literal_1 = _PyPegen_expect_token(p, 11)) // token=':'
)
@@ -23689,14 +23912,14 @@ invalid_except_star_stmt_rule(Parser *p)
}
D(fprintf(stderr, "%*c> invalid_except_star_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')"));
Token * _literal;
- void *_tmp_143_var;
+ void *_tmp_144_var;
Token * a;
if (
(a = _PyPegen_expect_token(p, 672)) // token='except'
&&
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
&&
- (_tmp_143_var = _tmp_143_rule(p)) // NEWLINE | ':'
+ (_tmp_144_var = _tmp_144_rule(p)) // NEWLINE | ':'
)
{
D(fprintf(stderr, "%*c+ invalid_except_star_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' '*' (NEWLINE | ':')"));
@@ -24293,7 +24516,7 @@ invalid_class_argument_pattern_rule(Parser *p)
asdl_pattern_seq* a;
asdl_seq* keyword_patterns_var;
if (
- (_opt_var = _tmp_144_rule(p), !p->error_indicator) // [positional_patterns ',']
+ (_opt_var = _tmp_145_rule(p), !p->error_indicator) // [positional_patterns ',']
&&
(keyword_patterns_var = keyword_patterns_rule(p)) // keyword_patterns
&&
@@ -24992,11 +25215,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_82_var;
+ asdl_seq * _gather_83_var;
Token * _literal;
void *invalid_kvpair_var;
if (
- (_gather_82_var = _gather_82_rule(p)) // ','.double_starred_kvpair+
+ (_gather_83_var = _gather_83_rule(p)) // ','.double_starred_kvpair+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
@@ -25004,7 +25227,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_82_var, _literal, invalid_kvpair_var);
+ _res = _PyPegen_dummy_name(p, _gather_83_var, _literal, invalid_kvpair_var);
goto done;
}
p->mark = _mark;
@@ -25057,7 +25280,7 @@ invalid_double_starred_kvpairs_rule(Parser *p)
&&
(a = _PyPegen_expect_token(p, 11)) // token=':'
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_145_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_146_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')"));
@@ -25167,7 +25390,7 @@ invalid_kvpair_rule(Parser *p)
&&
(a = _PyPegen_expect_token(p, 11)) // token=':'
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_145_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_146_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' &('}' | ',')"));
@@ -25323,7 +25546,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
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 '='" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "%c-string: valid expression required before '='" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25350,7 +25573,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
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 '!'" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "%c-string: valid expression required before '!'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25377,7 +25600,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
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 ':'" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "%c-string: valid expression required before ':'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25404,7 +25627,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
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 '}'" );
+ _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "%c-string: valid expression required before '}'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25430,7 +25653,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' !annotated_rhs"));
- _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting a valid expression after '{'" );
+ _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting a valid expression after '{'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25455,11 +25678,11 @@ invalid_replacement_field_rule(Parser *p)
&&
(annotated_rhs_var = annotated_rhs_rule(p)) // annotated_rhs
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_146_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_147_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs !('=' | '!' | ':' | '}')"));
- _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '=', or '!', or ':', or '}'" );
+ _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting '=', or '!', or ':', or '}'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25487,11 +25710,11 @@ invalid_replacement_field_rule(Parser *p)
&&
(_literal_1 = _PyPegen_expect_token(p, 22)) // token='='
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_147_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_148_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '=' !('!' | ':' | '}')"));
- _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '!', or ':', or '}'" );
+ _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting '!', or ':', or '}'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25551,13 +25774,13 @@ invalid_replacement_field_rule(Parser *p)
&&
(_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='?
&&
- (_opt_var_1 = _tmp_148_rule(p), !p->error_indicator) // ['!' NAME]
+ (_opt_var_1 = _tmp_149_rule(p), !p->error_indicator) // ['!' NAME]
&&
- _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_149_rule, p)
+ _PyPegen_lookahead(0, (void *(*)(Parser *)) _tmp_150_rule, p)
)
{
D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? ['!' NAME] !(':' | '}')"));
- _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting ':' or '}'" );
+ _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting ':' or '}'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25590,7 +25813,7 @@ invalid_replacement_field_rule(Parser *p)
&&
(_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='?
&&
- (_opt_var_1 = _tmp_148_rule(p), !p->error_indicator) // ['!' NAME]
+ (_opt_var_1 = _tmp_149_rule(p), !p->error_indicator) // ['!' NAME]
&&
(_literal_1 = _PyPegen_expect_token(p, 11)) // token=':'
&&
@@ -25600,7 +25823,7 @@ invalid_replacement_field_rule(Parser *p)
)
{
D(fprintf(stderr, "%*c+ invalid_replacement_field[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'}'"));
- _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}', or format specs" );
+ _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting '}', or format specs" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25631,13 +25854,13 @@ invalid_replacement_field_rule(Parser *p)
&&
(_opt_var = _PyPegen_expect_token(p, 22), !p->error_indicator) // '='?
&&
- (_opt_var_1 = _tmp_148_rule(p), !p->error_indicator) // ['!' NAME]
+ (_opt_var_1 = _tmp_149_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, "'{' annotated_rhs '='? ['!' NAME] !'}'"));
- _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "f-string: expecting '}'" );
+ _res = PyErr_Occurred ( ) ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: expecting '}'" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25678,11 +25901,11 @@ invalid_conversion_character_rule(Parser *p)
if (
(_literal = _PyPegen_expect_token(p, 54)) // token='!'
&&
- _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_149_rule, p)
+ _PyPegen_lookahead(1, (void *(*)(Parser *)) _tmp_150_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" );
+ _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: missing conversion character" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25708,7 +25931,7 @@ invalid_conversion_character_rule(Parser *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" );
+ _res = RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN ( "%c-string: invalid conversion character" , TOK_GET_MODE ( p -> tok ) -> tstring ? 't' : 'f' );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -25745,14 +25968,14 @@ invalid_arithmetic_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> invalid_arithmetic[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum ('+' | '-' | '*' | '/' | '%' | '//' | '@') 'not' inversion"));
- void *_tmp_150_var;
+ void *_tmp_151_var;
Token * a;
expr_ty b;
expr_ty sum_var;
if (
(sum_var = sum_rule(p)) // sum
&&
- (_tmp_150_var = _tmp_150_rule(p)) // '+' | '-' | '*' | '/' | '%' | '//' | '@'
+ (_tmp_151_var = _tmp_151_rule(p)) // '+' | '-' | '*' | '/' | '%' | '//' | '@'
&&
(a = _PyPegen_expect_token(p, 696)) // token='not'
&&
@@ -25797,11 +26020,11 @@ invalid_factor_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> invalid_factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('+' | '-' | '~') 'not' factor"));
- void *_tmp_151_var;
+ void *_tmp_152_var;
Token * a;
expr_ty b;
if (
- (_tmp_151_var = _tmp_151_rule(p)) // '+' | '-' | '~'
+ (_tmp_152_var = _tmp_152_rule(p)) // '+' | '-' | '~'
&&
(a = _PyPegen_expect_token(p, 696)) // token='not'
&&
@@ -26575,12 +26798,12 @@ _loop1_12_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> _loop1_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')"));
- void *_tmp_152_var;
+ void *_tmp_153_var;
while (
- (_tmp_152_var = _tmp_152_rule(p)) // star_targets '='
+ (_tmp_153_var = _tmp_153_rule(p)) // star_targets '='
)
{
- _res = _tmp_152_var;
+ _res = _tmp_153_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -26913,12 +27136,12 @@ _loop0_18_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> _loop0_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')"));
- void *_tmp_153_var;
+ void *_tmp_154_var;
while (
- (_tmp_153_var = _tmp_153_rule(p)) // '.' | '...'
+ (_tmp_154_var = _tmp_154_rule(p)) // '.' | '...'
)
{
- _res = _tmp_153_var;
+ _res = _tmp_154_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -26980,12 +27203,12 @@ _loop1_19_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> _loop1_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')"));
- void *_tmp_153_var;
+ void *_tmp_154_var;
while (
- (_tmp_153_var = _tmp_153_rule(p)) // '.' | '...'
+ (_tmp_154_var = _tmp_154_rule(p)) // '.' | '...'
)
{
- _res = _tmp_153_var;
+ _res = _tmp_154_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -27332,12 +27555,12 @@ _loop1_25_rule(Parser *p)
return NULL;
}
D(fprintf(stderr, "%*c> _loop1_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)"));
- void *_tmp_154_var;
+ void *_tmp_155_var;
while (
- (_tmp_154_var = _tmp_154_rule(p)) // '@' named_expression NEWLINE
+ (_tmp_155_var = _tmp_155_rule(p)) // '@' named_expression NEWLINE
)
{
- _res = _tmp_154_var;
+ _res = _tmp_155_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -28471,9 +28694,85 @@ _tmp_42_rule(Parser *p)
return _res;
}
-// _tmp_43: '.' | '(' | '='
+// _tmp_43: STRING | FSTRING_START | TSTRING_START
static void *
_tmp_43_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ 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_43[%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_43[%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_43[%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_43[%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_43[%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_43[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START"));
+ }
+ { // TSTRING_START
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> _tmp_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TSTRING_START"));
+ Token * tstring_start_var;
+ if (
+ (tstring_start_var = _PyPegen_expect_token(p, TSTRING_START)) // token='TSTRING_START'
+ )
+ {
+ D(fprintf(stderr, "%*c+ _tmp_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TSTRING_START"));
+ _res = tstring_start_var;
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s _tmp_43[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TSTRING_START"));
+ }
+ _res = NULL;
+ done:
+ p->level--;
+ return _res;
+}
+
+// _tmp_44: '.' | '(' | '='
+static void *
+_tmp_44_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28489,18 +28788,18 @@ _tmp_43_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'"));
+ D(fprintf(stderr, "%*c> _tmp_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 23)) // token='.'
)
{
- D(fprintf(stderr, "%*c+ _tmp_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'"));
+ D(fprintf(stderr, "%*c+ _tmp_44[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_43[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_44[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'"));
}
{ // '('
@@ -28508,18 +28807,18 @@ _tmp_43_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('"));
+ D(fprintf(stderr, "%*c> _tmp_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 7)) // token='('
)
{
- D(fprintf(stderr, "%*c+ _tmp_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('"));
+ D(fprintf(stderr, "%*c+ _tmp_44[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_43[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_44[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('"));
}
{ // '='
@@ -28527,18 +28826,18 @@ _tmp_43_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='"));
+ D(fprintf(stderr, "%*c> _tmp_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 22)) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='"));
+ D(fprintf(stderr, "%*c+ _tmp_44[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_43[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_44[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='"));
}
_res = NULL;
@@ -28547,9 +28846,9 @@ _tmp_43_rule(Parser *p)
return _res;
}
-// _loop0_44: ',' maybe_star_pattern
+// _loop0_45: ',' maybe_star_pattern
static asdl_seq *
-_loop0_44_rule(Parser *p)
+_loop0_45_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28574,7 +28873,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, "',' maybe_star_pattern"));
+ D(fprintf(stderr, "%*c> _loop0_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' maybe_star_pattern"));
Token * _literal;
pattern_ty elem;
while (
@@ -28606,7 +28905,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, "',' maybe_star_pattern"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -28623,9 +28922,9 @@ _loop0_44_rule(Parser *p)
return _seq;
}
-// _gather_45: maybe_star_pattern _loop0_44
+// _gather_46: maybe_star_pattern _loop0_45
static asdl_seq *
-_gather_45_rule(Parser *p)
+_gather_46_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28636,27 +28935,27 @@ _gather_45_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // maybe_star_pattern _loop0_44
+ { // maybe_star_pattern _loop0_45
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_44"));
+ D(fprintf(stderr, "%*c> _gather_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_45"));
pattern_ty elem;
asdl_seq * seq;
if (
(elem = maybe_star_pattern_rule(p)) // maybe_star_pattern
&&
- (seq = _loop0_44_rule(p)) // _loop0_44
+ (seq = _loop0_45_rule(p)) // _loop0_45
)
{
- D(fprintf(stderr, "%*c+ _gather_45[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_44"));
+ D(fprintf(stderr, "%*c+ _gather_46[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "maybe_star_pattern _loop0_45"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_45[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_44"));
+ D(fprintf(stderr, "%*c%s _gather_46[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "maybe_star_pattern _loop0_45"));
}
_res = NULL;
done:
@@ -28664,9 +28963,9 @@ _gather_45_rule(Parser *p)
return _res;
}
-// _loop0_46: ',' key_value_pattern
+// _loop0_47: ',' key_value_pattern
static asdl_seq *
-_loop0_46_rule(Parser *p)
+_loop0_47_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28691,7 +28990,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, "',' key_value_pattern"));
+ D(fprintf(stderr, "%*c> _loop0_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' key_value_pattern"));
Token * _literal;
KeyPatternPair* elem;
while (
@@ -28723,7 +29022,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, "',' key_value_pattern"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -28740,9 +29039,9 @@ _loop0_46_rule(Parser *p)
return _seq;
}
-// _gather_47: key_value_pattern _loop0_46
+// _gather_48: key_value_pattern _loop0_47
static asdl_seq *
-_gather_47_rule(Parser *p)
+_gather_48_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28753,27 +29052,27 @@ _gather_47_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // key_value_pattern _loop0_46
+ { // key_value_pattern _loop0_47
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_46"));
+ D(fprintf(stderr, "%*c> _gather_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_47"));
KeyPatternPair* elem;
asdl_seq * seq;
if (
(elem = key_value_pattern_rule(p)) // key_value_pattern
&&
- (seq = _loop0_46_rule(p)) // _loop0_46
+ (seq = _loop0_47_rule(p)) // _loop0_47
)
{
- D(fprintf(stderr, "%*c+ _gather_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_46"));
+ D(fprintf(stderr, "%*c+ _gather_48[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "key_value_pattern _loop0_47"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_47[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_46"));
+ D(fprintf(stderr, "%*c%s _gather_48[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "key_value_pattern _loop0_47"));
}
_res = NULL;
done:
@@ -28781,9 +29080,9 @@ _gather_47_rule(Parser *p)
return _res;
}
-// _tmp_48: literal_expr | attr
+// _tmp_49: literal_expr | attr
static void *
-_tmp_48_rule(Parser *p)
+_tmp_49_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28799,18 +29098,18 @@ _tmp_48_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "literal_expr"));
+ D(fprintf(stderr, "%*c> _tmp_49[%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_48[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "literal_expr"));
+ D(fprintf(stderr, "%*c+ _tmp_49[%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_48[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_49[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "literal_expr"));
}
{ // attr
@@ -28818,18 +29117,18 @@ _tmp_48_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "attr"));
+ D(fprintf(stderr, "%*c> _tmp_49[%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_48[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "attr"));
+ D(fprintf(stderr, "%*c+ _tmp_49[%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_48[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_49[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "attr"));
}
_res = NULL;
@@ -28838,9 +29137,9 @@ _tmp_48_rule(Parser *p)
return _res;
}
-// _loop0_49: ',' pattern
+// _loop0_50: ',' pattern
static asdl_seq *
-_loop0_49_rule(Parser *p)
+_loop0_50_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28865,7 +29164,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, "',' pattern"));
+ D(fprintf(stderr, "%*c> _loop0_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' pattern"));
Token * _literal;
pattern_ty elem;
while (
@@ -28897,7 +29196,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, "',' pattern"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -28914,9 +29213,9 @@ _loop0_49_rule(Parser *p)
return _seq;
}
-// _gather_50: pattern _loop0_49
+// _gather_51: pattern _loop0_50
static asdl_seq *
-_gather_50_rule(Parser *p)
+_gather_51_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28927,27 +29226,27 @@ _gather_50_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // pattern _loop0_49
+ { // pattern _loop0_50
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_49"));
+ D(fprintf(stderr, "%*c> _gather_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pattern _loop0_50"));
pattern_ty elem;
asdl_seq * seq;
if (
(elem = pattern_rule(p)) // pattern
&&
- (seq = _loop0_49_rule(p)) // _loop0_49
+ (seq = _loop0_50_rule(p)) // _loop0_50
)
{
- D(fprintf(stderr, "%*c+ _gather_50[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_49"));
+ D(fprintf(stderr, "%*c+ _gather_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pattern _loop0_50"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_50[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_49"));
+ D(fprintf(stderr, "%*c%s _gather_51[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pattern _loop0_50"));
}
_res = NULL;
done:
@@ -28955,9 +29254,9 @@ _gather_50_rule(Parser *p)
return _res;
}
-// _loop0_51: ',' keyword_pattern
+// _loop0_52: ',' keyword_pattern
static asdl_seq *
-_loop0_51_rule(Parser *p)
+_loop0_52_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -28982,7 +29281,7 @@ _loop0_51_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern"));
+ D(fprintf(stderr, "%*c> _loop0_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' keyword_pattern"));
Token * _literal;
KeyPatternPair* elem;
while (
@@ -29014,7 +29313,7 @@ _loop0_51_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_51[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_52[%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);
@@ -29031,9 +29330,9 @@ _loop0_51_rule(Parser *p)
return _seq;
}
-// _gather_52: keyword_pattern _loop0_51
+// _gather_53: keyword_pattern _loop0_52
static asdl_seq *
-_gather_52_rule(Parser *p)
+_gather_53_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29044,27 +29343,27 @@ _gather_52_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // keyword_pattern _loop0_51
+ { // keyword_pattern _loop0_52
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_51"));
+ D(fprintf(stderr, "%*c> _gather_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_52"));
KeyPatternPair* elem;
asdl_seq * seq;
if (
(elem = keyword_pattern_rule(p)) // keyword_pattern
&&
- (seq = _loop0_51_rule(p)) // _loop0_51
+ (seq = _loop0_52_rule(p)) // _loop0_52
)
{
- D(fprintf(stderr, "%*c+ _gather_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_51"));
+ D(fprintf(stderr, "%*c+ _gather_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "keyword_pattern _loop0_52"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_52[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_51"));
+ D(fprintf(stderr, "%*c%s _gather_53[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "keyword_pattern _loop0_52"));
}
_res = NULL;
done:
@@ -29072,9 +29371,9 @@ _gather_52_rule(Parser *p)
return _res;
}
-// _loop0_53: ',' type_param
+// _loop0_54: ',' type_param
static asdl_seq *
-_loop0_53_rule(Parser *p)
+_loop0_54_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29099,7 +29398,7 @@ _loop0_53_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' type_param"));
+ D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' type_param"));
Token * _literal;
type_param_ty elem;
while (
@@ -29131,7 +29430,7 @@ _loop0_53_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' type_param"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -29148,9 +29447,9 @@ _loop0_53_rule(Parser *p)
return _seq;
}
-// _gather_54: type_param _loop0_53
+// _gather_55: type_param _loop0_54
static asdl_seq *
-_gather_54_rule(Parser *p)
+_gather_55_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29161,27 +29460,27 @@ _gather_54_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // type_param _loop0_53
+ { // type_param _loop0_54
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "type_param _loop0_53"));
+ D(fprintf(stderr, "%*c> _gather_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "type_param _loop0_54"));
type_param_ty elem;
asdl_seq * seq;
if (
(elem = type_param_rule(p)) // type_param
&&
- (seq = _loop0_53_rule(p)) // _loop0_53
+ (seq = _loop0_54_rule(p)) // _loop0_54
)
{
- D(fprintf(stderr, "%*c+ _gather_54[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "type_param _loop0_53"));
+ D(fprintf(stderr, "%*c+ _gather_55[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "type_param _loop0_54"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_54[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "type_param _loop0_53"));
+ D(fprintf(stderr, "%*c%s _gather_55[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "type_param _loop0_54"));
}
_res = NULL;
done:
@@ -29189,9 +29488,9 @@ _gather_54_rule(Parser *p)
return _res;
}
-// _loop1_55: (',' expression)
+// _loop1_56: (',' expression)
static asdl_seq *
-_loop1_55_rule(Parser *p)
+_loop1_56_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29216,7 +29515,7 @@ _loop1_55_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)"));
+ D(fprintf(stderr, "%*c> _loop1_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)"));
void *_tmp_17_var;
while (
(_tmp_17_var = _tmp_17_rule(p)) // ',' expression
@@ -29239,7 +29538,7 @@ _loop1_55_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_55[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_56[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)"));
}
if (_n == 0 || p->error_indicator) {
@@ -29261,9 +29560,9 @@ _loop1_55_rule(Parser *p)
return _seq;
}
-// _loop1_56: (',' star_expression)
+// _loop1_57: (',' star_expression)
static asdl_seq *
-_loop1_56_rule(Parser *p)
+_loop1_57_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29288,13 +29587,13 @@ _loop1_56_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)"));
- void *_tmp_155_var;
+ D(fprintf(stderr, "%*c> _loop1_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)"));
+ void *_tmp_156_var;
while (
- (_tmp_155_var = _tmp_155_rule(p)) // ',' star_expression
+ (_tmp_156_var = _tmp_156_rule(p)) // ',' star_expression
)
{
- _res = _tmp_155_var;
+ _res = _tmp_156_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -29311,7 +29610,7 @@ _loop1_56_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_56[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_57[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)"));
}
if (_n == 0 || p->error_indicator) {
@@ -29333,9 +29632,9 @@ _loop1_56_rule(Parser *p)
return _seq;
}
-// _loop0_57: ',' star_named_expression
+// _loop0_58: ',' star_named_expression
static asdl_seq *
-_loop0_57_rule(Parser *p)
+_loop0_58_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29360,7 +29659,7 @@ _loop0_57_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression"));
+ D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression"));
Token * _literal;
expr_ty elem;
while (
@@ -29392,7 +29691,7 @@ _loop0_57_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_58[%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);
@@ -29409,9 +29708,9 @@ _loop0_57_rule(Parser *p)
return _seq;
}
-// _gather_58: star_named_expression _loop0_57
+// _gather_59: star_named_expression _loop0_58
static asdl_seq *
-_gather_58_rule(Parser *p)
+_gather_59_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29422,27 +29721,27 @@ _gather_58_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // star_named_expression _loop0_57
+ { // star_named_expression _loop0_58
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_57"));
+ D(fprintf(stderr, "%*c> _gather_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_58"));
expr_ty elem;
asdl_seq * seq;
if (
(elem = star_named_expression_rule(p)) // star_named_expression
&&
- (seq = _loop0_57_rule(p)) // _loop0_57
+ (seq = _loop0_58_rule(p)) // _loop0_58
)
{
- D(fprintf(stderr, "%*c+ _gather_58[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_57"));
+ D(fprintf(stderr, "%*c+ _gather_59[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_58"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_58[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_57"));
+ D(fprintf(stderr, "%*c%s _gather_59[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_58"));
}
_res = NULL;
done:
@@ -29450,9 +29749,9 @@ _gather_58_rule(Parser *p)
return _res;
}
-// _loop1_59: ('or' conjunction)
+// _loop1_60: ('or' conjunction)
static asdl_seq *
-_loop1_59_rule(Parser *p)
+_loop1_60_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29477,13 +29776,13 @@ _loop1_59_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)"));
- void *_tmp_156_var;
+ D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)"));
+ void *_tmp_157_var;
while (
- (_tmp_156_var = _tmp_156_rule(p)) // 'or' conjunction
+ (_tmp_157_var = _tmp_157_rule(p)) // 'or' conjunction
)
{
- _res = _tmp_156_var;
+ _res = _tmp_157_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -29500,7 +29799,7 @@ _loop1_59_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_59[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)"));
}
if (_n == 0 || p->error_indicator) {
@@ -29522,9 +29821,9 @@ _loop1_59_rule(Parser *p)
return _seq;
}
-// _loop1_60: ('and' inversion)
+// _loop1_61: ('and' inversion)
static asdl_seq *
-_loop1_60_rule(Parser *p)
+_loop1_61_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29549,13 +29848,13 @@ _loop1_60_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)"));
- void *_tmp_157_var;
+ D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)"));
+ void *_tmp_158_var;
while (
- (_tmp_157_var = _tmp_157_rule(p)) // 'and' inversion
+ (_tmp_158_var = _tmp_158_rule(p)) // 'and' inversion
)
{
- _res = _tmp_157_var;
+ _res = _tmp_158_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -29572,7 +29871,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, "('and' inversion)"));
}
if (_n == 0 || p->error_indicator) {
@@ -29594,9 +29893,9 @@ _loop1_60_rule(Parser *p)
return _seq;
}
-// _loop1_61: compare_op_bitwise_or_pair
+// _loop1_62: compare_op_bitwise_or_pair
static asdl_seq *
-_loop1_61_rule(Parser *p)
+_loop1_62_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29621,7 +29920,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, "compare_op_bitwise_or_pair"));
+ D(fprintf(stderr, "%*c> _loop1_62[%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
@@ -29644,7 +29943,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, "compare_op_bitwise_or_pair"));
}
if (_n == 0 || p->error_indicator) {
@@ -29666,9 +29965,9 @@ _loop1_61_rule(Parser *p)
return _seq;
}
-// _tmp_62: '!='
+// _tmp_63: '!='
static void *
-_tmp_62_rule(Parser *p)
+_tmp_63_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29684,13 +29983,13 @@ _tmp_62_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='"));
+ D(fprintf(stderr, "%*c> _tmp_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='"));
Token * tok;
if (
(tok = _PyPegen_expect_token(p, 28)) // token='!='
)
{
- D(fprintf(stderr, "%*c+ _tmp_62[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='"));
+ D(fprintf(stderr, "%*c+ _tmp_63[%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;
@@ -29700,7 +29999,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, "'!='"));
}
_res = NULL;
@@ -29709,9 +30008,9 @@ _tmp_62_rule(Parser *p)
return _res;
}
-// _loop0_63: ',' (slice | starred_expression)
+// _loop0_64: ',' (slice | starred_expression)
static asdl_seq *
-_loop0_63_rule(Parser *p)
+_loop0_64_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29736,13 +30035,13 @@ _loop0_63_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (slice | starred_expression)"));
+ D(fprintf(stderr, "%*c> _loop0_64[%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_158_rule(p)) // slice | starred_expression
+ (elem = _tmp_159_rule(p)) // slice | starred_expression
)
{
_res = elem;
@@ -29768,7 +30067,7 @@ _loop0_63_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_63[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_64[%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);
@@ -29785,9 +30084,9 @@ _loop0_63_rule(Parser *p)
return _seq;
}
-// _gather_64: (slice | starred_expression) _loop0_63
+// _gather_65: (slice | starred_expression) _loop0_64
static asdl_seq *
-_gather_64_rule(Parser *p)
+_gather_65_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29798,27 +30097,27 @@ _gather_64_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // (slice | starred_expression) _loop0_63
+ { // (slice | starred_expression) _loop0_64
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_63"));
+ D(fprintf(stderr, "%*c> _gather_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_64"));
void *elem;
asdl_seq * seq;
if (
- (elem = _tmp_158_rule(p)) // slice | starred_expression
+ (elem = _tmp_159_rule(p)) // slice | starred_expression
&&
- (seq = _loop0_63_rule(p)) // _loop0_63
+ (seq = _loop0_64_rule(p)) // _loop0_64
)
{
- D(fprintf(stderr, "%*c+ _gather_64[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_63"));
+ D(fprintf(stderr, "%*c+ _gather_65[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(slice | starred_expression) _loop0_64"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_64[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_63"));
+ D(fprintf(stderr, "%*c%s _gather_65[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(slice | starred_expression) _loop0_64"));
}
_res = NULL;
done:
@@ -29826,9 +30125,9 @@ _gather_64_rule(Parser *p)
return _res;
}
-// _tmp_65: ':' expression?
+// _tmp_66: ':' expression?
static void *
-_tmp_65_rule(Parser *p)
+_tmp_66_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -29844,7 +30143,7 @@ _tmp_65_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?"));
+ D(fprintf(stderr, "%*c> _tmp_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?"));
Token * _literal;
void *d;
if (
@@ -29853,7 +30152,7 @@ _tmp_65_rule(Parser *p)
(d = expression_rule(p), !p->error_indicator) // expression?
)
{
- D(fprintf(stderr, "%*c+ _tmp_65[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?"));
+ D(fprintf(stderr, "%*c+ _tmp_66[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?"));
_res = d;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -29863,65 +30162,8 @@ _tmp_65_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_65[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?"));
- }
- _res = NULL;
- done:
- p->level--;
- return _res;
-}
-
-// _tmp_66: STRING | FSTRING_START
-static void *
-_tmp_66_rule(Parser *p)
-{
- if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
- _Pypegen_stack_overflow(p);
- }
- 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_66[%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_66[%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_66[%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_66[%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_66[%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_66[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "FSTRING_START"));
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?"));
}
_res = NULL;
done:
@@ -30308,7 +30550,146 @@ _loop0_72_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default"));
+ D(fprintf(stderr, "%*c> _loop0_72[%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_72[%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 (Py_ssize_t i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]);
+ PyMem_Free(_children);
+ p->level--;
+ return _seq;
+}
+
+// _loop1_73: lambda_param_no_default
+static asdl_seq *
+_loop1_73_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ 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> _loop1_73[%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 _loop1_73[%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);
+ p->error_indicator = 1;
+ PyErr_NoMemory();
+ p->level--;
+ return NULL;
+ }
+ for (Py_ssize_t i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]);
+ PyMem_Free(_children);
+ p->level--;
+ return _seq;
+}
+
+// _loop1_74: lambda_param_with_default
+static asdl_seq *
+_loop1_74_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
+ _Pypegen_stack_overflow(p);
+ }
+ 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> _loop1_74[%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
@@ -30331,76 +30712,9 @@ _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 _loop1_74[%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 (Py_ssize_t i = 0; i < _n; i++) asdl_seq_SET_UNTYPED(_seq, i, _children[i]);
- PyMem_Free(_children);
- p->level--;
- return _seq;
-}
-
-// _loop1_73: lambda_param_no_default
-static asdl_seq *
-_loop1_73_rule(Parser *p)
-{
- if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
- _Pypegen_stack_overflow(p);
- }
- 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> _loop1_73[%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 _loop1_73[%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--;
@@ -30420,9 +30734,9 @@ _loop1_73_rule(Parser *p)
return _seq;
}
-// _loop1_74: lambda_param_with_default
+// _loop0_75: lambda_param_maybe_default
static asdl_seq *
-_loop1_74_rule(Parser *p)
+_loop0_75_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30442,18 +30756,18 @@ _loop1_74_rule(Parser *p)
}
Py_ssize_t _children_capacity = 1;
Py_ssize_t _n = 0;
- { // lambda_param_with_default
+ { // lambda_param_maybe_default
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default"));
- NameDefaultPair* lambda_param_with_default_var;
+ D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default"));
+ NameDefaultPair* lambda_param_maybe_default_var;
while (
- (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default
+ (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default
)
{
- _res = lambda_param_with_default_var;
+ _res = lambda_param_maybe_default_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -30470,13 +30784,8 @@ _loop1_74_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_74[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default"));
- }
- if (_n == 0 || p->error_indicator) {
- PyMem_Free(_children);
- p->level--;
- return NULL;
+ D(fprintf(stderr, "%*c%s _loop0_75[%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) {
@@ -30492,9 +30801,9 @@ _loop1_74_rule(Parser *p)
return _seq;
}
-// _loop0_75: lambda_param_maybe_default
+// _loop1_76: lambda_param_maybe_default
static asdl_seq *
-_loop0_75_rule(Parser *p)
+_loop1_76_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30519,7 +30828,7 @@ _loop0_75_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default"));
+ D(fprintf(stderr, "%*c> _loop1_76[%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
@@ -30542,9 +30851,14 @@ _loop0_75_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_76[%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) {
PyMem_Free(_children);
@@ -30559,9 +30873,9 @@ _loop0_75_rule(Parser *p)
return _seq;
}
-// _loop1_76: lambda_param_maybe_default
+// _loop0_77: fstring_format_spec
static asdl_seq *
-_loop1_76_rule(Parser *p)
+_loop0_77_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30581,18 +30895,18 @@ _loop1_76_rule(Parser *p)
}
Py_ssize_t _children_capacity = 1;
Py_ssize_t _n = 0;
- { // lambda_param_maybe_default
+ { // fstring_format_spec
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default"));
- NameDefaultPair* lambda_param_maybe_default_var;
+ D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec"));
+ expr_ty fstring_format_spec_var;
while (
- (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default
+ (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec
)
{
- _res = lambda_param_maybe_default_var;
+ _res = fstring_format_spec_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -30609,13 +30923,8 @@ _loop1_76_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_76[%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;
+ D(fprintf(stderr, "%*c%s _loop0_77[%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) {
@@ -30631,9 +30940,9 @@ _loop1_76_rule(Parser *p)
return _seq;
}
-// _loop0_77: fstring_format_spec
+// _loop0_78: fstring_middle
static asdl_seq *
-_loop0_77_rule(Parser *p)
+_loop0_78_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30653,18 +30962,18 @@ _loop0_77_rule(Parser *p)
}
Py_ssize_t _children_capacity = 1;
Py_ssize_t _n = 0;
- { // fstring_format_spec
+ { // fstring_middle
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_format_spec"));
- expr_ty fstring_format_spec_var;
+ D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle"));
+ expr_ty fstring_middle_var;
while (
- (fstring_format_spec_var = fstring_format_spec_rule(p)) // fstring_format_spec
+ (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle
)
{
- _res = fstring_format_spec_var;
+ _res = fstring_middle_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -30681,8 +30990,8 @@ _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, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec"));
+ D(fprintf(stderr, "%*c%s _loop0_78[%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) {
@@ -30698,9 +31007,9 @@ _loop0_77_rule(Parser *p)
return _seq;
}
-// _loop0_78: fstring_middle
+// _loop0_79: tstring_middle
static asdl_seq *
-_loop0_78_rule(Parser *p)
+_loop0_79_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30720,18 +31029,18 @@ _loop0_78_rule(Parser *p)
}
Py_ssize_t _children_capacity = 1;
Py_ssize_t _n = 0;
- { // fstring_middle
+ { // tstring_middle
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "fstring_middle"));
- expr_ty fstring_middle_var;
+ D(fprintf(stderr, "%*c> _loop0_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring_middle"));
+ expr_ty tstring_middle_var;
while (
- (fstring_middle_var = fstring_middle_rule(p)) // fstring_middle
+ (tstring_middle_var = tstring_middle_rule(p)) // tstring_middle
)
{
- _res = fstring_middle_var;
+ _res = tstring_middle_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -30748,8 +31057,8 @@ _loop0_78_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle"));
+ D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_middle"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
if (!_seq) {
@@ -30765,9 +31074,9 @@ _loop0_78_rule(Parser *p)
return _seq;
}
-// _loop1_79: (fstring | string)
+// _loop1_80: (fstring | string | tstring)
static asdl_seq *
-_loop1_79_rule(Parser *p)
+_loop1_80_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30787,18 +31096,18 @@ _loop1_79_rule(Parser *p)
}
Py_ssize_t _children_capacity = 1;
Py_ssize_t _n = 0;
- { // (fstring | string)
+ { // (fstring | string | tstring)
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string)"));
- void *_tmp_159_var;
+ D(fprintf(stderr, "%*c> _loop1_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(fstring | string | tstring)"));
+ void *_tmp_160_var;
while (
- (_tmp_159_var = _tmp_159_rule(p)) // fstring | string
+ (_tmp_160_var = _tmp_160_rule(p)) // fstring | string | tstring
)
{
- _res = _tmp_159_var;
+ _res = _tmp_160_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -30815,8 +31124,8 @@ _loop1_79_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_79[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)"));
+ D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string | tstring)"));
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -30837,9 +31146,9 @@ _loop1_79_rule(Parser *p)
return _seq;
}
-// _tmp_80: star_named_expression ',' star_named_expressions?
+// _tmp_81: star_named_expression ',' star_named_expressions?
static void *
-_tmp_80_rule(Parser *p)
+_tmp_81_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30855,7 +31164,7 @@ _tmp_80_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?"));
+ D(fprintf(stderr, "%*c> _tmp_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?"));
Token * _literal;
expr_ty y;
void *z;
@@ -30867,7 +31176,7 @@ _tmp_80_rule(Parser *p)
(z = star_named_expressions_rule(p), !p->error_indicator) // star_named_expressions?
)
{
- D(fprintf(stderr, "%*c+ _tmp_80[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?"));
+ D(fprintf(stderr, "%*c+ _tmp_81[%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;
@@ -30877,7 +31186,7 @@ _tmp_80_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_80[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_81[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?"));
}
_res = NULL;
@@ -30886,9 +31195,9 @@ _tmp_80_rule(Parser *p)
return _res;
}
-// _loop0_81: ',' double_starred_kvpair
+// _loop0_82: ',' double_starred_kvpair
static asdl_seq *
-_loop0_81_rule(Parser *p)
+_loop0_82_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30913,7 +31222,7 @@ _loop0_81_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair"));
+ D(fprintf(stderr, "%*c> _loop0_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair"));
Token * _literal;
KeyValuePair* elem;
while (
@@ -30945,7 +31254,7 @@ _loop0_81_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_81[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_82[%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);
@@ -30962,9 +31271,9 @@ _loop0_81_rule(Parser *p)
return _seq;
}
-// _gather_82: double_starred_kvpair _loop0_81
+// _gather_83: double_starred_kvpair _loop0_82
static asdl_seq *
-_gather_82_rule(Parser *p)
+_gather_83_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -30975,27 +31284,27 @@ _gather_82_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // double_starred_kvpair _loop0_81
+ { // double_starred_kvpair _loop0_82
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_81"));
+ D(fprintf(stderr, "%*c> _gather_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_82"));
KeyValuePair* elem;
asdl_seq * seq;
if (
(elem = double_starred_kvpair_rule(p)) // double_starred_kvpair
&&
- (seq = _loop0_81_rule(p)) // _loop0_81
+ (seq = _loop0_82_rule(p)) // _loop0_82
)
{
- D(fprintf(stderr, "%*c+ _gather_82[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_81"));
+ D(fprintf(stderr, "%*c+ _gather_83[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_82"));
_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, "double_starred_kvpair _loop0_81"));
+ D(fprintf(stderr, "%*c%s _gather_83[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_82"));
}
_res = NULL;
done:
@@ -31003,9 +31312,9 @@ _gather_82_rule(Parser *p)
return _res;
}
-// _loop1_83: for_if_clause
+// _loop1_84: for_if_clause
static asdl_seq *
-_loop1_83_rule(Parser *p)
+_loop1_84_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31030,7 +31339,7 @@ _loop1_83_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause"));
+ D(fprintf(stderr, "%*c> _loop1_84[%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
@@ -31053,7 +31362,7 @@ _loop1_83_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_84[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause"));
}
if (_n == 0 || p->error_indicator) {
@@ -31075,9 +31384,9 @@ _loop1_83_rule(Parser *p)
return _seq;
}
-// _loop0_84: ('if' disjunction)
+// _loop0_85: ('if' disjunction)
static asdl_seq *
-_loop0_84_rule(Parser *p)
+_loop0_85_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31102,13 +31411,13 @@ _loop0_84_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)"));
- void *_tmp_160_var;
+ D(fprintf(stderr, "%*c> _loop0_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)"));
+ void *_tmp_161_var;
while (
- (_tmp_160_var = _tmp_160_rule(p)) // 'if' disjunction
+ (_tmp_161_var = _tmp_161_rule(p)) // 'if' disjunction
)
{
- _res = _tmp_160_var;
+ _res = _tmp_161_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -31125,7 +31434,7 @@ _loop0_84_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_85[%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);
@@ -31142,9 +31451,9 @@ _loop0_84_rule(Parser *p)
return _seq;
}
-// _tmp_85: assignment_expression | expression !':='
+// _tmp_86: assignment_expression | expression !':='
static void *
-_tmp_85_rule(Parser *p)
+_tmp_86_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31160,18 +31469,18 @@ _tmp_85_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment_expression"));
+ D(fprintf(stderr, "%*c> _tmp_86[%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_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment_expression"));
+ D(fprintf(stderr, "%*c+ _tmp_86[%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_85[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_86[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment_expression"));
}
{ // expression !':='
@@ -31179,7 +31488,7 @@ _tmp_85_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='"));
+ D(fprintf(stderr, "%*c> _tmp_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='"));
expr_ty expression_var;
if (
(expression_var = expression_rule(p)) // expression
@@ -31187,12 +31496,12 @@ _tmp_85_rule(Parser *p)
_PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':='
)
{
- D(fprintf(stderr, "%*c+ _tmp_85[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='"));
+ D(fprintf(stderr, "%*c+ _tmp_86[%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_85[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_86[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='"));
}
_res = NULL;
@@ -31201,9 +31510,9 @@ _tmp_85_rule(Parser *p)
return _res;
}
-// _loop0_86: ',' (starred_expression | (assignment_expression | expression !':=') !'=')
+// _loop0_87: ',' (starred_expression | (assignment_expression | expression !':=') !'=')
static asdl_seq *
-_loop0_86_rule(Parser *p)
+_loop0_87_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31228,13 +31537,13 @@ _loop0_86_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')"));
+ D(fprintf(stderr, "%*c> _loop0_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')"));
Token * _literal;
void *elem;
while (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (elem = _tmp_161_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'='
+ (elem = _tmp_162_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'='
)
{
_res = elem;
@@ -31260,7 +31569,7 @@ _loop0_86_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_87[%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);
@@ -31277,10 +31586,10 @@ _loop0_86_rule(Parser *p)
return _seq;
}
-// _gather_87:
-// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_86
+// _gather_88:
+// | (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_87
static asdl_seq *
-_gather_87_rule(Parser *p)
+_gather_88_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31291,27 +31600,27 @@ _gather_87_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_86
+ { // (starred_expression | (assignment_expression | expression !':=') !'=') _loop0_87
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_86"));
+ D(fprintf(stderr, "%*c> _gather_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_87"));
void *elem;
asdl_seq * seq;
if (
- (elem = _tmp_161_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'='
+ (elem = _tmp_162_rule(p)) // starred_expression | (assignment_expression | expression !':=') !'='
&&
- (seq = _loop0_86_rule(p)) // _loop0_86
+ (seq = _loop0_87_rule(p)) // _loop0_87
)
{
- D(fprintf(stderr, "%*c+ _gather_87[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_86"));
+ D(fprintf(stderr, "%*c+ _gather_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_87"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_87[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_86"));
+ D(fprintf(stderr, "%*c%s _gather_88[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | (assignment_expression | expression !':=') !'=') _loop0_87"));
}
_res = NULL;
done:
@@ -31319,9 +31628,9 @@ _gather_87_rule(Parser *p)
return _res;
}
-// _tmp_88: ',' kwargs
+// _tmp_89: ',' kwargs
static void *
-_tmp_88_rule(Parser *p)
+_tmp_89_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31337,7 +31646,7 @@ _tmp_88_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs"));
+ D(fprintf(stderr, "%*c> _tmp_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs"));
Token * _literal;
asdl_seq* k;
if (
@@ -31346,7 +31655,7 @@ _tmp_88_rule(Parser *p)
(k = kwargs_rule(p)) // kwargs
)
{
- D(fprintf(stderr, "%*c+ _tmp_88[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs"));
+ D(fprintf(stderr, "%*c+ _tmp_89[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs"));
_res = k;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -31356,7 +31665,7 @@ _tmp_88_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_88[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_89[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs"));
}
_res = NULL;
@@ -31365,9 +31674,9 @@ _tmp_88_rule(Parser *p)
return _res;
}
-// _loop0_89: ',' kwarg_or_starred
+// _loop0_90: ',' kwarg_or_starred
static asdl_seq *
-_loop0_89_rule(Parser *p)
+_loop0_90_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31392,7 +31701,7 @@ _loop0_89_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred"));
+ D(fprintf(stderr, "%*c> _loop0_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred"));
Token * _literal;
KeywordOrStarred* elem;
while (
@@ -31424,7 +31733,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, "',' kwarg_or_starred"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -31441,9 +31750,9 @@ _loop0_89_rule(Parser *p)
return _seq;
}
-// _gather_90: kwarg_or_starred _loop0_89
+// _gather_91: kwarg_or_starred _loop0_90
static asdl_seq *
-_gather_90_rule(Parser *p)
+_gather_91_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31454,27 +31763,27 @@ _gather_90_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // kwarg_or_starred _loop0_89
+ { // kwarg_or_starred _loop0_90
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_89"));
+ D(fprintf(stderr, "%*c> _gather_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_90"));
KeywordOrStarred* elem;
asdl_seq * seq;
if (
(elem = kwarg_or_starred_rule(p)) // kwarg_or_starred
&&
- (seq = _loop0_89_rule(p)) // _loop0_89
+ (seq = _loop0_90_rule(p)) // _loop0_90
)
{
- D(fprintf(stderr, "%*c+ _gather_90[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_89"));
+ D(fprintf(stderr, "%*c+ _gather_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_90"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_90[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_89"));
+ D(fprintf(stderr, "%*c%s _gather_91[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_90"));
}
_res = NULL;
done:
@@ -31482,9 +31791,9 @@ _gather_90_rule(Parser *p)
return _res;
}
-// _loop0_91: ',' kwarg_or_double_starred
+// _loop0_92: ',' kwarg_or_double_starred
static asdl_seq *
-_loop0_91_rule(Parser *p)
+_loop0_92_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31509,7 +31818,7 @@ _loop0_91_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred"));
+ D(fprintf(stderr, "%*c> _loop0_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred"));
Token * _literal;
KeywordOrStarred* elem;
while (
@@ -31541,7 +31850,7 @@ _loop0_91_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_91[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_92[%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);
@@ -31558,9 +31867,9 @@ _loop0_91_rule(Parser *p)
return _seq;
}
-// _gather_92: kwarg_or_double_starred _loop0_91
+// _gather_93: kwarg_or_double_starred _loop0_92
static asdl_seq *
-_gather_92_rule(Parser *p)
+_gather_93_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31571,27 +31880,27 @@ _gather_92_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // kwarg_or_double_starred _loop0_91
+ { // kwarg_or_double_starred _loop0_92
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_91"));
+ D(fprintf(stderr, "%*c> _gather_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_92"));
KeywordOrStarred* elem;
asdl_seq * seq;
if (
(elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred
&&
- (seq = _loop0_91_rule(p)) // _loop0_91
+ (seq = _loop0_92_rule(p)) // _loop0_92
)
{
- D(fprintf(stderr, "%*c+ _gather_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_91"));
+ D(fprintf(stderr, "%*c+ _gather_93[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_92"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_92[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_91"));
+ D(fprintf(stderr, "%*c%s _gather_93[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_92"));
}
_res = NULL;
done:
@@ -31599,9 +31908,9 @@ _gather_92_rule(Parser *p)
return _res;
}
-// _loop0_93: (',' star_target)
+// _loop0_94: (',' star_target)
static asdl_seq *
-_loop0_93_rule(Parser *p)
+_loop0_94_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31626,13 +31935,13 @@ _loop0_93_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)"));
- void *_tmp_162_var;
+ D(fprintf(stderr, "%*c> _loop0_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)"));
+ void *_tmp_163_var;
while (
- (_tmp_162_var = _tmp_162_rule(p)) // ',' star_target
+ (_tmp_163_var = _tmp_163_rule(p)) // ',' star_target
)
{
- _res = _tmp_162_var;
+ _res = _tmp_163_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -31649,7 +31958,7 @@ _loop0_93_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_94[%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);
@@ -31666,9 +31975,9 @@ _loop0_93_rule(Parser *p)
return _seq;
}
-// _loop0_94: ',' star_target
+// _loop0_95: ',' star_target
static asdl_seq *
-_loop0_94_rule(Parser *p)
+_loop0_95_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31693,7 +32002,7 @@ _loop0_94_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target"));
+ D(fprintf(stderr, "%*c> _loop0_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target"));
Token * _literal;
expr_ty elem;
while (
@@ -31725,7 +32034,7 @@ _loop0_94_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_94[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_95[%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);
@@ -31742,9 +32051,9 @@ _loop0_94_rule(Parser *p)
return _seq;
}
-// _gather_95: star_target _loop0_94
+// _gather_96: star_target _loop0_95
static asdl_seq *
-_gather_95_rule(Parser *p)
+_gather_96_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31755,27 +32064,27 @@ _gather_95_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // star_target _loop0_94
+ { // star_target _loop0_95
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_94"));
+ D(fprintf(stderr, "%*c> _gather_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_95"));
expr_ty elem;
asdl_seq * seq;
if (
(elem = star_target_rule(p)) // star_target
&&
- (seq = _loop0_94_rule(p)) // _loop0_94
+ (seq = _loop0_95_rule(p)) // _loop0_95
)
{
- D(fprintf(stderr, "%*c+ _gather_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_94"));
+ D(fprintf(stderr, "%*c+ _gather_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_95"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_95[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_94"));
+ D(fprintf(stderr, "%*c%s _gather_96[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_95"));
}
_res = NULL;
done:
@@ -31783,9 +32092,9 @@ _gather_95_rule(Parser *p)
return _res;
}
-// _loop1_96: (',' star_target)
+// _loop1_97: (',' star_target)
static asdl_seq *
-_loop1_96_rule(Parser *p)
+_loop1_97_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31810,13 +32119,13 @@ _loop1_96_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)"));
- void *_tmp_162_var;
+ D(fprintf(stderr, "%*c> _loop1_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)"));
+ void *_tmp_163_var;
while (
- (_tmp_162_var = _tmp_162_rule(p)) // ',' star_target
+ (_tmp_163_var = _tmp_163_rule(p)) // ',' star_target
)
{
- _res = _tmp_162_var;
+ _res = _tmp_163_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -31833,7 +32142,7 @@ _loop1_96_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_96[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_97[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)"));
}
if (_n == 0 || p->error_indicator) {
@@ -31855,9 +32164,9 @@ _loop1_96_rule(Parser *p)
return _seq;
}
-// _tmp_97: !'*' star_target
+// _tmp_98: !'*' star_target
static void *
-_tmp_97_rule(Parser *p)
+_tmp_98_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31873,7 +32182,7 @@ _tmp_97_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target"));
+ D(fprintf(stderr, "%*c> _tmp_98[%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='*'
@@ -31881,12 +32190,12 @@ _tmp_97_rule(Parser *p)
(star_target_var = star_target_rule(p)) // star_target
)
{
- D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target"));
+ D(fprintf(stderr, "%*c+ _tmp_98[%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_97[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_98[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target"));
}
_res = NULL;
@@ -31895,9 +32204,9 @@ _tmp_97_rule(Parser *p)
return _res;
}
-// _loop0_98: ',' del_target
+// _loop0_99: ',' del_target
static asdl_seq *
-_loop0_98_rule(Parser *p)
+_loop0_99_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31922,7 +32231,7 @@ _loop0_98_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target"));
+ D(fprintf(stderr, "%*c> _loop0_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target"));
Token * _literal;
expr_ty elem;
while (
@@ -31954,7 +32263,7 @@ _loop0_98_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_99[%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);
@@ -31971,9 +32280,9 @@ _loop0_98_rule(Parser *p)
return _seq;
}
-// _gather_99: del_target _loop0_98
+// _gather_100: del_target _loop0_99
static asdl_seq *
-_gather_99_rule(Parser *p)
+_gather_100_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -31984,27 +32293,27 @@ _gather_99_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // del_target _loop0_98
+ { // del_target _loop0_99
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_98"));
+ D(fprintf(stderr, "%*c> _gather_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_99"));
expr_ty elem;
asdl_seq * seq;
if (
(elem = del_target_rule(p)) // del_target
&&
- (seq = _loop0_98_rule(p)) // _loop0_98
+ (seq = _loop0_99_rule(p)) // _loop0_99
)
{
- D(fprintf(stderr, "%*c+ _gather_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_98"));
+ D(fprintf(stderr, "%*c+ _gather_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_99"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_99[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_98"));
+ D(fprintf(stderr, "%*c%s _gather_100[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_99"));
}
_res = NULL;
done:
@@ -32012,9 +32321,9 @@ _gather_99_rule(Parser *p)
return _res;
}
-// _loop0_100: ',' expression
+// _loop0_101: ',' expression
static asdl_seq *
-_loop0_100_rule(Parser *p)
+_loop0_101_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32039,7 +32348,7 @@ _loop0_100_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression"));
+ D(fprintf(stderr, "%*c> _loop0_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression"));
Token * _literal;
expr_ty elem;
while (
@@ -32071,7 +32380,7 @@ _loop0_100_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_100[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_101[%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);
@@ -32088,9 +32397,9 @@ _loop0_100_rule(Parser *p)
return _seq;
}
-// _gather_101: expression _loop0_100
+// _gather_102: expression _loop0_101
static asdl_seq *
-_gather_101_rule(Parser *p)
+_gather_102_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32101,27 +32410,27 @@ _gather_101_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // expression _loop0_100
+ { // expression _loop0_101
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_100"));
+ D(fprintf(stderr, "%*c> _gather_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_101"));
expr_ty elem;
asdl_seq * seq;
if (
(elem = expression_rule(p)) // expression
&&
- (seq = _loop0_100_rule(p)) // _loop0_100
+ (seq = _loop0_101_rule(p)) // _loop0_101
)
{
- D(fprintf(stderr, "%*c+ _gather_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_100"));
+ D(fprintf(stderr, "%*c+ _gather_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_101"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_101[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_100"));
+ D(fprintf(stderr, "%*c%s _gather_102[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_101"));
}
_res = NULL;
done:
@@ -32129,9 +32438,9 @@ _gather_101_rule(Parser *p)
return _res;
}
-// _tmp_102: NEWLINE INDENT
+// _tmp_103: NEWLINE INDENT
static void *
-_tmp_102_rule(Parser *p)
+_tmp_103_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32147,7 +32456,7 @@ _tmp_102_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT"));
+ D(fprintf(stderr, "%*c> _tmp_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT"));
Token * indent_var;
Token * newline_var;
if (
@@ -32156,12 +32465,12 @@ _tmp_102_rule(Parser *p)
(indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT'
)
{
- D(fprintf(stderr, "%*c+ _tmp_102[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT"));
+ D(fprintf(stderr, "%*c+ _tmp_103[%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_102[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_103[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT"));
}
_res = NULL;
@@ -32170,11 +32479,11 @@ _tmp_102_rule(Parser *p)
return _res;
}
-// _tmp_103:
+// _tmp_104:
// | (','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)
// | kwargs
static void *
-_tmp_103_rule(Parser *p)
+_tmp_104_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32190,18 +32499,18 @@ _tmp_103_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)"));
- void *_tmp_163_var;
+ D(fprintf(stderr, "%*c> _tmp_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)"));
+ void *_tmp_164_var;
if (
- (_tmp_163_var = _tmp_163_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs
+ (_tmp_164_var = _tmp_164_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs
)
{
- D(fprintf(stderr, "%*c+ _tmp_103[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)"));
- _res = _tmp_163_var;
+ D(fprintf(stderr, "%*c+ _tmp_104[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)"));
+ _res = _tmp_164_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_103[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_104[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs)"));
}
{ // kwargs
@@ -32209,18 +32518,18 @@ _tmp_103_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs"));
+ D(fprintf(stderr, "%*c> _tmp_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs"));
asdl_seq* kwargs_var;
if (
(kwargs_var = kwargs_rule(p)) // kwargs
)
{
- D(fprintf(stderr, "%*c+ _tmp_103[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs"));
+ D(fprintf(stderr, "%*c+ _tmp_104[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs"));
_res = kwargs_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_103[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_104[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwargs"));
}
_res = NULL;
@@ -32229,9 +32538,9 @@ _tmp_103_rule(Parser *p)
return _res;
}
-// _loop0_104: ',' (starred_expression !'=')
+// _loop0_105: ',' (starred_expression !'=')
static asdl_seq *
-_loop0_104_rule(Parser *p)
+_loop0_105_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32256,13 +32565,13 @@ _loop0_104_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression !'=')"));
+ D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression !'=')"));
Token * _literal;
void *elem;
while (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (elem = _tmp_164_rule(p)) // starred_expression !'='
+ (elem = _tmp_165_rule(p)) // starred_expression !'='
)
{
_res = elem;
@@ -32288,7 +32597,7 @@ _loop0_104_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_105[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression !'=')"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -32305,9 +32614,9 @@ _loop0_104_rule(Parser *p)
return _seq;
}
-// _gather_105: (starred_expression !'=') _loop0_104
+// _gather_106: (starred_expression !'=') _loop0_105
static asdl_seq *
-_gather_105_rule(Parser *p)
+_gather_106_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32318,27 +32627,27 @@ _gather_105_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // (starred_expression !'=') _loop0_104
+ { // (starred_expression !'=') _loop0_105
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_104"));
+ D(fprintf(stderr, "%*c> _gather_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_105"));
void *elem;
asdl_seq * seq;
if (
- (elem = _tmp_164_rule(p)) // starred_expression !'='
+ (elem = _tmp_165_rule(p)) // starred_expression !'='
&&
- (seq = _loop0_104_rule(p)) // _loop0_104
+ (seq = _loop0_105_rule(p)) // _loop0_105
)
{
- D(fprintf(stderr, "%*c+ _gather_105[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_104"));
+ D(fprintf(stderr, "%*c+ _gather_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression !'=') _loop0_105"));
_res = _PyPegen_seq_insert_in_front(p, elem, seq);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _gather_105[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression !'=') _loop0_104"));
+ D(fprintf(stderr, "%*c%s _gather_106[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression !'=') _loop0_105"));
}
_res = NULL;
done:
@@ -32346,9 +32655,9 @@ _gather_105_rule(Parser *p)
return _res;
}
-// _tmp_106: args | expression for_if_clauses
+// _tmp_107: args | expression for_if_clauses
static void *
-_tmp_106_rule(Parser *p)
+_tmp_107_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32364,18 +32673,18 @@ _tmp_106_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args"));
+ D(fprintf(stderr, "%*c> _tmp_107[%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_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args"));
+ D(fprintf(stderr, "%*c+ _tmp_107[%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_106[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_107[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args"));
}
{ // expression for_if_clauses
@@ -32383,7 +32692,7 @@ _tmp_106_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses"));
+ D(fprintf(stderr, "%*c> _tmp_107[%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 (
@@ -32392,12 +32701,12 @@ _tmp_106_rule(Parser *p)
(for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses
)
{
- D(fprintf(stderr, "%*c+ _tmp_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses"));
+ D(fprintf(stderr, "%*c+ _tmp_107[%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_106[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_107[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses"));
}
_res = NULL;
@@ -32406,9 +32715,9 @@ _tmp_106_rule(Parser *p)
return _res;
}
-// _tmp_107: args ','
+// _tmp_108: args ','
static void *
-_tmp_107_rule(Parser *p)
+_tmp_108_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32424,7 +32733,7 @@ _tmp_107_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','"));
+ D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','"));
Token * _literal;
expr_ty args_var;
if (
@@ -32433,12 +32742,12 @@ _tmp_107_rule(Parser *p)
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_107[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','"));
+ D(fprintf(stderr, "%*c+ _tmp_108[%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_107[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','"));
}
_res = NULL;
@@ -32447,9 +32756,9 @@ _tmp_107_rule(Parser *p)
return _res;
}
-// _tmp_108: ',' | ')'
+// _tmp_109: ',' | ')'
static void *
-_tmp_108_rule(Parser *p)
+_tmp_109_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32465,18 +32774,18 @@ _tmp_108_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
{ // ')'
@@ -32484,18 +32793,18 @@ _tmp_108_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 8)) // token=')'
)
{
- D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
}
_res = NULL;
@@ -32504,9 +32813,9 @@ _tmp_108_rule(Parser *p)
return _res;
}
-// _tmp_109: 'True' | 'False' | 'None'
+// _tmp_110: 'True' | 'False' | 'None'
static void *
-_tmp_109_rule(Parser *p)
+_tmp_110_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32522,18 +32831,18 @@ _tmp_109_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'"));
+ D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 619)) // token='True'
)
{
- D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'"));
+ D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'"));
}
{ // 'False'
@@ -32541,18 +32850,18 @@ _tmp_109_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'"));
+ D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 621)) // token='False'
)
{
- D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'"));
+ D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'"));
}
{ // 'None'
@@ -32560,18 +32869,18 @@ _tmp_109_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'"));
+ D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 620)) // token='None'
)
{
- D(fprintf(stderr, "%*c+ _tmp_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'"));
+ D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_109[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_110[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'"));
}
_res = NULL;
@@ -32580,9 +32889,9 @@ _tmp_109_rule(Parser *p)
return _res;
}
-// _tmp_110: NAME '='
+// _tmp_111: NAME '='
static void *
-_tmp_110_rule(Parser *p)
+_tmp_111_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32598,7 +32907,7 @@ _tmp_110_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='"));
+ D(fprintf(stderr, "%*c> _tmp_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '='"));
Token * _literal;
expr_ty name_var;
if (
@@ -32607,12 +32916,12 @@ _tmp_110_rule(Parser *p)
(_literal = _PyPegen_expect_token(p, 22)) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_110[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '='"));
+ D(fprintf(stderr, "%*c+ _tmp_111[%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_110[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_111[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '='"));
}
_res = NULL;
@@ -32621,9 +32930,9 @@ _tmp_110_rule(Parser *p)
return _res;
}
-// _loop1_111: (!STRING expression_without_invalid)
+// _loop1_112: (!STRING expression_without_invalid)
static asdl_seq *
-_loop1_111_rule(Parser *p)
+_loop1_112_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32648,13 +32957,13 @@ _loop1_111_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop1_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(!STRING expression_without_invalid)"));
- void *_tmp_165_var;
+ D(fprintf(stderr, "%*c> _loop1_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(!STRING expression_without_invalid)"));
+ void *_tmp_166_var;
while (
- (_tmp_165_var = _tmp_165_rule(p)) // !STRING expression_without_invalid
+ (_tmp_166_var = _tmp_166_rule(p)) // !STRING expression_without_invalid
)
{
- _res = _tmp_165_var;
+ _res = _tmp_166_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -32671,7 +32980,7 @@ _loop1_111_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop1_111[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop1_112[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(!STRING expression_without_invalid)"));
}
if (_n == 0 || p->error_indicator) {
@@ -32693,9 +33002,9 @@ _loop1_111_rule(Parser *p)
return _seq;
}
-// _tmp_112: NAME STRING | SOFT_KEYWORD
+// _tmp_113: NAME STRING | SOFT_KEYWORD
static void *
-_tmp_112_rule(Parser *p)
+_tmp_113_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32711,7 +33020,7 @@ _tmp_112_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING"));
+ D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME STRING"));
expr_ty name_var;
expr_ty string_var;
if (
@@ -32720,12 +33029,12 @@ _tmp_112_rule(Parser *p)
(string_var = _PyPegen_string_token(p)) // STRING
)
{
- D(fprintf(stderr, "%*c+ _tmp_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME STRING"));
+ D(fprintf(stderr, "%*c+ _tmp_113[%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_112[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME STRING"));
}
{ // SOFT_KEYWORD
@@ -32733,18 +33042,18 @@ _tmp_112_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD"));
+ D(fprintf(stderr, "%*c> _tmp_113[%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_112[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "SOFT_KEYWORD"));
+ D(fprintf(stderr, "%*c+ _tmp_113[%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_112[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "SOFT_KEYWORD"));
}
_res = NULL;
@@ -32753,9 +33062,9 @@ _tmp_112_rule(Parser *p)
return _res;
}
-// _tmp_113: 'else' | ':'
+// _tmp_114: 'else' | ':'
static void *
-_tmp_113_rule(Parser *p)
+_tmp_114_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32771,18 +33080,18 @@ _tmp_113_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'"));
+ D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 680)) // token='else'
)
{
- D(fprintf(stderr, "%*c+ _tmp_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'"));
+ D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else'"));
}
{ // ':'
@@ -32790,18 +33099,18 @@ _tmp_113_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_113[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
_res = NULL;
@@ -32810,9 +33119,9 @@ _tmp_113_rule(Parser *p)
return _res;
}
-// _tmp_114: pass_stmt | break_stmt | continue_stmt
+// _tmp_115: pass_stmt | break_stmt | continue_stmt
static void *
-_tmp_114_rule(Parser *p)
+_tmp_115_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32828,18 +33137,18 @@ _tmp_114_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pass_stmt"));
+ D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "pass_stmt"));
stmt_ty pass_stmt_var;
if (
(pass_stmt_var = pass_stmt_rule(p)) // pass_stmt
)
{
- D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pass_stmt"));
+ D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "pass_stmt"));
_res = pass_stmt_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "pass_stmt"));
}
{ // break_stmt
@@ -32847,18 +33156,18 @@ _tmp_114_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "break_stmt"));
+ D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "break_stmt"));
stmt_ty break_stmt_var;
if (
(break_stmt_var = break_stmt_rule(p)) // break_stmt
)
{
- D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "break_stmt"));
+ D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "break_stmt"));
_res = break_stmt_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "break_stmt"));
}
{ // continue_stmt
@@ -32866,18 +33175,18 @@ _tmp_114_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "continue_stmt"));
+ D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "continue_stmt"));
stmt_ty continue_stmt_var;
if (
(continue_stmt_var = continue_stmt_rule(p)) // continue_stmt
)
{
- D(fprintf(stderr, "%*c+ _tmp_114[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "continue_stmt"));
+ D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "continue_stmt"));
_res = continue_stmt_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_114[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "continue_stmt"));
}
_res = NULL;
@@ -32886,9 +33195,9 @@ _tmp_114_rule(Parser *p)
return _res;
}
-// _tmp_115: '=' | ':='
+// _tmp_116: '=' | ':='
static void *
-_tmp_115_rule(Parser *p)
+_tmp_116_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32904,18 +33213,18 @@ _tmp_115_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='"));
+ D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 22)) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='"));
+ D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='"));
}
{ // ':='
@@ -32923,18 +33232,18 @@ _tmp_115_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='"));
+ D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 53)) // token=':='
)
{
- D(fprintf(stderr, "%*c+ _tmp_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='"));
+ D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_115[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':='"));
}
_res = NULL;
@@ -32943,9 +33252,9 @@ _tmp_115_rule(Parser *p)
return _res;
}
-// _tmp_116: list | tuple | genexp | 'True' | 'None' | 'False'
+// _tmp_117: list | tuple | genexp | 'True' | 'None' | 'False'
static void *
-_tmp_116_rule(Parser *p)
+_tmp_117_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -32961,18 +33270,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list"));
+ D(fprintf(stderr, "%*c> _tmp_117[%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_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%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_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list"));
}
{ // tuple
@@ -32980,18 +33289,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple"));
+ D(fprintf(stderr, "%*c> _tmp_117[%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_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%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_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple"));
}
{ // genexp
@@ -32999,18 +33308,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp"));
+ D(fprintf(stderr, "%*c> _tmp_117[%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_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%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_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp"));
}
{ // 'True'
@@ -33018,18 +33327,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'"));
+ D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 619)) // token='True'
)
{
- D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'"));
}
{ // 'None'
@@ -33037,18 +33346,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'"));
+ D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 620)) // token='None'
)
{
- D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'"));
}
{ // 'False'
@@ -33056,18 +33365,18 @@ _tmp_116_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'"));
+ D(fprintf(stderr, "%*c> _tmp_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 621)) // token='False'
)
{
- D(fprintf(stderr, "%*c+ _tmp_116[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'"));
+ D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_116[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_117[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'"));
}
_res = NULL;
@@ -33076,9 +33385,9 @@ _tmp_116_rule(Parser *p)
return _res;
}
-// _loop0_117: star_named_expressions
+// _loop0_118: star_named_expressions
static asdl_seq *
-_loop0_117_rule(Parser *p)
+_loop0_118_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33103,7 +33412,7 @@ _loop0_117_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions"));
+ D(fprintf(stderr, "%*c> _loop0_118[%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
@@ -33126,7 +33435,7 @@ _loop0_117_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_117[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_118[%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);
@@ -33143,9 +33452,9 @@ _loop0_117_rule(Parser *p)
return _seq;
}
-// _loop0_118: (star_targets '=')
+// _loop0_119: (star_targets '=')
static asdl_seq *
-_loop0_118_rule(Parser *p)
+_loop0_119_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33170,13 +33479,13 @@ _loop0_118_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')"));
- void *_tmp_152_var;
+ D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')"));
+ void *_tmp_153_var;
while (
- (_tmp_152_var = _tmp_152_rule(p)) // star_targets '='
+ (_tmp_153_var = _tmp_153_rule(p)) // star_targets '='
)
{
- _res = _tmp_152_var;
+ _res = _tmp_153_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -33193,7 +33502,7 @@ _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, ' ',
+ D(fprintf(stderr, "%*c%s _loop0_119[%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);
@@ -33210,9 +33519,9 @@ _loop0_118_rule(Parser *p)
return _seq;
}
-// _tmp_119: '[' | '(' | '{'
+// _tmp_120: '[' | '(' | '{'
static void *
-_tmp_119_rule(Parser *p)
+_tmp_120_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33228,18 +33537,18 @@ _tmp_119_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['"));
+ D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 9)) // token='['
)
{
- D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['"));
+ D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['"));
}
{ // '('
@@ -33247,18 +33556,18 @@ _tmp_119_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('"));
+ D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 7)) // token='('
)
{
- D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('"));
+ D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('"));
}
{ // '{'
@@ -33266,18 +33575,18 @@ _tmp_119_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'"));
+ D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 25)) // token='{'
)
{
- D(fprintf(stderr, "%*c+ _tmp_119[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'"));
+ D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_119[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'"));
}
_res = NULL;
@@ -33286,9 +33595,9 @@ _tmp_119_rule(Parser *p)
return _res;
}
-// _tmp_120: '[' | '{'
+// _tmp_121: '[' | '{'
static void *
-_tmp_120_rule(Parser *p)
+_tmp_121_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33304,18 +33613,18 @@ _tmp_120_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['"));
+ D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 9)) // token='['
)
{
- D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['"));
+ D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['"));
}
{ // '{'
@@ -33323,18 +33632,18 @@ _tmp_120_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'"));
+ D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 25)) // token='{'
)
{
- D(fprintf(stderr, "%*c+ _tmp_120[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'"));
+ D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_120[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'"));
}
_res = NULL;
@@ -33343,9 +33652,9 @@ _tmp_120_rule(Parser *p)
return _res;
}
-// _tmp_121: slash_no_default | slash_with_default
+// _tmp_122: slash_no_default | slash_with_default
static void *
-_tmp_121_rule(Parser *p)
+_tmp_122_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33361,18 +33670,18 @@ _tmp_121_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_122[%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_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_122[%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_121[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default"));
}
{ // slash_with_default
@@ -33380,18 +33689,18 @@ _tmp_121_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default"));
+ D(fprintf(stderr, "%*c> _tmp_122[%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_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default"));
+ D(fprintf(stderr, "%*c+ _tmp_122[%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_121[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default"));
}
_res = NULL;
@@ -33400,9 +33709,9 @@ _tmp_121_rule(Parser *p)
return _res;
}
-// _tmp_122: ',' | param_no_default
+// _tmp_123: ',' | param_no_default
static void *
-_tmp_122_rule(Parser *p)
+_tmp_123_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33418,18 +33727,18 @@ _tmp_122_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_122[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
{ // param_no_default
@@ -33437,18 +33746,18 @@ _tmp_122_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_123[%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_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_123[%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_122[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
}
_res = NULL;
@@ -33457,9 +33766,9 @@ _tmp_122_rule(Parser *p)
return _res;
}
-// _tmp_123: ')' | ','
+// _tmp_124: ')' | ','
static void *
-_tmp_123_rule(Parser *p)
+_tmp_124_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33475,18 +33784,18 @@ _tmp_123_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 8)) // token=')'
)
{
- D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
}
{ // ','
@@ -33494,18 +33803,18 @@ _tmp_123_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_123[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_123[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
_res = NULL;
@@ -33514,9 +33823,9 @@ _tmp_123_rule(Parser *p)
return _res;
}
-// _tmp_124: ')' | ',' (')' | '**')
+// _tmp_125: ')' | ',' (')' | '**')
static void *
-_tmp_124_rule(Parser *p)
+_tmp_125_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33532,18 +33841,18 @@ _tmp_124_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 8)) // token=')'
)
{
- D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
}
{ // ',' (')' | '**')
@@ -33551,21 +33860,21 @@ _tmp_124_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')"));
+ D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')"));
Token * _literal;
- void *_tmp_166_var;
+ void *_tmp_167_var;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (_tmp_166_var = _tmp_166_rule(p)) // ')' | '**'
+ (_tmp_167_var = _tmp_167_rule(p)) // ')' | '**'
)
{
- D(fprintf(stderr, "%*c+ _tmp_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')"));
- _res = _PyPegen_dummy_name(p, _literal, _tmp_166_var);
+ D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')"));
+ _res = _PyPegen_dummy_name(p, _literal, _tmp_167_var);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_124[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')"));
}
_res = NULL;
@@ -33574,9 +33883,9 @@ _tmp_124_rule(Parser *p)
return _res;
}
-// _tmp_125: param_no_default | ','
+// _tmp_126: param_no_default | ','
static void *
-_tmp_125_rule(Parser *p)
+_tmp_126_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33592,18 +33901,18 @@ _tmp_125_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_126[%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_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_126[%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_125[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
}
{ // ','
@@ -33611,18 +33920,18 @@ _tmp_125_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_125[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_125[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
_res = NULL;
@@ -33631,9 +33940,9 @@ _tmp_125_rule(Parser *p)
return _res;
}
-// _tmp_126: '*' | '**' | '/'
+// _tmp_127: '*' | '**' | '/'
static void *
-_tmp_126_rule(Parser *p)
+_tmp_127_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33649,18 +33958,18 @@ _tmp_126_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'"));
+ D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
)
{
- D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'"));
+ D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'"));
}
{ // '**'
@@ -33668,18 +33977,18 @@ _tmp_126_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'"));
+ D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 35)) // token='**'
)
{
- D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
+ D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'"));
}
{ // '/'
@@ -33687,18 +33996,18 @@ _tmp_126_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'"));
+ D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 17)) // token='/'
)
{
- D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'"));
+ D(fprintf(stderr, "%*c+ _tmp_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_127[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'"));
}
_res = NULL;
@@ -33707,9 +34016,9 @@ _tmp_126_rule(Parser *p)
return _res;
}
-// _tmp_127: lambda_slash_no_default | lambda_slash_with_default
+// _tmp_128: lambda_slash_no_default | lambda_slash_with_default
static void *
-_tmp_127_rule(Parser *p)
+_tmp_128_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33725,18 +34034,18 @@ _tmp_127_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_128[%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_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_128[%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_127[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default"));
}
{ // lambda_slash_with_default
@@ -33744,18 +34053,18 @@ _tmp_127_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default"));
+ D(fprintf(stderr, "%*c> _tmp_128[%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_127[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default"));
+ D(fprintf(stderr, "%*c+ _tmp_128[%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_127[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_128[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default"));
}
_res = NULL;
@@ -33764,9 +34073,9 @@ _tmp_127_rule(Parser *p)
return _res;
}
-// _loop0_128: ',' lambda_param
+// _loop0_129: ',' lambda_param
static asdl_seq *
-_loop0_128_rule(Parser *p)
+_loop0_129_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33791,7 +34100,7 @@ _loop0_128_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param"));
+ D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' lambda_param"));
Token * _literal;
arg_ty elem;
while (
@@ -33823,7 +34132,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_129[%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);
@@ -33840,9 +34149,9 @@ _loop0_128_rule(Parser *p)
return _seq;
}
-// _gather_129: lambda_param _loop0_128
+// _gather_130: lambda_param _loop0_129
static asdl_seq *
-_gather_129_rule(Parser *p)
+_gather_130_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33853,27 +34162,27 @@ _gather_129_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // lambda_param _loop0_128
+ { // lambda_param _loop0_129
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_128"));
+ D(fprintf(stderr, "%*c> _gather_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_129"));
arg_ty elem;
asdl_seq * seq;
if (
(elem = lambda_param_rule(p)) // lambda_param
&&
- (seq = _loop0_128_rule(p)) // _loop0_128
+ (seq = _loop0_129_rule(p)) // _loop0_129
)
{
- D(fprintf(stderr, "%*c+ _gather_129[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_128"));
+ D(fprintf(stderr, "%*c+ _gather_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param _loop0_129"));
_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, "lambda_param _loop0_128"));
+ D(fprintf(stderr, "%*c%s _gather_130[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param _loop0_129"));
}
_res = NULL;
done:
@@ -33881,9 +34190,9 @@ _gather_129_rule(Parser *p)
return _res;
}
-// _tmp_130: ',' | lambda_param_no_default
+// _tmp_131: ',' | lambda_param_no_default
static void *
-_tmp_130_rule(Parser *p)
+_tmp_131_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33899,18 +34208,18 @@ _tmp_130_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
{ // lambda_param_no_default
@@ -33918,18 +34227,18 @@ _tmp_130_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_131[%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_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_131[%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_130[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default"));
}
_res = NULL;
@@ -33938,9 +34247,9 @@ _tmp_130_rule(Parser *p)
return _res;
}
-// _tmp_131: ':' | ',' (':' | '**')
+// _tmp_132: ':' | ',' (':' | '**')
static void *
-_tmp_131_rule(Parser *p)
+_tmp_132_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -33956,18 +34265,18 @@ _tmp_131_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
{ // ',' (':' | '**')
@@ -33975,21 +34284,21 @@ _tmp_131_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')"));
+ D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')"));
Token * _literal;
- void *_tmp_167_var;
+ void *_tmp_168_var;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
- (_tmp_167_var = _tmp_167_rule(p)) // ':' | '**'
+ (_tmp_168_var = _tmp_168_rule(p)) // ':' | '**'
)
{
- D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')"));
- _res = _PyPegen_dummy_name(p, _literal, _tmp_167_var);
+ D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')"));
+ _res = _PyPegen_dummy_name(p, _literal, _tmp_168_var);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_132[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')"));
}
_res = NULL;
@@ -33998,9 +34307,9 @@ _tmp_131_rule(Parser *p)
return _res;
}
-// _tmp_132: lambda_param_no_default | ','
+// _tmp_133: lambda_param_no_default | ','
static void *
-_tmp_132_rule(Parser *p)
+_tmp_133_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34016,18 +34325,18 @@ _tmp_132_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default"));
+ D(fprintf(stderr, "%*c> _tmp_133[%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_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default"));
+ D(fprintf(stderr, "%*c+ _tmp_133[%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_132[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default"));
}
{ // ','
@@ -34035,18 +34344,18 @@ _tmp_132_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_132[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _literal;
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_133[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
_res = NULL;
@@ -34055,9 +34364,9 @@ _tmp_132_rule(Parser *p)
return _res;
}
-// _tmp_133: bitwise_or ((',' bitwise_or))* ','?
+// _tmp_134: bitwise_or ((',' bitwise_or))* ','?
static void *
-_tmp_133_rule(Parser *p)
+_tmp_134_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34073,25 +34382,25 @@ _tmp_133_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?"));
- asdl_seq * _loop0_168_var;
+ D(fprintf(stderr, "%*c> _tmp_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?"));
+ asdl_seq * _loop0_169_var;
void *_opt_var;
UNUSED(_opt_var); // Silence compiler warnings
expr_ty bitwise_or_var;
if (
(bitwise_or_var = bitwise_or_rule(p)) // bitwise_or
&&
- (_loop0_168_var = _loop0_168_rule(p)) // ((',' bitwise_or))*
+ (_loop0_169_var = _loop0_169_rule(p)) // ((',' bitwise_or))*
&&
(_opt_var = _PyPegen_expect_token(p, 12), !p->error_indicator) // ','?
)
{
- D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?"));
- _res = _PyPegen_dummy_name(p, bitwise_or_var, _loop0_168_var, _opt_var);
+ D(fprintf(stderr, "%*c+ _tmp_134[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?"));
+ _res = _PyPegen_dummy_name(p, bitwise_or_var, _loop0_169_var, _opt_var);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_134[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or ((',' bitwise_or))* ','?"));
}
_res = NULL;
@@ -34100,9 +34409,9 @@ _tmp_133_rule(Parser *p)
return _res;
}
-// _loop0_134: ',' dotted_name
+// _loop0_135: ',' dotted_name
static asdl_seq *
-_loop0_134_rule(Parser *p)
+_loop0_135_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34127,7 +34436,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, "',' dotted_name"));
+ D(fprintf(stderr, "%*c> _loop0_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_name"));
Token * _literal;
expr_ty elem;
while (
@@ -34159,7 +34468,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_135[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -34176,9 +34485,9 @@ _loop0_134_rule(Parser *p)
return _seq;
}
-// _gather_135: dotted_name _loop0_134
+// _gather_136: dotted_name _loop0_135
static asdl_seq *
-_gather_135_rule(Parser *p)
+_gather_136_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34189,27 +34498,27 @@ _gather_135_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // dotted_name _loop0_134
+ { // dotted_name _loop0_135
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_134"));
+ D(fprintf(stderr, "%*c> _gather_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_135"));
expr_ty elem;
asdl_seq * seq;
if (
(elem = dotted_name_rule(p)) // dotted_name
&&
- (seq = _loop0_134_rule(p)) // _loop0_134
+ (seq = _loop0_135_rule(p)) // _loop0_135
)
{
- D(fprintf(stderr, "%*c+ _gather_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_134"));
+ D(fprintf(stderr, "%*c+ _gather_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name _loop0_135"));
_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, "dotted_name _loop0_134"));
+ D(fprintf(stderr, "%*c%s _gather_136[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name _loop0_135"));
}
_res = NULL;
done:
@@ -34217,9 +34526,9 @@ _gather_135_rule(Parser *p)
return _res;
}
-// _loop0_136: ',' (expression ['as' star_target])
+// _loop0_137: ',' (expression ['as' star_target])
static asdl_seq *
-_loop0_136_rule(Parser *p)
+_loop0_137_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34244,13 +34553,13 @@ _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 ['as' star_target])"));
+ D(fprintf(stderr, "%*c> _loop0_137[%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_169_rule(p)) // expression ['as' star_target]
+ (elem = _tmp_170_rule(p)) // expression ['as' star_target]
)
{
_res = elem;
@@ -34276,7 +34585,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_137[%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);
@@ -34293,9 +34602,9 @@ _loop0_136_rule(Parser *p)
return _seq;
}
-// _gather_137: (expression ['as' star_target]) _loop0_136
+// _gather_138: (expression ['as' star_target]) _loop0_137
static asdl_seq *
-_gather_137_rule(Parser *p)
+_gather_138_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34306,27 +34615,27 @@ _gather_137_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // (expression ['as' star_target]) _loop0_136
+ { // (expression ['as' star_target]) _loop0_137
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_136"));
+ D(fprintf(stderr, "%*c> _gather_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_137"));
void *elem;
asdl_seq * seq;
if (
- (elem = _tmp_169_rule(p)) // expression ['as' star_target]
+ (elem = _tmp_170_rule(p)) // expression ['as' star_target]
&&
- (seq = _loop0_136_rule(p)) // _loop0_136
+ (seq = _loop0_137_rule(p)) // _loop0_137
)
{
- D(fprintf(stderr, "%*c+ _gather_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_136"));
+ D(fprintf(stderr, "%*c+ _gather_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expression ['as' star_target]) _loop0_137"));
_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 ['as' star_target]) _loop0_136"));
+ D(fprintf(stderr, "%*c%s _gather_138[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expression ['as' star_target]) _loop0_137"));
}
_res = NULL;
done:
@@ -34334,9 +34643,9 @@ _gather_137_rule(Parser *p)
return _res;
}
-// _loop0_138: ',' (expressions ['as' star_target])
+// _loop0_139: ',' (expressions ['as' star_target])
static asdl_seq *
-_loop0_138_rule(Parser *p)
+_loop0_139_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34361,13 +34670,13 @@ _loop0_138_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (expressions ['as' star_target])"));
+ D(fprintf(stderr, "%*c> _loop0_139[%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_170_rule(p)) // expressions ['as' star_target]
+ (elem = _tmp_171_rule(p)) // expressions ['as' star_target]
)
{
_res = elem;
@@ -34393,7 +34702,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_139[%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);
@@ -34410,9 +34719,9 @@ _loop0_138_rule(Parser *p)
return _seq;
}
-// _gather_139: (expressions ['as' star_target]) _loop0_138
+// _gather_140: (expressions ['as' star_target]) _loop0_139
static asdl_seq *
-_gather_139_rule(Parser *p)
+_gather_140_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34423,27 +34732,27 @@ _gather_139_rule(Parser *p)
}
asdl_seq * _res = NULL;
int _mark = p->mark;
- { // (expressions ['as' star_target]) _loop0_138
+ { // (expressions ['as' star_target]) _loop0_139
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _gather_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_138"));
+ D(fprintf(stderr, "%*c> _gather_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_139"));
void *elem;
asdl_seq * seq;
if (
- (elem = _tmp_170_rule(p)) // expressions ['as' star_target]
+ (elem = _tmp_171_rule(p)) // expressions ['as' star_target]
&&
- (seq = _loop0_138_rule(p)) // _loop0_138
+ (seq = _loop0_139_rule(p)) // _loop0_139
)
{
- D(fprintf(stderr, "%*c+ _gather_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_138"));
+ D(fprintf(stderr, "%*c+ _gather_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(expressions ['as' star_target]) _loop0_139"));
_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, "(expressions ['as' star_target]) _loop0_138"));
+ D(fprintf(stderr, "%*c%s _gather_140[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(expressions ['as' star_target]) _loop0_139"));
}
_res = NULL;
done:
@@ -34451,9 +34760,9 @@ _gather_139_rule(Parser *p)
return _res;
}
-// _tmp_140: 'except' | 'finally'
+// _tmp_141: 'except' | 'finally'
static void *
-_tmp_140_rule(Parser *p)
+_tmp_141_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34469,18 +34778,18 @@ _tmp_140_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'"));
+ D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 672)) // token='except'
)
{
- D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'"));
+ D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except'"));
}
{ // 'finally'
@@ -34488,18 +34797,18 @@ _tmp_140_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'"));
+ D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally'"));
Token * _keyword;
if (
(_keyword = _PyPegen_expect_token(p, 668)) // token='finally'
)
{
- D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'"));
+ D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally'"));
_res = _keyword;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally'"));
}
_res = NULL;
@@ -34508,9 +34817,9 @@ _tmp_140_rule(Parser *p)
return _res;
}
-// _loop0_141: block
+// _loop0_142: block
static asdl_seq *
-_loop0_141_rule(Parser *p)
+_loop0_142_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34535,7 +34844,7 @@ _loop0_141_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block"));
+ D(fprintf(stderr, "%*c> _loop0_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "block"));
asdl_stmt_seq* block_var;
while (
(block_var = block_rule(p)) // block
@@ -34558,7 +34867,7 @@ _loop0_141_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_141[%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, "block"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -34575,9 +34884,9 @@ _loop0_141_rule(Parser *p)
return _seq;
}
-// _tmp_142: expression ['as' NAME]
+// _tmp_143: expression ['as' NAME]
static void *
-_tmp_142_rule(Parser *p)
+_tmp_143_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34593,7 +34902,7 @@ _tmp_142_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]"));
+ D(fprintf(stderr, "%*c> _tmp_143[%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;
@@ -34603,12 +34912,12 @@ _tmp_142_rule(Parser *p)
(_opt_var = _tmp_22_rule(p), !p->error_indicator) // ['as' NAME]
)
{
- D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' NAME]"));
+ D(fprintf(stderr, "%*c+ _tmp_143[%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_142[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' NAME]"));
}
_res = NULL;
@@ -34617,9 +34926,9 @@ _tmp_142_rule(Parser *p)
return _res;
}
-// _tmp_143: NEWLINE | ':'
+// _tmp_144: NEWLINE | ':'
static void *
-_tmp_143_rule(Parser *p)
+_tmp_144_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34635,18 +34944,18 @@ _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"));
+ D(fprintf(stderr, "%*c> _tmp_144[%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_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE"));
+ D(fprintf(stderr, "%*c+ _tmp_144[%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_143[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE"));
}
{ // ':'
@@ -34654,18 +34963,18 @@ _tmp_143_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
_res = _literal;
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_144[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
_res = NULL;
@@ -34674,9 +34983,9 @@ _tmp_143_rule(Parser *p)
return _res;
}
-// _tmp_144: positional_patterns ','
+// _tmp_145: positional_patterns ','
static void *
-_tmp_144_rule(Parser *p)
+_tmp_145_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34692,7 +35001,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, "positional_patterns ','"));
+ D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "positional_patterns ','"));
Token * _literal;
asdl_pattern_seq* positional_patterns_var;
if (
@@ -34701,12 +35010,12 @@ _tmp_144_rule(Parser *p)
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "positional_patterns ','"));
+ D(fprintf(stderr, "%*c+ _tmp_145[%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_144[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "positional_patterns ','"));
}
_res = NULL;
@@ -34715,9 +35024,9 @@ _tmp_144_rule(Parser *p)
return _res;
}
-// _tmp_145: '}' | ','
+// _tmp_146: '}' | ','
static void *
-_tmp_145_rule(Parser *p)
+_tmp_146_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34733,18 +35042,18 @@ _tmp_145_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'"));
+ D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 26)) // token='}'
)
{
- D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'"));
+ D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'"));
_res = _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_146[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'"));
}
{ // ','
@@ -34752,18 +35061,18 @@ _tmp_145_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 12)) // token=','
)
{
- D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
+ D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','"));
_res = _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_146[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','"));
}
_res = NULL;
@@ -34772,9 +35081,9 @@ _tmp_145_rule(Parser *p)
return _res;
}
-// _tmp_146: '=' | '!' | ':' | '}'
+// _tmp_147: '=' | '!' | ':' | '}'
static void *
-_tmp_146_rule(Parser *p)
+_tmp_147_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34790,18 +35099,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_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'='"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 22)) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'='"));
+ D(fprintf(stderr, "%*c+ _tmp_147[%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_147[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'='"));
}
{ // '!'
@@ -34809,18 +35118,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_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 54)) // token='!'
)
{
- D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'"));
+ D(fprintf(stderr, "%*c+ _tmp_147[%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_147[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'"));
}
{ // ':'
@@ -34828,18 +35137,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_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_147[%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_147[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
{ // '}'
@@ -34847,18 +35156,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_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 26)) // token='}'
)
{
- D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'"));
+ D(fprintf(stderr, "%*c+ _tmp_147[%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_147[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'"));
}
_res = NULL;
@@ -34867,9 +35176,9 @@ _tmp_146_rule(Parser *p)
return _res;
}
-// _tmp_147: '!' | ':' | '}'
+// _tmp_148: '!' | ':' | '}'
static void *
-_tmp_147_rule(Parser *p)
+_tmp_148_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34885,18 +35194,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, "'!'"));
+ D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 54)) // token='!'
)
{
- D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'"));
+ D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!'"));
_res = _literal;
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_148[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!'"));
}
{ // ':'
@@ -34904,18 +35213,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, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
_res = _literal;
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_148[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
{ // '}'
@@ -34923,18 +35232,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, "'}'"));
+ D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 26)) // token='}'
)
{
- D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'"));
+ D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'}'"));
_res = _literal;
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_148[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'}'"));
}
_res = NULL;
@@ -34943,9 +35252,9 @@ _tmp_147_rule(Parser *p)
return _res;
}
-// _tmp_148: '!' NAME
+// _tmp_149: '!' NAME
static void *
-_tmp_148_rule(Parser *p)
+_tmp_149_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -34961,7 +35270,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_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!' NAME"));
Token * _literal;
expr_ty name_var;
if (
@@ -34970,12 +35279,12 @@ _tmp_148_rule(Parser *p)
(name_var = _PyPegen_name_token(p)) // NAME
)
{
- D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!' NAME"));
+ D(fprintf(stderr, "%*c+ _tmp_149[%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_148[%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, "'!' NAME"));
}
_res = NULL;
@@ -34984,9 +35293,9 @@ _tmp_148_rule(Parser *p)
return _res;
}
-// _tmp_149: ':' | '}'
+// _tmp_150: ':' | '}'
static void *
-_tmp_149_rule(Parser *p)
+_tmp_150_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35002,18 +35311,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, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_149[%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_149[%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, "':'"));
}
{ // '}'
@@ -35021,18 +35330,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, "'}'"));
+ D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'}'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 26)) // token='}'
)
{
- D(fprintf(stderr, "%*c+ _tmp_149[%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_149[%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;
@@ -35041,9 +35350,9 @@ _tmp_149_rule(Parser *p)
return _res;
}
-// _tmp_150: '+' | '-' | '*' | '/' | '%' | '//' | '@'
+// _tmp_151: '+' | '-' | '*' | '/' | '%' | '//' | '@'
static void *
-_tmp_150_rule(Parser *p)
+_tmp_151_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35059,18 +35368,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 14)) // token='+'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'"));
}
{ // '-'
@@ -35078,18 +35387,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 15)) // token='-'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'"));
}
{ // '*'
@@ -35097,18 +35406,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'"));
}
{ // '/'
@@ -35116,18 +35425,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 17)) // token='/'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/'"));
}
{ // '%'
@@ -35135,18 +35444,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 24)) // token='%'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'%'"));
}
{ // '//'
@@ -35154,18 +35463,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 47)) // token='//'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'//'"));
}
{ // '@'
@@ -35173,18 +35482,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_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 49)) // token='@'
)
{
- D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'"));
+ D(fprintf(stderr, "%*c+ _tmp_151[%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_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'"));
}
_res = NULL;
@@ -35193,9 +35502,9 @@ _tmp_150_rule(Parser *p)
return _res;
}
-// _tmp_151: '+' | '-' | '~'
+// _tmp_152: '+' | '-' | '~'
static void *
-_tmp_151_rule(Parser *p)
+_tmp_152_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35211,18 +35520,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_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 14)) // token='+'
)
{
- D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+'"));
+ D(fprintf(stderr, "%*c+ _tmp_152[%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_152[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+'"));
}
{ // '-'
@@ -35230,18 +35539,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_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 15)) // token='-'
)
{
- D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-'"));
+ D(fprintf(stderr, "%*c+ _tmp_152[%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_152[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-'"));
}
{ // '~'
@@ -35249,18 +35558,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_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'~'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 31)) // token='~'
)
{
- D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'~'"));
+ D(fprintf(stderr, "%*c+ _tmp_152[%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_152[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'~'"));
}
_res = NULL;
@@ -35269,9 +35578,9 @@ _tmp_151_rule(Parser *p)
return _res;
}
-// _tmp_152: star_targets '='
+// _tmp_153: star_targets '='
static void *
-_tmp_152_rule(Parser *p)
+_tmp_153_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35287,7 +35596,7 @@ _tmp_152_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='"));
+ D(fprintf(stderr, "%*c> _tmp_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='"));
Token * _literal;
expr_ty z;
if (
@@ -35296,7 +35605,7 @@ _tmp_152_rule(Parser *p)
(_literal = _PyPegen_expect_token(p, 22)) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='"));
+ D(fprintf(stderr, "%*c+ _tmp_153[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='"));
_res = z;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35306,7 +35615,7 @@ _tmp_152_rule(Parser *p)
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_153[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='"));
}
_res = NULL;
@@ -35315,9 +35624,9 @@ _tmp_152_rule(Parser *p)
return _res;
}
-// _tmp_153: '.' | '...'
+// _tmp_154: '.' | '...'
static void *
-_tmp_153_rule(Parser *p)
+_tmp_154_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35333,18 +35642,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_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 23)) // token='.'
)
{
- D(fprintf(stderr, "%*c+ _tmp_153[%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_153[%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, "'.'"));
}
{ // '...'
@@ -35352,18 +35661,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_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 52)) // token='...'
)
{
- D(fprintf(stderr, "%*c+ _tmp_153[%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_153[%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;
@@ -35372,9 +35681,9 @@ _tmp_153_rule(Parser *p)
return _res;
}
-// _tmp_154: '@' named_expression NEWLINE
+// _tmp_155: '@' named_expression NEWLINE
static void *
-_tmp_154_rule(Parser *p)
+_tmp_155_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35390,7 +35699,7 @@ _tmp_154_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE"));
+ D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE"));
Token * _literal;
expr_ty f;
Token * newline_var;
@@ -35402,7 +35711,7 @@ _tmp_154_rule(Parser *p)
(newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE'
)
{
- D(fprintf(stderr, "%*c+ _tmp_154[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE"));
+ D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE"));
_res = f;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35412,7 +35721,7 @@ _tmp_154_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_154[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE"));
}
_res = NULL;
@@ -35421,9 +35730,9 @@ _tmp_154_rule(Parser *p)
return _res;
}
-// _tmp_155: ',' star_expression
+// _tmp_156: ',' star_expression
static void *
-_tmp_155_rule(Parser *p)
+_tmp_156_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35439,7 +35748,7 @@ _tmp_155_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression"));
+ D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression"));
Token * _literal;
expr_ty c;
if (
@@ -35448,7 +35757,7 @@ _tmp_155_rule(Parser *p)
(c = star_expression_rule(p)) // star_expression
)
{
- D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression"));
+ D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression"));
_res = c;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35458,7 +35767,7 @@ _tmp_155_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_155[%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, "',' star_expression"));
}
_res = NULL;
@@ -35467,9 +35776,9 @@ _tmp_155_rule(Parser *p)
return _res;
}
-// _tmp_156: 'or' conjunction
+// _tmp_157: 'or' conjunction
static void *
-_tmp_156_rule(Parser *p)
+_tmp_157_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35485,7 +35794,7 @@ _tmp_156_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction"));
+ D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction"));
Token * _keyword;
expr_ty c;
if (
@@ -35494,7 +35803,7 @@ _tmp_156_rule(Parser *p)
(c = conjunction_rule(p)) // conjunction
)
{
- D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction"));
+ D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction"));
_res = c;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35504,7 +35813,7 @@ _tmp_156_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_156[%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, "'or' conjunction"));
}
_res = NULL;
@@ -35513,9 +35822,9 @@ _tmp_156_rule(Parser *p)
return _res;
}
-// _tmp_157: 'and' inversion
+// _tmp_158: 'and' inversion
static void *
-_tmp_157_rule(Parser *p)
+_tmp_158_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35531,7 +35840,7 @@ _tmp_157_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_157[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion"));
+ D(fprintf(stderr, "%*c> _tmp_158[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion"));
Token * _keyword;
expr_ty c;
if (
@@ -35540,7 +35849,7 @@ _tmp_157_rule(Parser *p)
(c = inversion_rule(p)) // inversion
)
{
- D(fprintf(stderr, "%*c+ _tmp_157[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion"));
+ D(fprintf(stderr, "%*c+ _tmp_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion"));
_res = c;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35550,7 +35859,7 @@ _tmp_157_rule(Parser *p)
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_158[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion"));
}
_res = NULL;
@@ -35559,9 +35868,9 @@ _tmp_157_rule(Parser *p)
return _res;
}
-// _tmp_158: slice | starred_expression
+// _tmp_159: slice | starred_expression
static void *
-_tmp_158_rule(Parser *p)
+_tmp_159_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35577,18 +35886,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, "slice"));
+ D(fprintf(stderr, "%*c> _tmp_159[%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_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice"));
+ D(fprintf(stderr, "%*c+ _tmp_159[%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_158[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice"));
}
{ // starred_expression
@@ -35596,18 +35905,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, "starred_expression"));
+ D(fprintf(stderr, "%*c> _tmp_159[%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_158[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression"));
+ D(fprintf(stderr, "%*c+ _tmp_159[%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_158[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_159[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression"));
}
_res = NULL;
@@ -35616,9 +35925,9 @@ _tmp_158_rule(Parser *p)
return _res;
}
-// _tmp_159: fstring | string
+// _tmp_160: fstring | string | tstring
static void *
-_tmp_159_rule(Parser *p)
+_tmp_160_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35634,18 +35943,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, "fstring"));
+ D(fprintf(stderr, "%*c> _tmp_160[%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_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "fstring"));
+ D(fprintf(stderr, "%*c+ _tmp_160[%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_159[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring"));
}
{ // string
@@ -35653,29 +35962,48 @@ _tmp_159_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_159[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "string"));
+ D(fprintf(stderr, "%*c> _tmp_160[%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_159[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "string"));
+ D(fprintf(stderr, "%*c+ _tmp_160[%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_159[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "string"));
}
+ { // tstring
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tstring"));
+ expr_ty tstring_var;
+ if (
+ (tstring_var = tstring_rule(p)) // tstring
+ )
+ {
+ D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tstring"));
+ _res = tstring_var;
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s _tmp_160[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring"));
+ }
_res = NULL;
done:
p->level--;
return _res;
}
-// _tmp_160: 'if' disjunction
+// _tmp_161: 'if' disjunction
static void *
-_tmp_160_rule(Parser *p)
+_tmp_161_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35691,7 +36019,7 @@ _tmp_160_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_160[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction"));
+ D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction"));
Token * _keyword;
expr_ty z;
if (
@@ -35700,7 +36028,7 @@ _tmp_160_rule(Parser *p)
(z = disjunction_rule(p)) // disjunction
)
{
- D(fprintf(stderr, "%*c+ _tmp_160[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction"));
+ D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction"));
_res = z;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35710,7 +36038,7 @@ _tmp_160_rule(Parser *p)
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_161[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction"));
}
_res = NULL;
@@ -35719,9 +36047,9 @@ _tmp_160_rule(Parser *p)
return _res;
}
-// _tmp_161: starred_expression | (assignment_expression | expression !':=') !'='
+// _tmp_162: starred_expression | (assignment_expression | expression !':=') !'='
static void *
-_tmp_161_rule(Parser *p)
+_tmp_162_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35737,18 +36065,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, "starred_expression"));
+ D(fprintf(stderr, "%*c> _tmp_162[%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_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression"));
+ D(fprintf(stderr, "%*c+ _tmp_162[%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_161[%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, "starred_expression"));
}
{ // (assignment_expression | expression !':=') !'='
@@ -35756,20 +36084,20 @@ _tmp_161_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_161[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='"));
- void *_tmp_85_var;
+ D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='"));
+ void *_tmp_86_var;
if (
- (_tmp_85_var = _tmp_85_rule(p)) // assignment_expression | expression !':='
+ (_tmp_86_var = _tmp_86_rule(p)) // assignment_expression | expression !':='
&&
_PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_161[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='"));
- _res = _tmp_85_var;
+ D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(assignment_expression | expression !':=') !'='"));
+ _res = _tmp_86_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_162[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(assignment_expression | expression !':=') !'='"));
}
_res = NULL;
@@ -35778,9 +36106,9 @@ _tmp_161_rule(Parser *p)
return _res;
}
-// _tmp_162: ',' star_target
+// _tmp_163: ',' star_target
static void *
-_tmp_162_rule(Parser *p)
+_tmp_163_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35796,7 +36124,7 @@ _tmp_162_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_162[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target"));
+ D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target"));
Token * _literal;
expr_ty c;
if (
@@ -35805,7 +36133,7 @@ _tmp_162_rule(Parser *p)
(c = star_target_rule(p)) // star_target
)
{
- D(fprintf(stderr, "%*c+ _tmp_162[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target"));
+ D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target"));
_res = c;
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
@@ -35815,7 +36143,7 @@ _tmp_162_rule(Parser *p)
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_162[%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, "',' star_target"));
}
_res = NULL;
@@ -35824,10 +36152,10 @@ _tmp_162_rule(Parser *p)
return _res;
}
-// _tmp_163:
+// _tmp_164:
// | ','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs
static void *
-_tmp_163_rule(Parser *p)
+_tmp_164_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35843,24 +36171,24 @@ _tmp_163_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_163[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs"));
- asdl_seq * _gather_87_var;
+ D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs"));
+ asdl_seq * _gather_88_var;
Token * _literal;
asdl_seq* kwargs_var;
if (
- (_gather_87_var = _gather_87_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+
+ (_gather_88_var = _gather_88_rule(p)) // ','.(starred_expression | (assignment_expression | expression !':=') !'=')+
&&
(_literal = _PyPegen_expect_token(p, 12)) // token=','
&&
(kwargs_var = kwargs_rule(p)) // kwargs
)
{
- D(fprintf(stderr, "%*c+ _tmp_163[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs"));
- _res = _PyPegen_dummy_name(p, _gather_87_var, _literal, kwargs_var);
+ D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs"));
+ _res = _PyPegen_dummy_name(p, _gather_88_var, _literal, kwargs_var);
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_163[%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, "','.(starred_expression | (assignment_expression | expression !':=') !'=')+ ',' kwargs"));
}
_res = NULL;
@@ -35869,9 +36197,9 @@ _tmp_163_rule(Parser *p)
return _res;
}
-// _tmp_164: starred_expression !'='
+// _tmp_165: starred_expression !'='
static void *
-_tmp_164_rule(Parser *p)
+_tmp_165_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35887,7 +36215,7 @@ _tmp_164_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_164[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression !'='"));
+ D(fprintf(stderr, "%*c> _tmp_165[%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
@@ -35895,12 +36223,12 @@ _tmp_164_rule(Parser *p)
_PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='='
)
{
- D(fprintf(stderr, "%*c+ _tmp_164[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression !'='"));
+ D(fprintf(stderr, "%*c+ _tmp_165[%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_164[%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, "starred_expression !'='"));
}
_res = NULL;
@@ -35909,9 +36237,9 @@ _tmp_164_rule(Parser *p)
return _res;
}
-// _tmp_165: !STRING expression_without_invalid
+// _tmp_166: !STRING expression_without_invalid
static void *
-_tmp_165_rule(Parser *p)
+_tmp_166_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35927,7 +36255,7 @@ _tmp_165_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_165[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid"));
+ D(fprintf(stderr, "%*c> _tmp_166[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid"));
expr_ty expression_without_invalid_var;
if (
_PyPegen_lookahead(0, (void *(*)(Parser *)) _PyPegen_string_token, p)
@@ -35935,12 +36263,12 @@ _tmp_165_rule(Parser *p)
(expression_without_invalid_var = expression_without_invalid_rule(p)) // expression_without_invalid
)
{
- D(fprintf(stderr, "%*c+ _tmp_165[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid"));
+ D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!STRING expression_without_invalid"));
_res = expression_without_invalid_var;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_165[%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, "!STRING expression_without_invalid"));
}
_res = NULL;
@@ -35949,9 +36277,9 @@ _tmp_165_rule(Parser *p)
return _res;
}
-// _tmp_166: ')' | '**'
+// _tmp_167: ')' | '**'
static void *
-_tmp_166_rule(Parser *p)
+_tmp_167_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -35967,18 +36295,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, "')'"));
+ D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 8)) // token=')'
)
{
- D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
+ D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'"));
_res = _literal;
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_167[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'"));
}
{ // '**'
@@ -35986,18 +36314,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, "'**'"));
+ D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 35)) // token='**'
)
{
- D(fprintf(stderr, "%*c+ _tmp_166[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
+ D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
_res = _literal;
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_167[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'"));
}
_res = NULL;
@@ -36006,9 +36334,9 @@ _tmp_166_rule(Parser *p)
return _res;
}
-// _tmp_167: ':' | '**'
+// _tmp_168: ':' | '**'
static void *
-_tmp_167_rule(Parser *p)
+_tmp_168_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36024,18 +36352,18 @@ _tmp_167_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
)
{
- D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
+ D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'"));
}
{ // '**'
@@ -36043,18 +36371,18 @@ _tmp_167_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_167[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'"));
+ D(fprintf(stderr, "%*c> _tmp_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'"));
Token * _literal;
if (
(_literal = _PyPegen_expect_token(p, 35)) // token='**'
)
{
- D(fprintf(stderr, "%*c+ _tmp_167[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
+ D(fprintf(stderr, "%*c+ _tmp_168[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'"));
_res = _literal;
goto done;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _tmp_167[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_168[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'"));
}
_res = NULL;
@@ -36063,9 +36391,9 @@ _tmp_167_rule(Parser *p)
return _res;
}
-// _loop0_168: (',' bitwise_or)
+// _loop0_169: (',' bitwise_or)
static asdl_seq *
-_loop0_168_rule(Parser *p)
+_loop0_169_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36090,13 +36418,13 @@ _loop0_168_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _loop0_168[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' bitwise_or)"));
- void *_tmp_171_var;
+ D(fprintf(stderr, "%*c> _loop0_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' bitwise_or)"));
+ void *_tmp_172_var;
while (
- (_tmp_171_var = _tmp_171_rule(p)) // ',' bitwise_or
+ (_tmp_172_var = _tmp_172_rule(p)) // ',' bitwise_or
)
{
- _res = _tmp_171_var;
+ _res = _tmp_172_var;
if (_n == _children_capacity) {
_children_capacity *= 2;
void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));
@@ -36113,7 +36441,7 @@ _loop0_168_rule(Parser *p)
_mark = p->mark;
}
p->mark = _mark;
- D(fprintf(stderr, "%*c%s _loop0_168[%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, "(',' bitwise_or)"));
}
asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena);
@@ -36130,9 +36458,9 @@ _loop0_168_rule(Parser *p)
return _seq;
}
-// _tmp_169: expression ['as' star_target]
+// _tmp_170: expression ['as' star_target]
static void *
-_tmp_169_rule(Parser *p)
+_tmp_170_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36148,22 +36476,22 @@ _tmp_169_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_169[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]"));
+ D(fprintf(stderr, "%*c> _tmp_170[%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_172_rule(p), !p->error_indicator) // ['as' star_target]
+ (_opt_var = _tmp_173_rule(p), !p->error_indicator) // ['as' star_target]
)
{
- D(fprintf(stderr, "%*c+ _tmp_169[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ['as' star_target]"));
+ D(fprintf(stderr, "%*c+ _tmp_170[%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_169[%d-%d]: %s failed!\n", p->level, ' ',
+ D(fprintf(stderr, "%*c%s _tmp_170[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ['as' star_target]"));
}
_res = NULL;
@@ -36172,9 +36500,9 @@ _tmp_169_rule(Parser *p)
return _res;
}
-// _tmp_170: expressions ['as' star_target]
+// _tmp_171: expressions ['as' star_target]
static void *
-_tmp_170_rule(Parser *p)
+_tmp_171_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36190,22 +36518,22 @@ _tmp_170_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_170[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]"));
+ D(fprintf(stderr, "%*c> _tmp_171[%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_172_rule(p), !p->error_indicator) // ['as' star_target]
+ (_opt_var = _tmp_173_rule(p), !p->error_indicator) // ['as' star_target]
)
{
- D(fprintf(stderr, "%*c+ _tmp_170[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions ['as' star_target]"));
+ D(fprintf(stderr, "%*c+ _tmp_171[%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_170[%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, "expressions ['as' star_target]"));
}
_res = NULL;
@@ -36214,9 +36542,9 @@ _tmp_170_rule(Parser *p)
return _res;
}
-// _tmp_171: ',' bitwise_or
+// _tmp_172: ',' bitwise_or
static void *
-_tmp_171_rule(Parser *p)
+_tmp_172_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36232,7 +36560,7 @@ _tmp_171_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_171[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' bitwise_or"));
+ D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' bitwise_or"));
Token * _literal;
expr_ty bitwise_or_var;
if (
@@ -36241,12 +36569,12 @@ _tmp_171_rule(Parser *p)
(bitwise_or_var = bitwise_or_rule(p)) // bitwise_or
)
{
- D(fprintf(stderr, "%*c+ _tmp_171[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' bitwise_or"));
+ D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' bitwise_or"));
_res = _PyPegen_dummy_name(p, _literal, bitwise_or_var);
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_172[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' bitwise_or"));
}
_res = NULL;
@@ -36255,9 +36583,9 @@ _tmp_171_rule(Parser *p)
return _res;
}
-// _tmp_172: 'as' star_target
+// _tmp_173: 'as' star_target
static void *
-_tmp_172_rule(Parser *p)
+_tmp_173_rule(Parser *p)
{
if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {
_Pypegen_stack_overflow(p);
@@ -36273,7 +36601,7 @@ _tmp_172_rule(Parser *p)
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> _tmp_172[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target"));
+ D(fprintf(stderr, "%*c> _tmp_173[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' star_target"));
Token * _keyword;
expr_ty star_target_var;
if (
@@ -36282,12 +36610,12 @@ _tmp_172_rule(Parser *p)
(star_target_var = star_target_rule(p)) // star_target
)
{
- D(fprintf(stderr, "%*c+ _tmp_172[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' star_target"));
+ D(fprintf(stderr, "%*c+ _tmp_173[%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_172[%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, "'as' star_target"));
}
_res = NULL;
diff --git a/Parser/pegen.h b/Parser/pegen.h
index 37d6ea988d2af4..ee7c4cb767fa34 100644
--- a/Parser/pegen.h
+++ b/Parser/pegen.h
@@ -5,6 +5,8 @@
#include
#include
+#include "lexer/state.h"
+
#if 0
#define PyPARSE_YIELD_IS_KEYWORD 0x0001
#endif
@@ -24,6 +26,8 @@
#define CURRENT_POS (-5)
+#define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index]))
+
typedef struct _memo {
int type;
void *node;
@@ -318,6 +322,10 @@ 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_template_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b);
+expr_ty _PyPegen_joined_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, Token *b);
+expr_ty _PyPegen_interpolation(Parser *, expr_ty, Token *, ResultTokenWithMetadata *, ResultTokenWithMetadata *, Token *,
+ int, int, int, int, PyArena *);
expr_ty _PyPegen_formatted_value(Parser *, expr_ty, Token *, ResultTokenWithMetadata *, ResultTokenWithMetadata *, Token *,
int, int, int, int, PyArena *);
AugOperator *_PyPegen_augoperator(Parser*, operator_ty type);
@@ -360,9 +368,6 @@ 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/token.c b/Parser/token.c
index 4f163f21609a0a..5c76730f6aa4f1 100644
--- a/Parser/token.c
+++ b/Parser/token.c
@@ -66,6 +66,7 @@ const char * const _PyParser_TokenNames[] = {
"TYPE_COMMENT",
"SOFT_KEYWORD",
"FSTRING_START",
+ "TSTRING_START",
"FSTRING_MIDDLE",
"FSTRING_END",
"COMMENT",
diff --git a/Parser/tokenizer/file_tokenizer.c b/Parser/tokenizer/file_tokenizer.c
index 15fc9348f8ae56..01e473f58a0777 100644
--- a/Parser/tokenizer/file_tokenizer.c
+++ b/Parser/tokenizer/file_tokenizer.c
@@ -275,7 +275,7 @@ tok_underflow_interactive(struct tok_state *tok) {
return 0;
}
- if (tok->tok_mode_stack_index && !_PyLexer_update_fstring_expr(tok, 0)) {
+ if (tok->tok_mode_stack_index && !_PyLexer_update_ftstring_expr(tok, 0)) {
return 0;
}
return 1;
@@ -322,7 +322,7 @@ tok_underflow_file(struct tok_state *tok) {
tok->implicit_newline = 1;
}
- if (tok->tok_mode_stack_index && !_PyLexer_update_fstring_expr(tok, 0)) {
+ if (tok->tok_mode_stack_index && !_PyLexer_update_ftstring_expr(tok, 0)) {
return 0;
}
diff --git a/Parser/tokenizer/readline_tokenizer.c b/Parser/tokenizer/readline_tokenizer.c
index a2637af9902dd3..22f84c77a12b47 100644
--- a/Parser/tokenizer/readline_tokenizer.c
+++ b/Parser/tokenizer/readline_tokenizer.c
@@ -90,7 +90,7 @@ tok_underflow_readline(struct tok_state* tok) {
tok->implicit_newline = 1;
}
- if (tok->tok_mode_stack_index && !_PyLexer_update_fstring_expr(tok, 0)) {
+ if (tok->tok_mode_stack_index && !_PyLexer_update_ftstring_expr(tok, 0)) {
return 0;
}
diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h
index 8cedee31e08a00..d056e08df464e7 100644
--- a/Programs/test_frozenmain.h
+++ b/Programs/test_frozenmain.h
@@ -1,19 +1,19 @@
// Auto-generated by Programs/freeze_test_frozenmain.py
unsigned char M_test_frozenmain[] = {
227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,
- 0,0,0,0,0,243,184,0,0,0,128,0,92,0,80,1,
- 71,0,114,0,92,0,80,1,71,1,114,1,91,2,32,0,
- 80,2,50,1,0,0,0,0,0,0,30,0,91,2,32,0,
- 80,3,91,0,78,6,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,50,2,0,0,0,0,0,0,
- 30,0,91,1,78,8,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,32,0,50,0,0,0,0,0,
- 0,0,80,4,43,26,0,0,0,0,0,0,0,0,0,0,
- 114,5,80,7,15,0,68,24,0,0,114,6,91,2,32,0,
- 80,5,91,6,11,0,80,6,91,5,91,6,43,26,0,0,
- 0,0,0,0,0,0,0,0,11,0,48,4,50,1,0,0,
- 0,0,0,0,30,0,73,26,0,0,8,0,29,0,80,1,
- 34,0,41,8,233,0,0,0,0,78,122,18,70,114,111,122,
+ 0,0,0,0,0,243,184,0,0,0,128,0,95,0,83,1,
+ 74,0,117,0,95,0,83,1,74,1,117,1,94,2,34,0,
+ 83,2,53,1,0,0,0,0,0,0,32,0,94,2,34,0,
+ 83,3,94,0,81,6,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,53,2,0,0,0,0,0,0,
+ 32,0,94,1,81,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,34,0,53,0,0,0,0,0,
+ 0,0,83,4,45,26,0,0,0,0,0,0,0,0,0,0,
+ 117,5,83,7,18,0,71,24,0,0,117,6,94,2,34,0,
+ 83,5,94,6,13,0,83,6,94,5,94,6,45,26,0,0,
+ 0,0,0,0,0,0,0,0,13,0,50,4,53,1,0,0,
+ 0,0,0,0,32,0,76,26,0,0,10,0,31,0,83,1,
+ 36,0,41,8,233,0,0,0,0,78,122,18,70,114,111,122,
101,110,32,72,101,108,108,111,32,87,111,114,108,100,122,8,
115,121,115,46,97,114,103,118,218,6,99,111,110,102,105,103,
122,7,99,111,110,102,105,103,32,122,2,58,32,41,5,218,
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 98dcdc4ed0be70..215bb625350a7a 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -92,6 +92,7 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->In_singleton);
Py_CLEAR(state->In_type);
Py_CLEAR(state->Interactive_type);
+ Py_CLEAR(state->Interpolation_type);
Py_CLEAR(state->Invert_singleton);
Py_CLEAR(state->Invert_type);
Py_CLEAR(state->IsNot_singleton);
@@ -154,6 +155,7 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->Sub_singleton);
Py_CLEAR(state->Sub_type);
Py_CLEAR(state->Subscript_type);
+ Py_CLEAR(state->TemplateStr_type);
Py_CLEAR(state->TryStar_type);
Py_CLEAR(state->Try_type);
Py_CLEAR(state->Tuple_type);
@@ -259,6 +261,7 @@ void _PyAST_Fini(PyInterpreterState *interp)
Py_CLEAR(state->slice);
Py_CLEAR(state->step);
Py_CLEAR(state->stmt_type);
+ Py_CLEAR(state->str);
Py_CLEAR(state->subject);
Py_CLEAR(state->tag);
Py_CLEAR(state->target);
@@ -357,6 +360,7 @@ static int init_identifiers(struct ast_state *state)
if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return -1;
if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return -1;
if ((state->step = PyUnicode_InternFromString("step")) == NULL) return -1;
+ if ((state->str = PyUnicode_InternFromString("str")) == NULL) return -1;
if ((state->subject = PyUnicode_InternFromString("subject")) == NULL) return -1;
if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return -1;
if ((state->target = PyUnicode_InternFromString("target")) == NULL) return -1;
@@ -619,9 +623,18 @@ static const char * const FormattedValue_fields[]={
"conversion",
"format_spec",
};
+static const char * const Interpolation_fields[]={
+ "value",
+ "str",
+ "conversion",
+ "format_spec",
+};
static const char * const JoinedStr_fields[]={
"values",
};
+static const char * const TemplateStr_fields[]={
+ "values",
+};
static const char * const Constant_fields[]={
"value",
"kind",
@@ -3174,6 +3187,75 @@ add_ast_annotations(struct ast_state *state)
return 0;
}
Py_DECREF(FormattedValue_annotations);
+ PyObject *Interpolation_annotations = PyDict_New();
+ if (!Interpolation_annotations) return 0;
+ {
+ PyObject *type = state->expr_type;
+ Py_INCREF(type);
+ cond = PyDict_SetItemString(Interpolation_annotations, "value", type)
+ == 0;
+ Py_DECREF(type);
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ }
+ {
+ PyObject *type = (PyObject *)&PyBaseObject_Type;
+ Py_INCREF(type);
+ cond = PyDict_SetItemString(Interpolation_annotations, "str", type) ==
+ 0;
+ Py_DECREF(type);
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ }
+ {
+ PyObject *type = (PyObject *)&PyBaseObject_Type;
+ type = _Py_union_type_or(type, Py_None);
+ cond = type != NULL;
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ cond = PyDict_SetItemString(Interpolation_annotations, "conversion",
+ type) == 0;
+ Py_DECREF(type);
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ }
+ {
+ PyObject *type = state->expr_type;
+ type = _Py_union_type_or(type, Py_None);
+ cond = type != NULL;
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ cond = PyDict_SetItemString(Interpolation_annotations, "format_spec",
+ type) == 0;
+ Py_DECREF(type);
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ }
+ cond = PyObject_SetAttrString(state->Interpolation_type, "_field_types",
+ Interpolation_annotations) == 0;
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ cond = PyObject_SetAttrString(state->Interpolation_type, "__annotations__",
+ Interpolation_annotations) == 0;
+ if (!cond) {
+ Py_DECREF(Interpolation_annotations);
+ return 0;
+ }
+ Py_DECREF(Interpolation_annotations);
PyObject *JoinedStr_annotations = PyDict_New();
if (!JoinedStr_annotations) return 0;
{
@@ -3204,6 +3286,37 @@ add_ast_annotations(struct ast_state *state)
return 0;
}
Py_DECREF(JoinedStr_annotations);
+ PyObject *TemplateStr_annotations = PyDict_New();
+ if (!TemplateStr_annotations) return 0;
+ {
+ PyObject *type = state->expr_type;
+ type = Py_GenericAlias((PyObject *)&PyList_Type, type);
+ cond = type != NULL;
+ if (!cond) {
+ Py_DECREF(TemplateStr_annotations);
+ return 0;
+ }
+ cond = PyDict_SetItemString(TemplateStr_annotations, "values", type) ==
+ 0;
+ Py_DECREF(type);
+ if (!cond) {
+ Py_DECREF(TemplateStr_annotations);
+ return 0;
+ }
+ }
+ cond = PyObject_SetAttrString(state->TemplateStr_type, "_field_types",
+ TemplateStr_annotations) == 0;
+ if (!cond) {
+ Py_DECREF(TemplateStr_annotations);
+ return 0;
+ }
+ cond = PyObject_SetAttrString(state->TemplateStr_type, "__annotations__",
+ TemplateStr_annotations) == 0;
+ if (!cond) {
+ Py_DECREF(TemplateStr_annotations);
+ return 0;
+ }
+ Py_DECREF(TemplateStr_annotations);
PyObject *Constant_annotations = PyDict_New();
if (!Constant_annotations) return 0;
{
@@ -6266,7 +6379,9 @@ init_types(void *arg)
" | Compare(expr left, cmpop* ops, expr* comparators)\n"
" | Call(expr func, expr* args, keyword* keywords)\n"
" | FormattedValue(expr value, int conversion, expr? format_spec)\n"
+ " | Interpolation(expr value, constant str, constant? conversion, expr? format_spec)\n"
" | JoinedStr(expr* values)\n"
+ " | TemplateStr(expr* values)\n"
" | Constant(constant value, string? kind)\n"
" | Attribute(expr value, identifier attr, expr_context ctx)\n"
" | Subscript(expr value, expr slice, expr_context ctx)\n"
@@ -6361,10 +6476,25 @@ init_types(void *arg)
if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
Py_None) == -1)
return -1;
+ state->Interpolation_type = make_type(state, "Interpolation",
+ state->expr_type,
+ Interpolation_fields, 4,
+ "Interpolation(expr value, constant str, constant? conversion, expr? format_spec)");
+ if (!state->Interpolation_type) return -1;
+ if (PyObject_SetAttr(state->Interpolation_type, state->conversion, Py_None)
+ == -1)
+ return -1;
+ if (PyObject_SetAttr(state->Interpolation_type, state->format_spec,
+ Py_None) == -1)
+ return -1;
state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
JoinedStr_fields, 1,
"JoinedStr(expr* values)");
if (!state->JoinedStr_type) return -1;
+ state->TemplateStr_type = make_type(state, "TemplateStr", state->expr_type,
+ TemplateStr_fields, 1,
+ "TemplateStr(expr* values)");
+ if (!state->TemplateStr_type) return -1;
state->Constant_type = make_type(state, "Constant", state->expr_type,
Constant_fields, 2,
"Constant(constant value, string? kind)");
@@ -8038,6 +8168,37 @@ _PyAST_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int
return p;
}
+expr_ty
+_PyAST_Interpolation(expr_ty value, constant str, constant conversion, expr_ty
+ format_spec, int lineno, int col_offset, int end_lineno,
+ int end_col_offset, PyArena *arena)
+{
+ expr_ty p;
+ if (!value) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'value' is required for Interpolation");
+ return NULL;
+ }
+ if (!str) {
+ PyErr_SetString(PyExc_ValueError,
+ "field 'str' is required for Interpolation");
+ return NULL;
+ }
+ p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = Interpolation_kind;
+ p->v.Interpolation.value = value;
+ p->v.Interpolation.str = str;
+ p->v.Interpolation.conversion = conversion;
+ p->v.Interpolation.format_spec = format_spec;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
expr_ty
_PyAST_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int
end_lineno, int end_col_offset, PyArena *arena)
@@ -8055,6 +8216,23 @@ _PyAST_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int
return p;
}
+expr_ty
+_PyAST_TemplateStr(asdl_expr_seq * values, int lineno, int col_offset, int
+ end_lineno, int end_col_offset, PyArena *arena)
+{
+ expr_ty p;
+ p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = TemplateStr_kind;
+ p->v.TemplateStr.values = values;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ p->end_lineno = end_lineno;
+ p->end_col_offset = end_col_offset;
+ return p;
+}
+
expr_ty
_PyAST_Constant(constant value, string kind, int lineno, int col_offset, int
end_lineno, int end_col_offset, PyArena *arena)
@@ -9674,6 +9852,31 @@ ast2obj_expr(struct ast_state *state, void* _o)
goto failed;
Py_DECREF(value);
break;
+ case Interpolation_kind:
+ tp = (PyTypeObject *)state->Interpolation_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_expr(state, o->v.Interpolation.value);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->value, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_constant(state, o->v.Interpolation.str);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->str, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_constant(state, o->v.Interpolation.conversion);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->conversion, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_expr(state, o->v.Interpolation.format_spec);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->format_spec, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
case JoinedStr_kind:
tp = (PyTypeObject *)state->JoinedStr_type;
result = PyType_GenericNew(tp, NULL, NULL);
@@ -9685,6 +9888,17 @@ ast2obj_expr(struct ast_state *state, void* _o)
goto failed;
Py_DECREF(value);
break;
+ case TemplateStr_kind:
+ tp = (PyTypeObject *)state->TemplateStr_type;
+ result = PyType_GenericNew(tp, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_list(state, (asdl_seq*)o->v.TemplateStr.values,
+ ast2obj_expr);
+ if (!value) goto failed;
+ if (PyObject_SetAttr(result, state->values, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
case Constant_kind:
tp = (PyTypeObject *)state->Constant_type;
result = PyType_GenericNew(tp, NULL, NULL);
@@ -14793,6 +15007,91 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (*out == NULL) goto failed;
return 0;
}
+ tp = state->Interpolation_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return -1;
+ }
+ if (isinstance) {
+ expr_ty value;
+ constant str;
+ constant conversion;
+ expr_ty format_spec;
+
+ if (PyObject_GetOptionalAttr(obj, state->value, &tmp) < 0) {
+ return -1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Interpolation");
+ return -1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'Interpolation' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp, &value, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (PyObject_GetOptionalAttr(obj, state->str, &tmp) < 0) {
+ return -1;
+ }
+ if (tmp == NULL) {
+ PyErr_SetString(PyExc_TypeError, "required field \"str\" missing from Interpolation");
+ return -1;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'Interpolation' node")) {
+ goto failed;
+ }
+ res = obj2ast_constant(state, tmp, &str, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (PyObject_GetOptionalAttr(obj, state->conversion, &tmp) < 0) {
+ return -1;
+ }
+ if (tmp == NULL || tmp == Py_None) {
+ Py_CLEAR(tmp);
+ conversion = NULL;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'Interpolation' node")) {
+ goto failed;
+ }
+ res = obj2ast_constant(state, tmp, &conversion, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ if (PyObject_GetOptionalAttr(obj, state->format_spec, &tmp) < 0) {
+ return -1;
+ }
+ if (tmp == NULL || tmp == Py_None) {
+ Py_CLEAR(tmp);
+ format_spec = NULL;
+ }
+ else {
+ int res;
+ if (_Py_EnterRecursiveCall(" while traversing 'Interpolation' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp, &format_spec, arena);
+ _Py_LeaveRecursiveCall();
+ if (res != 0) goto failed;
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_Interpolation(value, str, conversion, format_spec,
+ lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
tp = state->JoinedStr_type;
isinstance = PyObject_IsInstance(obj, tp);
if (isinstance == -1) {
@@ -14844,6 +15143,57 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
if (*out == NULL) goto failed;
return 0;
}
+ tp = state->TemplateStr_type;
+ isinstance = PyObject_IsInstance(obj, tp);
+ if (isinstance == -1) {
+ return -1;
+ }
+ if (isinstance) {
+ asdl_expr_seq* values;
+
+ if (PyObject_GetOptionalAttr(obj, state->values, &tmp) < 0) {
+ return -1;
+ }
+ if (tmp == NULL) {
+ tmp = PyList_New(0);
+ if (tmp == NULL) {
+ return -1;
+ }
+ }
+ {
+ int res;
+ Py_ssize_t len;
+ Py_ssize_t i;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "TemplateStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ values = _Py_asdl_expr_seq_new(len, arena);
+ if (values == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ expr_ty val;
+ PyObject *tmp2 = Py_NewRef(PyList_GET_ITEM(tmp, i));
+ if (_Py_EnterRecursiveCall(" while traversing 'TemplateStr' node")) {
+ goto failed;
+ }
+ res = obj2ast_expr(state, tmp2, &val, arena);
+ _Py_LeaveRecursiveCall();
+ Py_DECREF(tmp2);
+ if (res != 0) goto failed;
+ if (len != PyList_GET_SIZE(tmp)) {
+ PyErr_SetString(PyExc_RuntimeError, "TemplateStr field \"values\" changed size during iteration");
+ goto failed;
+ }
+ asdl_seq_SET(values, i, val);
+ }
+ Py_CLEAR(tmp);
+ }
+ *out = _PyAST_TemplateStr(values, lineno, col_offset, end_lineno,
+ end_col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
tp = state->Constant_type;
isinstance = PyObject_IsInstance(obj, tp);
if (isinstance == -1) {
@@ -17794,9 +18144,16 @@ astmodule_exec(PyObject *m)
< 0) {
return -1;
}
+ if (PyModule_AddObjectRef(m, "Interpolation", state->Interpolation_type) <
+ 0) {
+ return -1;
+ }
if (PyModule_AddObjectRef(m, "JoinedStr", state->JoinedStr_type) < 0) {
return -1;
}
+ if (PyModule_AddObjectRef(m, "TemplateStr", state->TemplateStr_type) < 0) {
+ return -1;
+ }
if (PyModule_AddObjectRef(m, "Constant", state->Constant_type) < 0) {
return -1;
}
diff --git a/Python/ast.c b/Python/ast.c
index 7ee884357b41e8..e01dd0de51e596 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -345,6 +345,9 @@ validate_expr(expr_ty exp, expr_context_ty ctx)
case JoinedStr_kind:
ret = validate_exprs(exp->v.JoinedStr.values, Load, 0);
break;
+ case TemplateStr_kind:
+ ret = validate_exprs(exp->v.TemplateStr.values, Load, 0);
+ break;
case FormattedValue_kind:
if (validate_expr(exp->v.FormattedValue.value, Load) == 0)
return 0;
@@ -354,6 +357,15 @@ validate_expr(expr_ty exp, expr_context_ty ctx)
}
ret = 1;
break;
+ case Interpolation_kind:
+ if (validate_expr(exp->v.Interpolation.value, Load) == 0)
+ return 0;
+ if (exp->v.Interpolation.format_spec) {
+ ret = validate_expr(exp->v.Interpolation.format_spec, Load);
+ break;
+ }
+ ret = 1;
+ break;
case Attribute_kind:
ret = validate_expr(exp->v.Attribute.value, Load);
break;
@@ -512,6 +524,7 @@ validate_pattern_match_value(expr_ty exp)
}
break;
case JoinedStr_kind:
+ case TemplateStr_kind:
// Handled in the later stages
return 1;
default:
diff --git a/Python/ast_opt.c b/Python/ast_opt.c
index 807de98ab5e42b..4d5e5589ac06ca 100644
--- a/Python/ast_opt.c
+++ b/Python/ast_opt.c
@@ -558,9 +558,16 @@ astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state)
CALL(astfold_expr, expr_ty, node_->v.FormattedValue.value);
CALL_OPT(astfold_expr, expr_ty, node_->v.FormattedValue.format_spec);
break;
+ case Interpolation_kind:
+ CALL(astfold_expr, expr_ty, node_->v.Interpolation.value);
+ CALL_OPT(astfold_expr, expr_ty, node_->v.Interpolation.format_spec);
+ break;
case JoinedStr_kind:
CALL_SEQ(astfold_expr, expr, node_->v.JoinedStr.values);
break;
+ case TemplateStr_kind:
+ CALL_SEQ(astfold_expr, expr, node_->v.TemplateStr.values);
+ break;
case Attribute_kind:
CALL(astfold_expr, expr_ty, node_->v.Attribute.value);
break;
diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c
index f3c669c33eb07c..bd297c4f255328 100644
--- a/Python/ast_unparse.c
+++ b/Python/ast_unparse.c
@@ -18,8 +18,12 @@ expr_as_unicode(expr_ty e, int level);
static int
append_ast_expr(PyUnicodeWriter *writer, expr_ty e, int level);
static int
+append_templatestr(PyUnicodeWriter *writer, expr_ty e);
+static int
append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
static int
+append_interpolation(PyUnicodeWriter *writer, expr_ty e);
+static int
append_formattedvalue(PyUnicodeWriter *writer, expr_ty e);
static int
append_ast_slice(PyUnicodeWriter *writer, expr_ty e);
@@ -621,11 +625,15 @@ append_fstring_element(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
return append_fstring_unicode(writer, e->v.Constant.value);
case JoinedStr_kind:
return append_joinedstr(writer, e, is_format_spec);
+ case TemplateStr_kind:
+ return append_templatestr(writer, e);
case FormattedValue_kind:
return append_formattedvalue(writer, e);
+ case Interpolation_kind:
+ return append_interpolation(writer, e);
default:
PyErr_SetString(PyExc_SystemError,
- "unknown expression kind inside f-string");
+ "unknown expression kind inside f-string or t-string");
return -1;
}
}
@@ -633,7 +641,7 @@ append_fstring_element(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
/* Build body separately to enable wrapping the entire stream of Strs,
Constants and FormattedValues in one opening and one closing quote. */
static PyObject *
-build_fstring_body(asdl_expr_seq *values, bool is_format_spec)
+build_ftstring_body(asdl_expr_seq *values, bool is_format_spec)
{
PyUnicodeWriter *body_writer = PyUnicodeWriter_Create(256);
if (body_writer == NULL) {
@@ -654,11 +662,29 @@ build_fstring_body(asdl_expr_seq *values, bool is_format_spec)
return PyUnicodeWriter_Finish(body_writer);
}
+static int
+append_templatestr(PyUnicodeWriter *writer, expr_ty e)
+{
+ int result = -1;
+ PyObject *body = build_ftstring_body(e->v.TemplateStr.values, 0);
+ if (!body) {
+ return -1;
+ }
+
+ if (-1 != append_charp(writer, "t") &&
+ -1 != append_repr(writer, body))
+ {
+ result = 0;
+ }
+ Py_DECREF(body);
+ return result;
+}
+
static int
append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
{
int result = -1;
- PyObject *body = build_fstring_body(e->v.JoinedStr.values, is_format_spec);
+ PyObject *body = build_ftstring_body(e->v.JoinedStr.values, is_format_spec);
if (!body) {
return -1;
}
@@ -678,13 +704,12 @@ append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
}
static int
-append_formattedvalue(PyUnicodeWriter *writer, expr_ty e)
+append_interpolation_value(PyUnicodeWriter *writer, expr_ty e)
{
- const char *conversion;
const char *outer_brace = "{";
/* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis
around a lambda with ':' */
- PyObject *temp_fv_str = expr_as_unicode(e->v.FormattedValue.value, PR_TEST + 1);
+ PyObject *temp_fv_str = expr_as_unicode(e, PR_TEST + 1);
if (!temp_fv_str) {
return -1;
}
@@ -702,6 +727,51 @@ append_formattedvalue(PyUnicodeWriter *writer, expr_ty e)
return -1;
}
Py_DECREF(temp_fv_str);
+ return 0;
+}
+
+static int
+append_interpolation_format_spec(PyUnicodeWriter *writer, expr_ty e)
+{
+ if (e) {
+ if (-1 == PyUnicodeWriter_WriteChar(writer, ':') ||
+ -1 == append_fstring_element(writer, e, true))
+ {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static int
+append_interpolation(PyUnicodeWriter *writer, expr_ty e)
+{
+ if (-1 == append_interpolation_value(writer, e->v.Interpolation.value)) {
+ return -1;
+ }
+
+ if (e->v.Interpolation.conversion) {
+ APPEND_STR("!");
+ if (-1 == PyUnicodeWriter_WriteStr(writer, e->v.Interpolation.conversion)) {
+ return -1;
+ }
+ }
+
+ if (-1 == append_interpolation_format_spec(writer, e->v.Interpolation.format_spec)) {
+ return -1;
+ }
+
+ APPEND_STR_FINISH("}");
+}
+
+static int
+append_formattedvalue(PyUnicodeWriter *writer, expr_ty e)
+{
+ const char *conversion;
+
+ if (-1 == append_interpolation_value(writer, e->v.FormattedValue.value)) {
+ return -1;
+ }
if (e->v.FormattedValue.conversion > 0) {
switch (e->v.FormattedValue.conversion) {
@@ -721,15 +791,9 @@ append_formattedvalue(PyUnicodeWriter *writer, expr_ty e)
}
APPEND_STR(conversion);
}
- if (e->v.FormattedValue.format_spec) {
- if (-1 == PyUnicodeWriter_WriteChar(writer, ':') ||
- -1 == append_fstring_element(writer,
- e->v.FormattedValue.format_spec,
- true
- ))
- {
- return -1;
- }
+
+ if (-1 == append_interpolation_format_spec(writer, e->v.FormattedValue.format_spec)) {
+ return -1;
}
APPEND_CHAR_FINISH('}');
@@ -901,8 +965,12 @@ append_ast_expr(PyUnicodeWriter *writer, expr_ty e, int level)
return append_ast_constant(writer, e->v.Constant.value);
case JoinedStr_kind:
return append_joinedstr(writer, e, false);
+ case TemplateStr_kind:
+ return append_templatestr(writer, e);
case FormattedValue_kind:
return append_formattedvalue(writer, e);
+ case Interpolation_kind:
+ return append_interpolation(writer, e);
/* The following exprs can be assignment targets. */
case Attribute_kind:
return append_ast_attribute(writer, e);
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 95786c91371e98..65e061c5e131b0 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -16,6 +16,7 @@
#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS
#include "pycore_function.h"
#include "pycore_instruments.h"
+#include "pycore_interpolation.h" // _PyInterpolation_FromStackRefStealOnSuccess()
#include "pycore_intrinsics.h"
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_moduleobject.h" // PyModuleObject
@@ -30,6 +31,7 @@
#include "pycore_setobject.h" // _PySet_NextEntry()
#include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs
#include "pycore_stackref.h"
+#include "pycore_template.h" // _PyTemplate_From{List,Values}()
#include "pycore_tuple.h" // _PyTuple_ITEMS()
#include "pycore_typeobject.h" // _PySuper_Lookup()
@@ -1913,6 +1915,36 @@ dummy_func(
str = PyStackRef_FromPyObjectSteal(str_o);
}
+ inst(BUILD_INTERPOLATION, (values[4] -- interpolation)) {
+ PyObject *interpolation_o = _PyInterpolation_FromStackRefStealOnSuccess(values);
+ if (interpolation_o == NULL) {
+ ERROR_NO_POP();
+ }
+ INPUTS_DEAD();
+ interpolation = PyStackRef_FromPyObjectSteal(interpolation_o);
+ }
+
+ inst(BUILD_TEMPLATE, (pieces[oparg] -- template)) {
+ STACKREFS_TO_PYOBJECTS(pieces, oparg, pieces_o);
+ if (CONVERSION_FAILED(pieces_o)) {
+ DECREF_INPUTS();
+ ERROR_IF(true, error);
+ }
+ PyObject *template_o = _PyTemplate_FromValues(pieces_o, oparg);
+ STACKREFS_TO_PYOBJECTS_CLEANUP(pieces_o);
+ DECREF_INPUTS();
+ ERROR_IF(template_o == NULL, error);
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ }
+
+ inst(BUILD_TEMPLATE_LIST, (list -- template)) {
+ PyObject *list_o = PyStackRef_AsPyObjectBorrow(list);
+ PyObject *template_o = _PyTemplate_FromList(list_o);
+ PyStackRef_CLOSE(list);
+ ERROR_IF(template_o == NULL, error);
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ }
+
inst(BUILD_TUPLE, (values[oparg] -- tup)) {
PyObject *tup_o = _PyTuple_FromStackRefStealOnSuccess(values, oparg);
if (tup_o == NULL) {
diff --git a/Python/ceval.c b/Python/ceval.c
index e534c7e2b883d5..e01d64e809b114 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -19,6 +19,7 @@
#include "pycore_import.h" // _PyImport_IsDefaultImportFunc()
#include "pycore_instruments.h"
#include "pycore_interpframe.h" // _PyFrame_SetStackPointer()
+#include "pycore_interpolation.h" // _PyInterpolation_FromStackRefStealOnSuccess()
#include "pycore_intrinsics.h"
#include "pycore_jit.h"
#include "pycore_list.h" // _PyList_GetItemRef()
@@ -36,6 +37,7 @@
#include "pycore_setobject.h" // _PySet_Update()
#include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
+#include "pycore_template.h" // _PyTemplate_From{List,Values}()
#include "pycore_traceback.h" // _PyTraceBack_FromFrame
#include "pycore_tuple.h" // _PyTuple_ITEMS()
#include "pycore_uop_ids.h" // Uops
diff --git a/Python/codegen.c b/Python/codegen.c
index 35b46dcdc40950..ef44ad2cef0bef 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -3593,7 +3593,9 @@ infer_type(expr_ty e)
case Lambda_kind:
return &PyFunction_Type;
case JoinedStr_kind:
+ case TemplateStr_kind:
case FormattedValue_kind:
+ case Interpolation_kind:
return &PyUnicode_Type;
case Constant_kind:
return Py_TYPE(e->v.Constant.value);
@@ -3616,7 +3618,9 @@ check_caller(compiler *c, expr_ty e)
case SetComp_kind:
case GeneratorExp_kind:
case JoinedStr_kind:
- case FormattedValue_kind: {
+ case TemplateStr_kind:
+ case FormattedValue_kind:
+ case Interpolation_kind: {
location loc = LOC(e);
return _PyCompile_Warn(c, loc, "'%.200s' object is not callable; "
"perhaps you missed a comma?",
@@ -3679,7 +3683,9 @@ check_index(compiler *c, expr_ty e, expr_ty s)
case List_kind:
case ListComp_kind:
case JoinedStr_kind:
- case FormattedValue_kind: {
+ case TemplateStr_kind:
+ case FormattedValue_kind:
+ case Interpolation_kind: {
location loc = LOC(e);
return _PyCompile_Warn(c, loc, "%.200s indices must be integers "
"or slices, not %.200s; "
@@ -4029,6 +4035,26 @@ codegen_call(compiler *c, expr_ty e)
return ret;
}
+static int
+codegen_template_str(compiler *c, expr_ty e)
+{
+ location loc = LOC(e);
+ Py_ssize_t value_count = asdl_seq_LEN(e->v.TemplateStr.values);
+ if (value_count > _PY_STACK_USE_GUIDELINE) {
+ ADDOP_I(c, loc, BUILD_LIST, 0);
+ for (Py_ssize_t i = 0; i < asdl_seq_LEN(e->v.TemplateStr.values); i++) {
+ VISIT(c, expr, asdl_seq_GET(e->v.TemplateStr.values, i));
+ ADDOP_I(c, loc, LIST_APPEND, 1);
+ }
+ ADDOP(c, loc, BUILD_TEMPLATE_LIST);
+ }
+ else {
+ VISIT_SEQ(c, expr, e->v.TemplateStr.values);
+ ADDOP_I(c, loc, BUILD_TEMPLATE, value_count);
+ }
+ return SUCCESS;
+}
+
static int
codegen_joined_str(compiler *c, expr_ty e)
{
@@ -4058,24 +4084,36 @@ codegen_joined_str(compiler *c, expr_ty e)
return SUCCESS;
}
-/* Used to implement f-strings. Format a single value. */
static int
-codegen_formatted_value(compiler *c, expr_ty e)
+codegen_interpolation(compiler *c, expr_ty e)
{
- /* Our oparg encodes 2 pieces of information: the conversion
- character, and whether or not a format_spec was provided.
+ location loc = LOC(e);
- Convert the conversion char to 3 bits:
- : 000 0x0 FVC_NONE The default if nothing specified.
- !s : 001 0x1 FVC_STR
- !r : 010 0x2 FVC_REPR
- !a : 011 0x3 FVC_ASCII
+ VISIT(c, expr, e->v.Interpolation.value);
+ ADDOP_LOAD_CONST(c, loc, e->v.Interpolation.str);
- next bit is whether or not we have a format spec:
- yes : 100 0x4
- no : 000 0x0
- */
+ if (e->v.Interpolation.conversion) {
+ ADDOP_LOAD_CONST(c, loc, e->v.Interpolation.conversion);
+ }
+ else {
+ ADDOP(c, loc, PUSH_NULL);
+ }
+ if (e->v.Interpolation.format_spec) {
+ VISIT(c, expr, e->v.Interpolation.format_spec);
+ }
+ else {
+ ADDOP(c, loc, PUSH_NULL);
+ }
+
+ ADDOP(c, loc, BUILD_INTERPOLATION);
+ return SUCCESS;
+}
+
+/* Used to implement f-strings. Format a single value. */
+static int
+codegen_formatted_value(compiler *c, expr_ty e)
+{
int conversion = e->v.FormattedValue.conversion;
int oparg;
@@ -5168,8 +5206,12 @@ codegen_visit_expr(compiler *c, expr_ty e)
break;
case JoinedStr_kind:
return codegen_joined_str(c, e);
+ case TemplateStr_kind:
+ return codegen_template_str(c, e);
case FormattedValue_kind:
return codegen_formatted_value(c, e);
+ case Interpolation_kind:
+ return codegen_interpolation(c, e);
/* The following exprs can be assignment targets. */
case Attribute_kind:
if (e->v.Attribute.ctx == Load) {
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 9bfb13e2d9773f..a95fda83d8bb46 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -2605,6 +2605,85 @@
break;
}
+ case _BUILD_INTERPOLATION: {
+ _PyStackRef *values;
+ _PyStackRef interpolation;
+ values = &stack_pointer[-4];
+ PyObject *interpolation_o = _PyInterpolation_FromStackRefStealOnSuccess(values);
+ if (interpolation_o == NULL) {
+ JUMP_TO_ERROR();
+ }
+ interpolation = PyStackRef_FromPyObjectSteal(interpolation_o);
+ stack_pointer[-4] = interpolation;
+ stack_pointer += -3;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _BUILD_TEMPLATE: {
+ _PyStackRef *pieces;
+ _PyStackRef template;
+ oparg = CURRENT_OPARG();
+ pieces = &stack_pointer[-oparg];
+ STACKREFS_TO_PYOBJECTS(pieces, oparg, pieces_o);
+ if (CONVERSION_FAILED(pieces_o)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyStackRef tmp;
+ for (int _i = oparg; --_i >= 0;) {
+ tmp = pieces[_i];
+ pieces[_i] = PyStackRef_NULL;
+ PyStackRef_CLOSE(tmp);
+ }
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += -oparg;
+ assert(WITHIN_STACK_BOUNDS());
+ JUMP_TO_ERROR();
+ }
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyObject *template_o = _PyTemplate_FromValues(pieces_o, oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ STACKREFS_TO_PYOBJECTS_CLEANUP(pieces_o);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyStackRef tmp;
+ for (int _i = oparg; --_i >= 0;) {
+ tmp = pieces[_i];
+ pieces[_i] = PyStackRef_NULL;
+ PyStackRef_CLOSE(tmp);
+ }
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += -oparg;
+ assert(WITHIN_STACK_BOUNDS());
+ if (template_o == NULL) {
+ JUMP_TO_ERROR();
+ }
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ stack_pointer[0] = template;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _BUILD_TEMPLATE_LIST: {
+ _PyStackRef list;
+ _PyStackRef template;
+ list = stack_pointer[-1];
+ PyObject *list_o = PyStackRef_AsPyObjectBorrow(list);
+ PyObject *template_o = _PyTemplate_FromList(list_o);
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyStackRef_CLOSE(list);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (template_o == NULL) {
+ JUMP_TO_ERROR();
+ }
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ stack_pointer[0] = template;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
case _BUILD_TUPLE: {
_PyStackRef *values;
_PyStackRef tup;
diff --git a/Python/frame.c b/Python/frame.c
index 558f92055bbfc1..ce216797e47cda 100644
--- a/Python/frame.c
+++ b/Python/frame.c
@@ -69,6 +69,7 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
_PyInterpreterFrame *prev = _PyFrame_GetFirstComplete(frame->previous);
if (prev) {
assert(prev->owner < FRAME_OWNED_BY_INTERPRETER);
+ PyObject *exc = PyErr_GetRaisedException();
/* Link PyFrameObjects.f_back and remove link through _PyInterpreterFrame.previous */
PyFrameObject *back = _PyFrame_GetFrameObject(prev);
if (back == NULL) {
@@ -80,6 +81,7 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
else {
f->f_back = (PyFrameObject *)Py_NewRef(back);
}
+ PyErr_SetRaisedException(exc);
}
if (!_PyObject_GC_IS_TRACKED((PyObject *)f)) {
_PyObject_GC_TRACK((PyObject *)f);
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 6fe647d6197a07..2608722895eb32 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -1088,6 +1088,28 @@
DISPATCH();
}
+ TARGET(BUILD_INTERPOLATION) {
+ #if Py_TAIL_CALL_INTERP
+ int opcode = BUILD_INTERPOLATION;
+ (void)(opcode);
+ #endif
+ frame->instr_ptr = next_instr;
+ next_instr += 1;
+ INSTRUCTION_STATS(BUILD_INTERPOLATION);
+ _PyStackRef *values;
+ _PyStackRef interpolation;
+ values = &stack_pointer[-4];
+ PyObject *interpolation_o = _PyInterpolation_FromStackRefStealOnSuccess(values);
+ if (interpolation_o == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ interpolation = PyStackRef_FromPyObjectSteal(interpolation_o);
+ stack_pointer[-4] = interpolation;
+ stack_pointer += -3;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
TARGET(BUILD_LIST) {
#if Py_TAIL_CALL_INTERP
int opcode = BUILD_LIST;
@@ -1303,6 +1325,83 @@
DISPATCH();
}
+ TARGET(BUILD_TEMPLATE) {
+ #if Py_TAIL_CALL_INTERP
+ int opcode = BUILD_TEMPLATE;
+ (void)(opcode);
+ #endif
+ frame->instr_ptr = next_instr;
+ next_instr += 1;
+ INSTRUCTION_STATS(BUILD_TEMPLATE);
+ _PyStackRef *pieces;
+ _PyStackRef template;
+ pieces = &stack_pointer[-oparg];
+ STACKREFS_TO_PYOBJECTS(pieces, oparg, pieces_o);
+ if (CONVERSION_FAILED(pieces_o)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyStackRef tmp;
+ for (int _i = oparg; --_i >= 0;) {
+ tmp = pieces[_i];
+ pieces[_i] = PyStackRef_NULL;
+ PyStackRef_CLOSE(tmp);
+ }
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += -oparg;
+ assert(WITHIN_STACK_BOUNDS());
+ JUMP_TO_LABEL(error);
+ }
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyObject *template_o = _PyTemplate_FromValues(pieces_o, oparg);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ STACKREFS_TO_PYOBJECTS_CLEANUP(pieces_o);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ _PyStackRef tmp;
+ for (int _i = oparg; --_i >= 0;) {
+ tmp = pieces[_i];
+ pieces[_i] = PyStackRef_NULL;
+ PyStackRef_CLOSE(tmp);
+ }
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ stack_pointer += -oparg;
+ assert(WITHIN_STACK_BOUNDS());
+ if (template_o == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ stack_pointer[0] = template;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
+ TARGET(BUILD_TEMPLATE_LIST) {
+ #if Py_TAIL_CALL_INTERP
+ int opcode = BUILD_TEMPLATE_LIST;
+ (void)(opcode);
+ #endif
+ frame->instr_ptr = next_instr;
+ next_instr += 1;
+ INSTRUCTION_STATS(BUILD_TEMPLATE_LIST);
+ _PyStackRef list;
+ _PyStackRef template;
+ list = stack_pointer[-1];
+ PyObject *list_o = PyStackRef_AsPyObjectBorrow(list);
+ PyObject *template_o = _PyTemplate_FromList(list_o);
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ PyStackRef_CLOSE(list);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ if (template_o == NULL) {
+ JUMP_TO_LABEL(error);
+ }
+ template = PyStackRef_FromPyObjectSteal(template_o);
+ stack_pointer[0] = template;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ DISPATCH();
+ }
+
TARGET(BUILD_TUPLE) {
#if Py_TAIL_CALL_INTERP
int opcode = BUILD_TUPLE;
diff --git a/Python/importdl.c b/Python/importdl.c
index 73fedc4ba5fd40..802843fe7b9dce 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -6,7 +6,6 @@
#include "pycore_import.h" // _PyImport_SwapPackageContext()
#include "pycore_importdl.h"
#include "pycore_moduleobject.h" // _PyModule_GetDef()
-#include "pycore_moduleobject.h" // _PyModule_GetDef()
#include "pycore_pyerrors.h" // _PyErr_FormatFromCause()
#include "pycore_runtime.h" // _Py_ID()
diff --git a/Python/jit.c b/Python/jit.c
index 8a91d2f62a4627..e232cc1f7d9250 100644
--- a/Python/jit.c
+++ b/Python/jit.c
@@ -12,6 +12,7 @@
#include "pycore_frame.h"
#include "pycore_function.h"
#include "pycore_interpframe.h"
+#include "pycore_interpolation.h"
#include "pycore_intrinsics.h"
#include "pycore_list.h"
#include "pycore_long.h"
@@ -21,6 +22,7 @@
#include "pycore_pyerrors.h"
#include "pycore_setobject.h"
#include "pycore_sliceobject.h"
+#include "pycore_template.h"
#include "pycore_tuple.h"
#include "pycore_unicodeobject.h"
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index 5b9fb794c6bddc..211f128caf8276 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -2,8 +2,10 @@
static void *opcode_targets[256] = {
&&TARGET_CACHE,
&&TARGET_BINARY_SLICE,
- &&TARGET_CALL_FUNCTION_EX,
+ &&TARGET_BUILD_INTERPOLATION,
&&TARGET_BINARY_OP_INPLACE_ADD_UNICODE,
+ &&TARGET_BUILD_TEMPLATE_LIST,
+ &&TARGET_CALL_FUNCTION_EX,
&&TARGET_CHECK_EG_MATCH,
&&TARGET_CHECK_EXC_MATCH,
&&TARGET_CLEANUP_THROW,
@@ -15,9 +17,9 @@ static void *opcode_targets[256] = {
&&TARGET_FORMAT_WITH_SPEC,
&&TARGET_GET_AITER,
&&TARGET_GET_ANEXT,
+ &&TARGET_RESERVED,
&&TARGET_GET_ITER,
&&TARGET_GET_LEN,
- &&TARGET_RESERVED,
&&TARGET_GET_YIELD_FROM_ITER,
&&TARGET_INTERPRETER_EXIT,
&&TARGET_LOAD_BUILD_CLASS,
@@ -49,6 +51,7 @@ static void *opcode_targets[256] = {
&&TARGET_BUILD_SET,
&&TARGET_BUILD_SLICE,
&&TARGET_BUILD_STRING,
+ &&TARGET_BUILD_TEMPLATE,
&&TARGET_BUILD_TUPLE,
&&TARGET_CALL,
&&TARGET_CALL_INTRINSIC_1,
@@ -125,9 +128,6 @@ static void *opcode_targets[256] = {
&&_unknown_opcode,
&&_unknown_opcode,
&&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
&&TARGET_RESUME,
&&TARGET_BINARY_OP_ADD_FLOAT,
&&TARGET_BINARY_OP_ADD_INT,
@@ -285,11 +285,14 @@ Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBSCR_TUPLE_INT(TAIL_
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP_SUBTRACT_INT(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_SLICE(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_INTERPOLATION(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_LIST(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_MAP(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_SET(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_SLICE(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_STRING(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_TEMPLATE(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_TEMPLATE_LIST(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BUILD_TUPLE(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_CACHE(TAIL_CALL_PARAMS);
Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_CALL(TAIL_CALL_PARAMS);
@@ -521,11 +524,14 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = {
[BINARY_OP_SUBTRACT_FLOAT] = _TAIL_CALL_BINARY_OP_SUBTRACT_FLOAT,
[BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_BINARY_OP_SUBTRACT_INT,
[BINARY_SLICE] = _TAIL_CALL_BINARY_SLICE,
+ [BUILD_INTERPOLATION] = _TAIL_CALL_BUILD_INTERPOLATION,
[BUILD_LIST] = _TAIL_CALL_BUILD_LIST,
[BUILD_MAP] = _TAIL_CALL_BUILD_MAP,
[BUILD_SET] = _TAIL_CALL_BUILD_SET,
[BUILD_SLICE] = _TAIL_CALL_BUILD_SLICE,
[BUILD_STRING] = _TAIL_CALL_BUILD_STRING,
+ [BUILD_TEMPLATE] = _TAIL_CALL_BUILD_TEMPLATE,
+ [BUILD_TEMPLATE_LIST] = _TAIL_CALL_BUILD_TEMPLATE_LIST,
[BUILD_TUPLE] = _TAIL_CALL_BUILD_TUPLE,
[CACHE] = _TAIL_CALL_CACHE,
[CALL] = _TAIL_CALL_CALL,
@@ -729,9 +735,6 @@ static py_tail_call_funcptr INSTRUCTION_TABLE[256] = {
[UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_UNPACK_SEQUENCE_TWO_TUPLE,
[WITH_EXCEPT_START] = _TAIL_CALL_WITH_EXCEPT_START,
[YIELD_VALUE] = _TAIL_CALL_YIELD_VALUE,
- [119] = _TAIL_CALL_UNKNOWN_OPCODE,
- [120] = _TAIL_CALL_UNKNOWN_OPCODE,
- [121] = _TAIL_CALL_UNKNOWN_OPCODE,
[122] = _TAIL_CALL_UNKNOWN_OPCODE,
[123] = _TAIL_CALL_UNKNOWN_OPCODE,
[124] = _TAIL_CALL_UNKNOWN_OPCODE,
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index f51b00d25fe506..47152c71cdc419 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -1018,6 +1018,31 @@
break;
}
+ case _BUILD_INTERPOLATION: {
+ JitOptSymbol *interpolation;
+ interpolation = sym_new_not_null(ctx);
+ stack_pointer[-4] = interpolation;
+ stack_pointer += -3;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _BUILD_TEMPLATE: {
+ JitOptSymbol *template;
+ template = sym_new_not_null(ctx);
+ stack_pointer[-oparg] = template;
+ stack_pointer += 1 - oparg;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _BUILD_TEMPLATE_LIST: {
+ JitOptSymbol *template;
+ template = sym_new_not_null(ctx);
+ stack_pointer[-1] = template;
+ break;
+ }
+
case _BUILD_TUPLE: {
JitOptSymbol **values;
JitOptSymbol *tup;
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 1b9832bff17ba5..1271e6fb908820 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -13,6 +13,7 @@
#include "pycore_freelist.h" // _PyObject_ClearFreeLists()
#include "pycore_global_objects_fini_generated.h" // _PyStaticObjects_CheckRefcnt()
#include "pycore_initconfig.h" // _PyStatus_OK()
+#include "pycore_interpolation.h" // _PyInterpolation_InitTypes()
#include "pycore_long.h" // _PyLong_InitTypes()
#include "pycore_object.h" // _PyDebug_PrintTotalRefs()
#include "pycore_obmalloc.h" // _PyMem_init_obmalloc()
@@ -754,6 +755,11 @@ pycore_init_types(PyInterpreterState *interp)
return status;
}
+ status = _PyInterpolation_InitTypes(interp);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+ }
+
return _PyStatus_OK();
}
diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h
index 26f6272ae9cfbc..baf55c95a110bb 100644
--- a/Python/stdlib_module_names.h
+++ b/Python/stdlib_module_names.h
@@ -90,6 +90,7 @@ static const char* _Py_stdlib_module_names[] = {
"_suggestions",
"_symtable",
"_sysconfig",
+"_templatelib",
"_thread",
"_threading_local",
"_tkinter",
diff --git a/Python/symtable.c b/Python/symtable.c
index 35c9a0e295c60c..f4ccf5381bff57 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -2510,9 +2510,17 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
if (e->v.FormattedValue.format_spec)
VISIT(st, expr, e->v.FormattedValue.format_spec);
break;
+ case Interpolation_kind:
+ VISIT(st, expr, e->v.Interpolation.value);
+ if (e->v.Interpolation.format_spec)
+ VISIT(st, expr, e->v.Interpolation.format_spec);
+ break;
case JoinedStr_kind:
VISIT_SEQ(st, expr, e->v.JoinedStr.values);
break;
+ case TemplateStr_kind:
+ VISIT_SEQ(st, expr, e->v.TemplateStr.values);
+ break;
case Constant_kind:
/* Nothing to do here. */
break;
diff --git a/Tools/c-analyzer/TODO b/Tools/c-analyzer/TODO
index d509489176b945..2077534ccf4128 100644
--- a/Tools/c-analyzer/TODO
+++ b/Tools/c-analyzer/TODO
@@ -794,6 +794,7 @@ Objects/genobject.c:_PyAsyncGenASend_Type PyTypeObject _P
Objects/genobject.c:_PyAsyncGenAThrow_Type PyTypeObject _PyAsyncGenAThrow_Type
Objects/genobject.c:_PyAsyncGenWrappedValue_Type PyTypeObject _PyAsyncGenWrappedValue_Type
Objects/genobject.c:_PyCoroWrapper_Type PyTypeObject _PyCoroWrapper_Type
+Objects/interpolationobject.c:_PyInterpolation_Type PyTypeObject _PyInterpolation_Type
Objects/interpreteridobject.c:_PyInterpreterID_Type PyTypeObject _PyInterpreterID_Type
Objects/iterobject.c:PyCallIter_Type PyTypeObject PyCallIter_Type
Objects/iterobject.c:PySeqIter_Type PyTypeObject PySeqIter_Type
@@ -827,6 +828,8 @@ Objects/sliceobject.c:PyEllipsis_Type PyTypeObject Py
Objects/sliceobject.c:PySlice_Type PyTypeObject PySlice_Type
Objects/stringlib/unicode_format.h:PyFieldNameIter_Type static PyTypeObject PyFieldNameIter_Type
Objects/stringlib/unicode_format.h:PyFormatterIter_Type static PyTypeObject PyFormatterIter_Type
+Objects/templateobject.c:_PyTemplateIter_Type PyTypeObject _PyTemplateIter_Type
+Objects/templateobject.c:_PyTemplate_Type PyTypeObject _PyTemplate_Type
Objects/tupleobject.c:PyTupleIter_Type PyTypeObject PyTupleIter_Type
Objects/tupleobject.c:PyTuple_Type PyTypeObject PyTuple_Type
Objects/typeobject.c:PyBaseObject_Type PyTypeObject PyBaseObject_Type
diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv
index 54954cfb5f83ff..3c3cb2f9c86f16 100644
--- a/Tools/c-analyzer/cpython/globals-to-fix.tsv
+++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv
@@ -55,6 +55,7 @@ Objects/genobject.c - _PyAsyncGenASend_Type -
Objects/genobject.c - _PyAsyncGenAThrow_Type -
Objects/genobject.c - _PyAsyncGenWrappedValue_Type -
Objects/genobject.c - _PyCoroWrapper_Type -
+Objects/interpolationobject.c - _PyInterpolation_Type -
Objects/iterobject.c - PyCallIter_Type -
Objects/iterobject.c - PySeqIter_Type -
Objects/iterobject.c - _PyAnextAwaitable_Type -
@@ -86,6 +87,8 @@ Objects/setobject.c - PySetIter_Type -
Objects/setobject.c - PySet_Type -
Objects/sliceobject.c - PyEllipsis_Type -
Objects/sliceobject.c - PySlice_Type -
+Objects/templateobject.c - _PyTemplateIter_Type -
+Objects/templateobject.c - _PyTemplate_Type -
Objects/tupleobject.c - PyTupleIter_Type -
Objects/tupleobject.c - PyTuple_Type -
Objects/typeobject.c - _PyBufferWrapper_Type -
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index a217d7136a5401..fbb0008aae02a0 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -630,6 +630,7 @@ def has_error_without_pop(op: parser.CodeDef) -> bool:
"_PyFrame_StackPush",
"_PyFunction_SetVersion",
"_PyGen_GetGeneratorFromFrame",
+ "_PyInterpolation_FromStackRefStealOnSuccess",
"_PyInterpreterState_GET",
"_PyList_AppendTakeRef",
"_PyList_ITEMS",
@@ -648,6 +649,7 @@ def has_error_without_pop(op: parser.CodeDef) -> bool:
"_PyObject_InlineValues",
"_PyObject_IsUniquelyReferenced",
"_PyObject_ManagedDictPointer",
+ "_PyTemplate_FromList",
"_PyThreadState_HasStackSpace",
"_PyTuple_FromStackRefStealOnSuccess",
"_PyTuple_ITEMS",
diff --git a/Tools/jit/template.c b/Tools/jit/template.c
index bc18e702eeaa3b..68cf75942d85c9 100644
--- a/Tools/jit/template.c
+++ b/Tools/jit/template.c
@@ -13,6 +13,7 @@
#include "pycore_function.h"
#include "pycore_genobject.h"
#include "pycore_interpframe.h"
+#include "pycore_interpolation.h"
#include "pycore_intrinsics.h"
#include "pycore_jit.h"
#include "pycore_list.h"
@@ -25,6 +26,7 @@
#include "pycore_setobject.h"
#include "pycore_sliceobject.h"
#include "pycore_stackref.h"
+#include "pycore_template.h"
#include "pycore_tuple.h"
#include "pycore_unicodeobject.h"
diff --git a/configure b/configure
index decb8f2449d162..542d8688772022 100755
--- a/configure
+++ b/configure
@@ -785,6 +785,8 @@ MODULE__TYPING_FALSE
MODULE__TYPING_TRUE
MODULE__TYPES_FALSE
MODULE__TYPES_TRUE
+MODULE__TEMPLATELIB_FALSE
+MODULE__TEMPLATELIB_TRUE
MODULE__STRUCT_FALSE
MODULE__STRUCT_TRUE
MODULE_SELECT_FALSE
@@ -30986,6 +30988,28 @@ then :
+fi
+
+
+ if test "$py_cv_module__templatelib" != "n/a"
+then :
+ py_cv_module__templatelib=yes
+fi
+ if test "$py_cv_module__templatelib" = yes; then
+ MODULE__TEMPLATELIB_TRUE=
+ MODULE__TEMPLATELIB_FALSE='#'
+else
+ MODULE__TEMPLATELIB_TRUE='#'
+ MODULE__TEMPLATELIB_FALSE=
+fi
+
+ as_fn_append MODULE_BLOCK "MODULE__TEMPLATELIB_STATE=$py_cv_module__templatelib$as_nl"
+ if test "x$py_cv_module__templatelib" = xyes
+then :
+
+
+
+
fi
@@ -33719,6 +33743,10 @@ if test -z "${MODULE__STRUCT_TRUE}" && test -z "${MODULE__STRUCT_FALSE}"; then
as_fn_error $? "conditional \"MODULE__STRUCT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${MODULE__TEMPLATELIB_TRUE}" && test -z "${MODULE__TEMPLATELIB_FALSE}"; then
+ as_fn_error $? "conditional \"MODULE__TEMPLATELIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${MODULE__TYPES_TRUE}" && test -z "${MODULE__TYPES_FALSE}"; then
as_fn_error $? "conditional \"MODULE__TYPES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/configure.ac b/configure.ac
index 004797b5233c20..d8ccda5e6d4294 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7786,6 +7786,7 @@ PY_STDLIB_MOD_SIMPLE([_queue])
PY_STDLIB_MOD_SIMPLE([_random])
PY_STDLIB_MOD_SIMPLE([select])
PY_STDLIB_MOD_SIMPLE([_struct])
+PY_STDLIB_MOD_SIMPLE([_templatelib])
PY_STDLIB_MOD_SIMPLE([_types])
PY_STDLIB_MOD_SIMPLE([_typing])
PY_STDLIB_MOD_SIMPLE([_interpreters])