mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
bpo-42218: Correctly handle errors in left-recursive rules (GH-23065)
Left-recursive rules need to check for errors explicitly, since even if the rule returns NULL, the parsing might continue and lead to long-distance failures. Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
d21cb2d5ee
commit
02cdfc93f8
4 changed files with 32 additions and 0 deletions
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue