diff options
| author | Jeff Epler <jepler@gmail.com> | 2020-03-09 08:33:47 -0500 |
|---|---|---|
| committer | Jeff Epler <jepler@gmail.com> | 2020-03-09 09:03:25 -0500 |
| commit | 32647cd9b41c26003df0bdc385353f6a24b727d7 (patch) | |
| tree | ea6d7df1de060d757a3004a680797559b742d4db | |
| parent | acd7b8932f9ae4dc03d28ebcf13795de5e913368 (diff) | |
lexer: catch concatenation of f'' and '' strings
This turns the "edge case" into a parse-time error.
| -rw-r--r-- | py/lexer.c | 13 | ||||
| -rw-r--r-- | tests/basics/string_pep498_fstring.py | 6 |
2 files changed, 16 insertions, 3 deletions
diff --git a/py/lexer.c b/py/lexer.c index c3f4e6506..80f8f043c 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -583,6 +583,8 @@ void mp_lexer_to_next(mp_lexer_t *lex) { // MP_TOKEN_END is used to indicate that this is the first string token lex->tok_kind = MP_TOKEN_END; + bool saw_normal = false, saw_fstring = false; + // Loop to accumulate string/bytes literals do { // parse type codes @@ -619,6 +621,17 @@ void mp_lexer_to_next(mp_lexer_t *lex) { is_fstring = true; } + if (is_fstring) { + saw_fstring = true; + } else { + saw_normal = true; + } + + if (saw_fstring && saw_normal) { + // Can't concatenate f-string with normal string + break; + } + // Set or check token kind if (lex->tok_kind == MP_TOKEN_END) { lex->tok_kind = kind; diff --git a/tests/basics/string_pep498_fstring.py b/tests/basics/string_pep498_fstring.py index f4e76c831..c645a730c 100644 --- a/tests/basics/string_pep498_fstring.py +++ b/tests/basics/string_pep498_fstring.py @@ -104,10 +104,10 @@ assert f'result={foo()}' == 'result={result}'.format(result=foo()) x = 10 y = 'hi' assert (f'h' f'i') == 'hi' -assert (f'h' 'i') == 'hi' -assert ('h' f'i') == 'hi' +#assert (f'h' 'i') == 'hi' +#assert ('h' f'i') == 'hi' assert f'{x:^4}' == ' 10 ' -assert ('a' 'b' f'{x}' f'str<{y:^4}>' 'd' 'e') == 'ab10str< hi >de' +#assert ('a' 'b' f'{x}' f'str<{y:^4}>' 'd' 'e') == 'ab10str< hi >de' # Other tests assert f'{{{4*10}}}' == '{40}' |
