bpo-40246: Revert reporting of invalid string prefixes (GH-19888)

Due to backwards compatibility concerns regarding keywords immediately followed by a string without whitespace between them (like in `bg="#d00" if clear else"#fca"`) will fail to parse,
commit 41d5b94af4 has to be reverted.
This commit is contained in:
Lysandros Nikolaou 2020-05-04 14:32:18 +03:00 committed by GitHub
parent e10e7c771b
commit 846d8b28ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 2 additions and 12 deletions

View File

@ -31,7 +31,6 @@ extern "C" {
#define E_LINECONT 25 /* Unexpected characters after a line continuation */ #define E_LINECONT 25 /* Unexpected characters after a line continuation */
#define E_IDENTIFIER 26 /* Invalid characters in identifier */ #define E_IDENTIFIER 26 /* Invalid characters in identifier */
#define E_BADSINGLE 27 /* Ill-formed single statement input */ #define E_BADSINGLE 27 /* Ill-formed single statement input */
#define E_BADPREFIX 28 /* Bad string prefixes */
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -864,7 +864,7 @@ non-important content
"Bf''", "Bf''",
"BF''",] "BF''",]
double_quote_cases = [case.replace("'", '"') for case in single_quote_cases] double_quote_cases = [case.replace("'", '"') for case in single_quote_cases]
self.assertAllRaise(SyntaxError, 'invalid string prefix', self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing',
single_quote_cases + double_quote_cases) single_quote_cases + double_quote_cases)
def test_leading_trailing_spaces(self): def test_leading_trailing_spaces(self):

View File

@ -0,0 +1 @@
Reporting a specialised error message for invalid string prefixes, which was introduced in :issue:`40246`, is being reverted due to backwards compatibility concerns for strings that immediately follow a reserved keyword without whitespace between them. Constructs like `bg="#d00" if clear else"#fca"` were failing to parse, which is not an acceptable breakage on such short notice.

View File

@ -334,9 +334,6 @@ tokenizer_error(Parser *p)
case E_IDENTIFIER: case E_IDENTIFIER:
msg = "invalid character in identifier"; msg = "invalid character in identifier";
break; break;
case E_BADPREFIX:
RAISE_SYNTAX_ERROR("invalid string prefix");
return -1;
case E_EOFS: case E_EOFS:
RAISE_SYNTAX_ERROR("EOF while scanning triple-quoted string literal"); RAISE_SYNTAX_ERROR("EOF while scanning triple-quoted string literal");
return -1; return -1;

View File

@ -1396,10 +1396,6 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
*p_start = tok->start; *p_start = tok->start;
*p_end = tok->cur; *p_end = tok->cur;
if (c == '"' || c == '\'') {
tok->done = E_BADPREFIX;
return ERRORTOKEN;
}
/* async/await parsing block. */ /* async/await parsing block. */
if (tok->cur - tok->start == 5 && tok->start[0] == 'a') { if (tok->cur - tok->start == 5 && tok->start[0] == 'a') {
/* May be an 'async' or 'await' token. For Python 3.7 or /* May be an 'async' or 'await' token. For Python 3.7 or

View File

@ -1609,9 +1609,6 @@ err_input(perrdetail *err)
case E_BADSINGLE: case E_BADSINGLE:
msg = "multiple statements found while compiling a single statement"; msg = "multiple statements found while compiling a single statement";
break; break;
case E_BADPREFIX:
msg = "invalid string prefix";
break;
default: default:
fprintf(stderr, "error=%d\n", err->error); fprintf(stderr, "error=%d\n", err->error);
msg = "unknown parsing error"; msg = "unknown parsing error";