py/lexer: Support raw f-strings.
Support for raw str/bytes already exists, and extending that to raw f-strings is easy. It also reduces code size because it eliminates an error message. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
a066f2308f
commit
3c8089d1b1
16
py/lexer.c
16
py/lexer.c
@ -661,21 +661,19 @@ void mp_lexer_to_next(mp_lexer_t *lex) {
|
|||||||
}
|
}
|
||||||
#if MICROPY_PY_FSTRINGS
|
#if MICROPY_PY_FSTRINGS
|
||||||
if (is_char_following(lex, 'f')) {
|
if (is_char_following(lex, 'f')) {
|
||||||
// raw-f-strings unsupported, immediately return (invalid) token.
|
is_fstring = true;
|
||||||
lex->tok_kind = MP_TOKEN_FSTRING_RAW;
|
n_char = 2;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#if MICROPY_PY_FSTRINGS
|
#if MICROPY_PY_FSTRINGS
|
||||||
else if (is_char(lex, 'f')) {
|
else if (is_char(lex, 'f')) {
|
||||||
if (is_char_following(lex, 'r')) {
|
|
||||||
// raw-f-strings unsupported, immediately return (invalid) token.
|
|
||||||
lex->tok_kind = MP_TOKEN_FSTRING_RAW;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
n_char = 1;
|
|
||||||
is_fstring = true;
|
is_fstring = true;
|
||||||
|
n_char = 1;
|
||||||
|
if (is_char_following(lex, 'r')) {
|
||||||
|
is_raw = true;
|
||||||
|
n_char = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,6 @@ typedef enum _mp_token_kind_t {
|
|||||||
MP_TOKEN_LONELY_STRING_OPEN,
|
MP_TOKEN_LONELY_STRING_OPEN,
|
||||||
#if MICROPY_PY_FSTRINGS
|
#if MICROPY_PY_FSTRINGS
|
||||||
MP_TOKEN_MALFORMED_FSTRING,
|
MP_TOKEN_MALFORMED_FSTRING,
|
||||||
MP_TOKEN_FSTRING_RAW,
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MP_TOKEN_NEWLINE,
|
MP_TOKEN_NEWLINE,
|
||||||
|
|||||||
@ -1351,9 +1351,6 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
|
|||||||
} else if (lex->tok_kind == MP_TOKEN_MALFORMED_FSTRING) {
|
} else if (lex->tok_kind == MP_TOKEN_MALFORMED_FSTRING) {
|
||||||
exc = mp_obj_new_exception_msg(&mp_type_SyntaxError,
|
exc = mp_obj_new_exception_msg(&mp_type_SyntaxError,
|
||||||
MP_ERROR_TEXT("malformed f-string"));
|
MP_ERROR_TEXT("malformed f-string"));
|
||||||
} else if (lex->tok_kind == MP_TOKEN_FSTRING_RAW) {
|
|
||||||
exc = mp_obj_new_exception_msg(&mp_type_SyntaxError,
|
|
||||||
MP_ERROR_TEXT("raw f-strings are not supported"));
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
exc = mp_obj_new_exception_msg(&mp_type_SyntaxError,
|
exc = mp_obj_new_exception_msg(&mp_type_SyntaxError,
|
||||||
|
|||||||
@ -75,3 +75,7 @@ print(
|
|||||||
f"cd---------------------------------"
|
f"cd---------------------------------"
|
||||||
f"e{y}f---------------------------------"
|
f"e{y}f---------------------------------"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Raw f-strings.
|
||||||
|
print(rf"\r\a\w {'f'} \s\t\r\i\n\g")
|
||||||
|
print(fr"\r{x}")
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
----------------
|
----------------
|
||||||
[ 1] file_input_2(1) (n=10)
|
[ 1] file_input_2(1) (n=10)
|
||||||
tok(6)
|
tok(5)
|
||||||
[ 4] \(rule\|for_stmt\)(22) (n=4)
|
[ 4] \(rule\|for_stmt\)(22) (n=4)
|
||||||
id(i)
|
id(i)
|
||||||
[ 4] \(rule\|atom_paren\)(45) (n=1)
|
[ 4] \(rule\|atom_paren\)(45) (n=1)
|
||||||
@ -9,7 +9,7 @@
|
|||||||
NULL
|
NULL
|
||||||
[ 6] \(rule\|expr_stmt\)(5) (n=2)
|
[ 6] \(rule\|expr_stmt\)(5) (n=2)
|
||||||
id(a)
|
id(a)
|
||||||
tok(16)
|
tok(15)
|
||||||
[ 7] \(rule\|expr_stmt\)(5) (n=2)
|
[ 7] \(rule\|expr_stmt\)(5) (n=2)
|
||||||
id(b)
|
id(b)
|
||||||
str(str)
|
str(str)
|
||||||
|
|||||||
@ -1,8 +0,0 @@
|
|||||||
"""
|
|
||||||
categories: Core
|
|
||||||
description: Raw f-strings are not supported
|
|
||||||
cause: MicroPython is optimised for code space.
|
|
||||||
workaround: Unknown
|
|
||||||
"""
|
|
||||||
|
|
||||||
rf"hello"
|
|
||||||
Loading…
x
Reference in New Issue
Block a user