summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-03-09 08:33:47 -0500
committerJeff Epler <jepler@gmail.com>2020-03-09 09:03:25 -0500
commit32647cd9b41c26003df0bdc385353f6a24b727d7 (patch)
treeea6d7df1de060d757a3004a680797559b742d4db
parentacd7b8932f9ae4dc03d28ebcf13795de5e913368 (diff)
lexer: catch concatenation of f'' and '' strings
This turns the "edge case" into a parse-time error.
-rw-r--r--py/lexer.c13
-rw-r--r--tests/basics/string_pep498_fstring.py6
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}'