Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Lib/test/test_syntax.py
Original file line number Diff line number Diff line change
Expand Up @@ -972,6 +972,11 @@ def func2():
"""
self._check_error(code, "invalid syntax")

def test_invalid_line_continuation_left_recursive(self):
# Check bpo-42218: SyntaxErrors following left-recursive rules
# (t_primary_raw in this case) need to be tested explicitly
self._check_error('A.\u018a\\ ', "unexpected character after line continuation character")
Comment thread
lysnikolaou marked this conversation as resolved.
Outdated

def test_main():
support.run_unittest(SyntaxTestCase)
from test import test_syntax
Expand Down
18 changes: 18 additions & 0 deletions Parser/parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -3461,6 +3461,8 @@ dotted_name_rule(Parser *p)
}
p->mark = _mark;
void *_raw = dotted_name_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9045,6 +9047,8 @@ bitwise_or_rule(Parser *p)
}
p->mark = _mark;
void *_raw = bitwise_or_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9159,6 +9163,8 @@ bitwise_xor_rule(Parser *p)
}
p->mark = _mark;
void *_raw = bitwise_xor_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9273,6 +9279,8 @@ bitwise_and_rule(Parser *p)
}
p->mark = _mark;
void *_raw = bitwise_and_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9387,6 +9395,8 @@ shift_expr_rule(Parser *p)
}
p->mark = _mark;
void *_raw = shift_expr_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9540,6 +9550,8 @@ sum_rule(Parser *p)
}
p->mark = _mark;
void *_raw = sum_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -9699,6 +9711,8 @@ term_rule(Parser *p)
}
p->mark = _mark;
void *_raw = term_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -10303,6 +10317,8 @@ primary_rule(Parser *p)
}
p->mark = _mark;
void *_raw = primary_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down Expand Up @@ -13943,6 +13959,8 @@ t_primary_rule(Parser *p)
}
p->mark = _mark;
void *_raw = t_primary_raw(p);
if (p->error_indicator)
return NULL;
if (_raw == NULL || p->mark <= _resmark)
break;
_resmark = p->mark;
Expand Down
3 changes: 3 additions & 0 deletions Tools/peg_generator/pegen/c_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,9 @@ def _set_up_rule_memoization(self, node: Rule, result_type: str) -> None:
)
self.print("p->mark = _mark;")
self.print(f"void *_raw = {node.name}_raw(p);")
self.print("if (p->error_indicator)")
with self.indent():
self.print("return NULL;")
self.print("if (_raw == NULL || p->mark <= _resmark)")
with self.indent():
self.print("break;")
Expand Down