diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index df766387dd4c72d..ea2467e8bd02da3 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -960,6 +960,37 @@ def unused_code_at_end():
'RETURN_VALUE',
list(dis.get_instructions(unused_code_at_end))[-1].opname)
+ def test_parser_stack_overflow_in_loop_rule(self):
+ # gh-150001: A parser stack overflow inside an f-string must not be
+ # followed by a SyntaxWarning emitted with the MemoryError still set
+ def overflows(source):
+ try:
+ compile(source, '', 'exec')
+ except MemoryError:
+ return True
+ except SyntaxError:
+ pass
+ return False
+
+ # Find the shallowest nesting that overflows the parser stack
+ lo, hi = 1, 100_000
+ while lo < hi:
+ mid = (lo + hi) // 2
+ if overflows(b'~' * mid + b'x'):
+ hi = mid
+ else:
+ lo = mid + 1
+
+ # Overflow at every point around that depth, including inside the
+ # f-string with invalid escape sequences
+ tail = b'f"\\}{x}\\}"'
+ with warnings.catch_warnings():
+ warnings.simplefilter('ignore', SyntaxWarning)
+ for depth in range(max(lo - 20, 1), lo + 20):
+ with self.subTest(depth=depth):
+ with self.assertRaises((MemoryError, SyntaxError)):
+ compile(b'~' * depth + tail, '', 'exec')
+
@support.cpython_only
def test_docstring(self):
src = textwrap.dedent("""
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst
new file mode 100644
index 000000000000000..2cf65788ccbca8a
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst
@@ -0,0 +1,3 @@
+Fix a bug where parsing certain invalid Python code could raise a
+:exc:`SystemError` instead of the expected :exc:`SyntaxError`. Patch by
+Alexander Domenti.
diff --git a/Parser/parser.c b/Parser/parser.c
index 2300314a77888fa..b53a5ce7066ef82 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -19769,6 +19769,11 @@ _loop0_1_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_1[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE"));
+ if (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) {
@@ -19827,6 +19832,11 @@ _loop1_2_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_2[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -19899,6 +19909,11 @@ _loop0_3_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_3[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt"));
+ if (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) {
@@ -20435,6 +20450,11 @@ _loop1_12_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_12[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -20507,6 +20527,11 @@ _loop0_13_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME"));
+ if (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) {
@@ -20709,6 +20734,11 @@ _loop0_17_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_17[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')"));
+ if (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) {
@@ -20767,6 +20797,11 @@ _loop1_18_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_18[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -20839,6 +20874,11 @@ _loop0_19_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_19[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name"));
+ if (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) {
@@ -20993,6 +21033,11 @@ _loop0_22_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_22[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name"));
+ if (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) {
@@ -21092,6 +21137,11 @@ _loop1_24_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_24[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21250,6 +21300,11 @@ _loop0_27_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_27[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
+ if (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) {
@@ -21308,6 +21363,11 @@ _loop0_28_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default"));
+ if (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) {
@@ -21366,6 +21426,11 @@ _loop1_29_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_29[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21429,6 +21494,11 @@ _loop1_30_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_30[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21492,6 +21562,11 @@ _loop0_31_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default"));
+ if (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) {
@@ -21550,6 +21625,11 @@ _loop1_32_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21622,6 +21702,11 @@ _loop0_33_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_33[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item"));
+ if (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) {
@@ -21797,6 +21882,11 @@ _loop1_36_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_36[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21860,6 +21950,11 @@ _loop1_37_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_37[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21923,6 +22018,11 @@ _loop1_38_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_38[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "case_block"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -21995,6 +22095,11 @@ _loop0_39_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_39[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|' closed_pattern"));
+ if (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) {
@@ -22312,6 +22417,11 @@ _loop0_44_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' maybe_star_pattern"));
+ if (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) {
@@ -22420,6 +22530,11 @@ _loop0_46_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' key_value_pattern"));
+ if (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) {
@@ -22585,6 +22700,11 @@ _loop0_49_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' pattern"));
+ if (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) {
@@ -22693,6 +22813,11 @@ _loop0_51_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_51[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' keyword_pattern"));
+ if (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) {
@@ -22801,6 +22926,11 @@ _loop0_53_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' type_param"));
+ if (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) {
@@ -22900,6 +23030,11 @@ _loop1_55_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_55[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -22963,6 +23098,11 @@ _loop1_56_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_56[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -23035,6 +23175,11 @@ _loop0_57_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression"));
+ if (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) {
@@ -23134,6 +23279,11 @@ _loop1_59_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_59[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -23197,6 +23347,11 @@ _loop1_60_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -23260,6 +23415,11 @@ _loop1_61_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -23375,6 +23535,11 @@ _loop0_63_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_63[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)"));
+ if (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) {
@@ -23805,6 +23970,11 @@ _loop0_70_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_70[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default"));
+ if (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) {
@@ -23863,6 +24033,11 @@ _loop0_71_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_71[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default"));
+ if (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) {
@@ -23921,6 +24096,11 @@ _loop1_72_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_72[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -23984,6 +24164,11 @@ _loop1_73_rule(Parser *p)
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_with_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -24047,6 +24232,11 @@ _loop0_74_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default"));
+ if (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) {
@@ -24105,6 +24295,11 @@ _loop1_75_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_75[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -24168,6 +24363,11 @@ _loop0_76_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec"));
+ if (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) {
@@ -24226,6 +24426,11 @@ _loop0_77_rule(Parser *p)
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_middle"));
+ if (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) {
@@ -24284,6 +24489,11 @@ _loop0_78_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_format_spec"));
+ if (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) {
@@ -24342,6 +24552,11 @@ _loop0_79_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_middle"));
+ if (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) {
@@ -24400,6 +24615,11 @@ _loop1_80_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -24463,6 +24683,11 @@ _loop1_81_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -24535,6 +24760,11 @@ _loop0_82_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_82[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' display_item"));
+ if (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) {
@@ -24692,6 +24922,11 @@ _loop0_85_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_85[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair"));
+ if (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) {
@@ -24791,6 +25026,11 @@ _loop1_87_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -24854,6 +25094,11 @@ _loop0_88_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)"));
+ if (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) {
@@ -24999,6 +25244,11 @@ _loop0_90_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_90[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')"));
+ if (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) {
@@ -25154,6 +25404,11 @@ _loop0_93_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred"));
+ if (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) {
@@ -25308,6 +25563,11 @@ _loop0_96_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred"));
+ if (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) {
@@ -25407,6 +25667,11 @@ _loop0_98_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)"));
+ if (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) {
@@ -25590,6 +25855,11 @@ _loop0_101_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target"));
+ if (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) {
@@ -25698,6 +25968,11 @@ _loop0_103_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression"));
+ if (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) {
diff --git a/Parser/parser_invalid.c b/Parser/parser_invalid.c
index b306b9869a90dd7..4db8e9193191dbd 100644
--- a/Parser/parser_invalid.c
+++ b/Parser/parser_invalid.c
@@ -8328,6 +8328,11 @@ _loop0_107_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression !'=')"));
+ if (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) {
@@ -8626,6 +8631,11 @@ _loop1_113_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(!STRING expression_without_invalid)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -9072,6 +9082,11 @@ _loop0_119_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions"));
+ if (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) {
@@ -9130,6 +9145,11 @@ _loop0_120_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_120[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')"));
+ if (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) {
@@ -9302,6 +9322,11 @@ _loop0_123_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default"));
+ if (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) {
@@ -9360,6 +9385,11 @@ _loop0_124_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
+ if (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) {
@@ -9418,6 +9448,11 @@ _loop1_125_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_125[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -9538,6 +9573,11 @@ _loop1_127_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_127[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -9851,6 +9891,11 @@ _loop1_132_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_132[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -9971,6 +10016,11 @@ _loop0_134_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default"));
+ if (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) {
@@ -10029,6 +10079,11 @@ _loop0_135_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default"));
+ if (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) {
@@ -10096,6 +10151,11 @@ _loop0_136_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_136[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param"));
+ if (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) {
@@ -10252,6 +10312,11 @@ _loop1_139_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_139[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -10315,6 +10380,11 @@ _loop1_140_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_140[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -10625,6 +10695,11 @@ _loop0_145_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_145[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name"));
+ if (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) {
@@ -10765,6 +10840,11 @@ _loop0_148_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_148[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')"));
+ if (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) {
@@ -10832,6 +10912,11 @@ _loop0_149_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_149[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])"));
+ if (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) {
@@ -10940,6 +11025,11 @@ _loop0_151_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_151[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])"));
+ if (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) {
@@ -11096,6 +11186,11 @@ _loop0_154_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_154[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block"));
+ if (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) {
@@ -11154,6 +11249,11 @@ _loop1_155_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_155[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -11258,6 +11358,11 @@ _loop1_157_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_157[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -11597,6 +11702,11 @@ _loop0_164_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_164[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair"));
+ if (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) {
@@ -12079,6 +12189,11 @@ _loop0_172_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_172[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec"));
+ if (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) {
@@ -12137,6 +12252,11 @@ _loop1_173_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_173[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -12200,6 +12320,11 @@ _loop1_174_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop1_174[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring"));
+ if (p->error_indicator) {
+ PyMem_Free(_children);
+ p->level--;
+ return NULL;
+ }
}
if (_n == 0 || p->error_indicator) {
PyMem_Free(_children);
@@ -12828,6 +12953,11 @@ _loop0_195_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_195[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' bitwise_or)"));
+ if (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) {
@@ -13131,6 +13261,11 @@ _loop0_201_rule(Parser *p)
p->mark = _mark;
D(fprintf(stderr, "%*c%s _loop0_201[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')"));
+ if (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) {
diff --git a/Tools/peg_generator/pegen/c_generator_rules.py b/Tools/peg_generator/pegen/c_generator_rules.py
index cc252ba30d291f0..eef05f7c182a46a 100644
--- a/Tools/peg_generator/pegen/c_generator_rules.py
+++ b/Tools/peg_generator/pegen/c_generator_rules.py
@@ -224,7 +224,7 @@ def _emit_loop_body(self) -> None:
if rule.uses_locations:
self._emit_token_start_metadata()
alt, = rule.alternatives
- with self._alternative(alt):
+ with self._alternative(alt, loop_returns=buffer.error_returns):
self._emit_loop_alt(alt, buffer)
result = buffer.finish(require_one=signature.kind is RuleKind.LOOP1)
if rule.memoize:
@@ -232,7 +232,9 @@ def _emit_loop_body(self) -> None:
self._returns.emit(result)
@contextmanager
- def _alternative(self, alt: CAlternative) -> Iterator[None]:
+ def _alternative(
+ self, alt: CAlternative, loop_returns: _CReturnEmitter | None = None
+ ) -> Iterator[None]:
rulename = self._rule.signature.name
if alt.requires_invalid_rules:
self._print(f"if (p->call_invalid_rules) {{ // {alt.text}")
@@ -260,6 +262,11 @@ def _alternative(self, alt: CAlternative) -> Iterator[None]:
f"D(fprintf(stderr, \"%*c%s {rulename}[%d-%d]: %s failed!\\n\", p->level, ' ',\n"
f' p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "{node_str}"));'
)
+ if loop_returns is not None:
+ self._print("if (p->error_indicator) {")
+ with self._indent():
+ loop_returns.emit("NULL")
+ self._print("}")
if alt.cut_variable is not None:
self._print(f"if ({alt.cut_variable}) {{")
with self._indent():