@@ -1358,14 +1358,19 @@ invalid_kvpair:
13581358invalid_starred_expression:
13591359 | a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") }
13601360invalid_replacement_field:
1361- | '{' a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: expression required before '='") }
1362- | '{' a=':' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: expression required before ':'") }
1363- | '{' a='!' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: expression required before '!'") }
1364- | '{' a='}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: empty expression not allowed") }
1365- | '{' (yield_expr | star_expressions) "="? invalid_conversion_character
1366- | '{' (yield_expr | star_expressions) "="? [ "!" NAME ] [ ':' fstring_format_spec* ] !'}' {
1367- RAISE_SYNTAX_ERROR("f-string: expecting '}'")
1368- }
1361+ | '{' !(yield_expr | star_expressions) { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting expression after '{'")}
1362+ | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') {
1363+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '}'") }
1364+ | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') {
1365+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '}'") }
1366+ | '{' (yield_expr | star_expressions) '='? invalid_conversion_character
1367+ | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') {
1368+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '}'") }
1369+ | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' {
1370+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}', or format specs") }
1371+ | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' {
1372+ PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}'") }
1373+
13691374invalid_conversion_character:
1370- | a="!" &(':'| '}') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: missed conversion character") }
1371- | a="!" !NAME { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: invalid conversion character") }
1375+ | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN( "f-string: missing conversion character") }
1376+ | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN( "f-string: invalid conversion character") }
0 commit comments