mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
gh-105042: Disable unmatched parens syntax error in python tokenize (#105061)
This commit is contained in:
parent
9216e69a87
commit
70f315c2d6
5 changed files with 49 additions and 34 deletions
|
|
@ -2626,41 +2626,42 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
|
|||
case ')':
|
||||
case ']':
|
||||
case '}':
|
||||
if (!tok->level) {
|
||||
if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') {
|
||||
return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed"));
|
||||
}
|
||||
if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') {
|
||||
return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed"));
|
||||
}
|
||||
if (!tok->tok_extra_tokens && !tok->level) {
|
||||
return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c));
|
||||
}
|
||||
tok->level--;
|
||||
int opening = tok->parenstack[tok->level];
|
||||
if (!((opening == '(' && c == ')') ||
|
||||
(opening == '[' && c == ']') ||
|
||||
(opening == '{' && c == '}')))
|
||||
{
|
||||
/* If the opening bracket belongs to an f-string's expression
|
||||
part (e.g. f"{)}") and the closing bracket is an arbitrary
|
||||
nested expression, then instead of matching a different
|
||||
syntactical construct with it; we'll throw an unmatched
|
||||
parentheses error. */
|
||||
if (INSIDE_FSTRING(tok) && opening == '{') {
|
||||
assert(current_tok->curly_bracket_depth >= 0);
|
||||
int previous_bracket = current_tok->curly_bracket_depth - 1;
|
||||
if (previous_bracket == current_tok->curly_bracket_expr_start_depth) {
|
||||
return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c));
|
||||
if (tok->level > 0) {
|
||||
tok->level--;
|
||||
int opening = tok->parenstack[tok->level];
|
||||
if (!tok->tok_extra_tokens && !((opening == '(' && c == ')') ||
|
||||
(opening == '[' && c == ']') ||
|
||||
(opening == '{' && c == '}'))) {
|
||||
/* If the opening bracket belongs to an f-string's expression
|
||||
part (e.g. f"{)}") and the closing bracket is an arbitrary
|
||||
nested expression, then instead of matching a different
|
||||
syntactical construct with it; we'll throw an unmatched
|
||||
parentheses error. */
|
||||
if (INSIDE_FSTRING(tok) && opening == '{') {
|
||||
assert(current_tok->curly_bracket_depth >= 0);
|
||||
int previous_bracket = current_tok->curly_bracket_depth - 1;
|
||||
if (previous_bracket == current_tok->curly_bracket_expr_start_depth) {
|
||||
return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c));
|
||||
}
|
||||
}
|
||||
if (tok->parenlinenostack[tok->level] != tok->lineno) {
|
||||
return MAKE_TOKEN(syntaxerror(tok,
|
||||
"closing parenthesis '%c' does not match "
|
||||
"opening parenthesis '%c' on line %d",
|
||||
c, opening, tok->parenlinenostack[tok->level]));
|
||||
}
|
||||
else {
|
||||
return MAKE_TOKEN(syntaxerror(tok,
|
||||
"closing parenthesis '%c' does not match "
|
||||
"opening parenthesis '%c'",
|
||||
c, opening));
|
||||
}
|
||||
}
|
||||
if (tok->parenlinenostack[tok->level] != tok->lineno) {
|
||||
return MAKE_TOKEN(syntaxerror(tok,
|
||||
"closing parenthesis '%c' does not match "
|
||||
"opening parenthesis '%c' on line %d",
|
||||
c, opening, tok->parenlinenostack[tok->level]));
|
||||
}
|
||||
else {
|
||||
return MAKE_TOKEN(syntaxerror(tok,
|
||||
"closing parenthesis '%c' does not match "
|
||||
"opening parenthesis '%c'",
|
||||
c, opening));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue