From d9151cb45371836d39b6d53afb50c5bcd353c661 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 13 Apr 2021 02:32:33 +0100 Subject: [PATCH] Ensure that early = are not matched by the parser as invalid comparisons (GH-25375) --- Grammar/python.gram | 6 +- Lib/test/test_syntax.py | 5 + Parser/parser.c | 731 +++++++++++++++++++++++----------------- 3 files changed, 423 insertions(+), 319 deletions(-) diff --git a/Grammar/python.gram b/Grammar/python.gram index 324793c88af..8524a1206b0 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -447,6 +447,10 @@ named_expression[expr_ty]: | invalid_named_expression | expression !':=' +direct_named_expression[expr_ty]: + | a=NAME ':=' ~ b=expression { _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } + | expression !':=' + annotated_rhs[expr_ty]: yield_expr | star_expressions expressions[expr_ty]: @@ -671,7 +675,7 @@ arguments[expr_ty] (memo): | a=args [','] &')' { a } | invalid_arguments args[expr_ty]: - | a[asdl_expr_seq*]=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } + | a[asdl_expr_seq*]=','.(starred_expression | direct_named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } | a=kwargs { _PyAST_Call(_PyPegen_dummy_name(p), CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)), CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)), diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 78b11c93351..0e6942f6a6f 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -863,6 +863,11 @@ leading to spurious errors. Traceback (most recent call last): SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? +Ensure that early = are not matched by the parser as invalid comparisons + >>> f(2, 4, x=34); {1,2 a} + Traceback (most recent call last): + SyntaxError: invalid syntax + Make sure that the old "raise X, Y[, Z]" form is gone: >>> raise X, Y Traceback (most recent call last): diff --git a/Parser/parser.c b/Parser/parser.c index 099186e6232..38bab96ae39 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -159,299 +159,300 @@ static KeywordToken *reserved_keywords[] = { #define star_named_expressions_type 1091 #define star_named_expression_type 1092 #define named_expression_type 1093 -#define annotated_rhs_type 1094 -#define expressions_type 1095 -#define expression_type 1096 -#define lambdef_type 1097 -#define lambda_params_type 1098 -#define lambda_parameters_type 1099 -#define lambda_slash_no_default_type 1100 -#define lambda_slash_with_default_type 1101 -#define lambda_star_etc_type 1102 -#define lambda_kwds_type 1103 -#define lambda_param_no_default_type 1104 -#define lambda_param_with_default_type 1105 -#define lambda_param_maybe_default_type 1106 -#define lambda_param_type 1107 -#define disjunction_type 1108 -#define conjunction_type 1109 -#define inversion_type 1110 -#define comparison_type 1111 -#define compare_op_bitwise_or_pair_type 1112 -#define eq_bitwise_or_type 1113 -#define noteq_bitwise_or_type 1114 -#define lte_bitwise_or_type 1115 -#define lt_bitwise_or_type 1116 -#define gte_bitwise_or_type 1117 -#define gt_bitwise_or_type 1118 -#define notin_bitwise_or_type 1119 -#define in_bitwise_or_type 1120 -#define isnot_bitwise_or_type 1121 -#define is_bitwise_or_type 1122 -#define bitwise_or_type 1123 // Left-recursive -#define bitwise_xor_type 1124 // Left-recursive -#define bitwise_and_type 1125 // Left-recursive -#define shift_expr_type 1126 // Left-recursive -#define sum_type 1127 // Left-recursive -#define term_type 1128 // Left-recursive -#define factor_type 1129 -#define power_type 1130 -#define await_primary_type 1131 -#define primary_type 1132 // Left-recursive -#define slices_type 1133 -#define slice_type 1134 -#define atom_type 1135 -#define strings_type 1136 -#define list_type 1137 -#define listcomp_type 1138 -#define tuple_type 1139 -#define group_type 1140 -#define genexp_type 1141 -#define set_type 1142 -#define setcomp_type 1143 -#define dict_type 1144 -#define dictcomp_type 1145 -#define double_starred_kvpairs_type 1146 -#define double_starred_kvpair_type 1147 -#define kvpair_type 1148 -#define for_if_clauses_type 1149 -#define for_if_clause_type 1150 -#define yield_expr_type 1151 -#define arguments_type 1152 -#define args_type 1153 -#define kwargs_type 1154 -#define starred_expression_type 1155 -#define kwarg_or_starred_type 1156 -#define kwarg_or_double_starred_type 1157 -#define star_targets_type 1158 -#define star_targets_list_seq_type 1159 -#define star_targets_tuple_seq_type 1160 -#define star_target_type 1161 -#define target_with_star_atom_type 1162 -#define star_atom_type 1163 -#define single_target_type 1164 -#define single_subscript_attribute_target_type 1165 -#define del_targets_type 1166 -#define del_target_type 1167 -#define del_t_atom_type 1168 -#define targets_type 1169 -#define target_type 1170 -#define t_primary_type 1171 // Left-recursive -#define t_lookahead_type 1172 -#define t_atom_type 1173 -#define invalid_arguments_type 1174 -#define invalid_kwarg_type 1175 -#define invalid_named_expression_type 1176 -#define invalid_assignment_type 1177 -#define invalid_ann_assign_target_type 1178 -#define invalid_del_stmt_type 1179 -#define invalid_block_type 1180 -#define invalid_primary_type 1181 // Left-recursive -#define invalid_comprehension_type 1182 -#define invalid_dict_comprehension_type 1183 -#define invalid_parameters_type 1184 -#define invalid_parameters_helper_type 1185 -#define invalid_lambda_parameters_type 1186 -#define invalid_lambda_parameters_helper_type 1187 -#define invalid_star_etc_type 1188 -#define invalid_lambda_star_etc_type 1189 -#define invalid_double_type_comments_type 1190 -#define invalid_with_item_type 1191 -#define invalid_for_target_type 1192 -#define invalid_group_type 1193 -#define invalid_import_from_targets_type 1194 -#define invalid_with_stmt_type 1195 -#define invalid_except_block_type 1196 -#define invalid_match_stmt_type 1197 -#define invalid_case_block_type 1198 -#define invalid_if_stmt_type 1199 -#define invalid_elif_stmt_type 1200 -#define invalid_while_stmt_type 1201 -#define _loop0_1_type 1202 -#define _loop0_2_type 1203 -#define _loop0_4_type 1204 -#define _gather_3_type 1205 -#define _loop0_6_type 1206 -#define _gather_5_type 1207 -#define _loop0_8_type 1208 -#define _gather_7_type 1209 -#define _loop0_10_type 1210 -#define _gather_9_type 1211 -#define _loop1_11_type 1212 -#define _loop0_13_type 1213 -#define _gather_12_type 1214 -#define _tmp_14_type 1215 -#define _tmp_15_type 1216 -#define _tmp_16_type 1217 -#define _tmp_17_type 1218 -#define _tmp_18_type 1219 -#define _tmp_19_type 1220 -#define _tmp_20_type 1221 -#define _tmp_21_type 1222 -#define _loop1_22_type 1223 -#define _tmp_23_type 1224 -#define _tmp_24_type 1225 -#define _loop0_26_type 1226 -#define _gather_25_type 1227 -#define _loop0_28_type 1228 -#define _gather_27_type 1229 -#define _tmp_29_type 1230 -#define _tmp_30_type 1231 -#define _loop0_31_type 1232 -#define _loop1_32_type 1233 -#define _loop0_34_type 1234 -#define _gather_33_type 1235 -#define _tmp_35_type 1236 -#define _loop0_37_type 1237 -#define _gather_36_type 1238 -#define _tmp_38_type 1239 -#define _loop0_40_type 1240 -#define _gather_39_type 1241 -#define _loop0_42_type 1242 -#define _gather_41_type 1243 -#define _loop0_44_type 1244 -#define _gather_43_type 1245 -#define _loop0_46_type 1246 -#define _gather_45_type 1247 -#define _tmp_47_type 1248 -#define _loop1_48_type 1249 -#define _tmp_49_type 1250 -#define _loop1_50_type 1251 -#define _loop0_52_type 1252 -#define _gather_51_type 1253 -#define _tmp_53_type 1254 -#define _tmp_54_type 1255 -#define _tmp_55_type 1256 -#define _loop0_57_type 1257 -#define _gather_56_type 1258 -#define _tmp_58_type 1259 -#define _loop0_60_type 1260 -#define _gather_59_type 1261 -#define _tmp_61_type 1262 -#define _loop0_63_type 1263 -#define _gather_62_type 1264 -#define _loop0_65_type 1265 -#define _gather_64_type 1266 -#define _tmp_66_type 1267 -#define _tmp_67_type 1268 -#define _tmp_68_type 1269 -#define _tmp_69_type 1270 -#define _loop0_70_type 1271 -#define _loop0_71_type 1272 -#define _loop0_72_type 1273 -#define _loop1_73_type 1274 -#define _loop0_74_type 1275 -#define _loop1_75_type 1276 -#define _loop1_76_type 1277 -#define _loop1_77_type 1278 -#define _loop0_78_type 1279 -#define _loop1_79_type 1280 -#define _loop0_80_type 1281 -#define _loop1_81_type 1282 -#define _loop0_82_type 1283 -#define _loop1_83_type 1284 -#define _loop1_84_type 1285 -#define _tmp_85_type 1286 -#define _loop1_86_type 1287 -#define _loop0_88_type 1288 -#define _gather_87_type 1289 -#define _loop1_89_type 1290 -#define _loop0_90_type 1291 -#define _loop0_91_type 1292 -#define _loop0_92_type 1293 -#define _loop1_93_type 1294 -#define _loop0_94_type 1295 -#define _loop1_95_type 1296 -#define _loop1_96_type 1297 -#define _loop1_97_type 1298 -#define _loop0_98_type 1299 -#define _loop1_99_type 1300 -#define _loop0_100_type 1301 -#define _loop1_101_type 1302 -#define _loop0_102_type 1303 -#define _loop1_103_type 1304 -#define _loop1_104_type 1305 -#define _loop1_105_type 1306 -#define _loop1_106_type 1307 -#define _tmp_107_type 1308 -#define _loop0_109_type 1309 -#define _gather_108_type 1310 -#define _tmp_110_type 1311 -#define _tmp_111_type 1312 -#define _tmp_112_type 1313 -#define _tmp_113_type 1314 -#define _loop1_114_type 1315 -#define _tmp_115_type 1316 -#define _tmp_116_type 1317 -#define _loop0_118_type 1318 -#define _gather_117_type 1319 -#define _loop1_119_type 1320 -#define _loop0_120_type 1321 -#define _loop0_121_type 1322 -#define _loop0_123_type 1323 -#define _gather_122_type 1324 -#define _tmp_124_type 1325 -#define _loop0_126_type 1326 -#define _gather_125_type 1327 -#define _loop0_128_type 1328 -#define _gather_127_type 1329 -#define _loop0_130_type 1330 -#define _gather_129_type 1331 -#define _loop0_132_type 1332 -#define _gather_131_type 1333 -#define _loop0_133_type 1334 -#define _loop0_135_type 1335 -#define _gather_134_type 1336 -#define _loop1_136_type 1337 -#define _tmp_137_type 1338 -#define _loop0_139_type 1339 -#define _gather_138_type 1340 -#define _loop0_141_type 1341 -#define _gather_140_type 1342 -#define _tmp_142_type 1343 -#define _tmp_143_type 1344 -#define _tmp_144_type 1345 -#define _tmp_145_type 1346 -#define _loop0_146_type 1347 -#define _loop0_147_type 1348 -#define _loop0_148_type 1349 -#define _tmp_149_type 1350 -#define _tmp_150_type 1351 -#define _tmp_151_type 1352 -#define _loop0_152_type 1353 -#define _loop1_153_type 1354 -#define _loop0_154_type 1355 -#define _loop1_155_type 1356 -#define _tmp_156_type 1357 -#define _tmp_157_type 1358 -#define _tmp_158_type 1359 -#define _loop0_160_type 1360 -#define _gather_159_type 1361 -#define _loop0_162_type 1362 -#define _gather_161_type 1363 -#define _tmp_163_type 1364 -#define _tmp_164_type 1365 -#define _tmp_165_type 1366 -#define _tmp_166_type 1367 -#define _tmp_167_type 1368 -#define _tmp_168_type 1369 -#define _tmp_169_type 1370 -#define _tmp_170_type 1371 -#define _tmp_171_type 1372 -#define _tmp_172_type 1373 -#define _tmp_173_type 1374 -#define _tmp_174_type 1375 -#define _tmp_175_type 1376 -#define _tmp_176_type 1377 -#define _tmp_177_type 1378 -#define _tmp_178_type 1379 -#define _tmp_179_type 1380 -#define _tmp_180_type 1381 -#define _tmp_181_type 1382 -#define _tmp_182_type 1383 -#define _tmp_183_type 1384 -#define _tmp_184_type 1385 -#define _tmp_185_type 1386 +#define direct_named_expression_type 1094 +#define annotated_rhs_type 1095 +#define expressions_type 1096 +#define expression_type 1097 +#define lambdef_type 1098 +#define lambda_params_type 1099 +#define lambda_parameters_type 1100 +#define lambda_slash_no_default_type 1101 +#define lambda_slash_with_default_type 1102 +#define lambda_star_etc_type 1103 +#define lambda_kwds_type 1104 +#define lambda_param_no_default_type 1105 +#define lambda_param_with_default_type 1106 +#define lambda_param_maybe_default_type 1107 +#define lambda_param_type 1108 +#define disjunction_type 1109 +#define conjunction_type 1110 +#define inversion_type 1111 +#define comparison_type 1112 +#define compare_op_bitwise_or_pair_type 1113 +#define eq_bitwise_or_type 1114 +#define noteq_bitwise_or_type 1115 +#define lte_bitwise_or_type 1116 +#define lt_bitwise_or_type 1117 +#define gte_bitwise_or_type 1118 +#define gt_bitwise_or_type 1119 +#define notin_bitwise_or_type 1120 +#define in_bitwise_or_type 1121 +#define isnot_bitwise_or_type 1122 +#define is_bitwise_or_type 1123 +#define bitwise_or_type 1124 // Left-recursive +#define bitwise_xor_type 1125 // Left-recursive +#define bitwise_and_type 1126 // Left-recursive +#define shift_expr_type 1127 // Left-recursive +#define sum_type 1128 // Left-recursive +#define term_type 1129 // Left-recursive +#define factor_type 1130 +#define power_type 1131 +#define await_primary_type 1132 +#define primary_type 1133 // Left-recursive +#define slices_type 1134 +#define slice_type 1135 +#define atom_type 1136 +#define strings_type 1137 +#define list_type 1138 +#define listcomp_type 1139 +#define tuple_type 1140 +#define group_type 1141 +#define genexp_type 1142 +#define set_type 1143 +#define setcomp_type 1144 +#define dict_type 1145 +#define dictcomp_type 1146 +#define double_starred_kvpairs_type 1147 +#define double_starred_kvpair_type 1148 +#define kvpair_type 1149 +#define for_if_clauses_type 1150 +#define for_if_clause_type 1151 +#define yield_expr_type 1152 +#define arguments_type 1153 +#define args_type 1154 +#define kwargs_type 1155 +#define starred_expression_type 1156 +#define kwarg_or_starred_type 1157 +#define kwarg_or_double_starred_type 1158 +#define star_targets_type 1159 +#define star_targets_list_seq_type 1160 +#define star_targets_tuple_seq_type 1161 +#define star_target_type 1162 +#define target_with_star_atom_type 1163 +#define star_atom_type 1164 +#define single_target_type 1165 +#define single_subscript_attribute_target_type 1166 +#define del_targets_type 1167 +#define del_target_type 1168 +#define del_t_atom_type 1169 +#define targets_type 1170 +#define target_type 1171 +#define t_primary_type 1172 // Left-recursive +#define t_lookahead_type 1173 +#define t_atom_type 1174 +#define invalid_arguments_type 1175 +#define invalid_kwarg_type 1176 +#define invalid_named_expression_type 1177 +#define invalid_assignment_type 1178 +#define invalid_ann_assign_target_type 1179 +#define invalid_del_stmt_type 1180 +#define invalid_block_type 1181 +#define invalid_primary_type 1182 // Left-recursive +#define invalid_comprehension_type 1183 +#define invalid_dict_comprehension_type 1184 +#define invalid_parameters_type 1185 +#define invalid_parameters_helper_type 1186 +#define invalid_lambda_parameters_type 1187 +#define invalid_lambda_parameters_helper_type 1188 +#define invalid_star_etc_type 1189 +#define invalid_lambda_star_etc_type 1190 +#define invalid_double_type_comments_type 1191 +#define invalid_with_item_type 1192 +#define invalid_for_target_type 1193 +#define invalid_group_type 1194 +#define invalid_import_from_targets_type 1195 +#define invalid_with_stmt_type 1196 +#define invalid_except_block_type 1197 +#define invalid_match_stmt_type 1198 +#define invalid_case_block_type 1199 +#define invalid_if_stmt_type 1200 +#define invalid_elif_stmt_type 1201 +#define invalid_while_stmt_type 1202 +#define _loop0_1_type 1203 +#define _loop0_2_type 1204 +#define _loop0_4_type 1205 +#define _gather_3_type 1206 +#define _loop0_6_type 1207 +#define _gather_5_type 1208 +#define _loop0_8_type 1209 +#define _gather_7_type 1210 +#define _loop0_10_type 1211 +#define _gather_9_type 1212 +#define _loop1_11_type 1213 +#define _loop0_13_type 1214 +#define _gather_12_type 1215 +#define _tmp_14_type 1216 +#define _tmp_15_type 1217 +#define _tmp_16_type 1218 +#define _tmp_17_type 1219 +#define _tmp_18_type 1220 +#define _tmp_19_type 1221 +#define _tmp_20_type 1222 +#define _tmp_21_type 1223 +#define _loop1_22_type 1224 +#define _tmp_23_type 1225 +#define _tmp_24_type 1226 +#define _loop0_26_type 1227 +#define _gather_25_type 1228 +#define _loop0_28_type 1229 +#define _gather_27_type 1230 +#define _tmp_29_type 1231 +#define _tmp_30_type 1232 +#define _loop0_31_type 1233 +#define _loop1_32_type 1234 +#define _loop0_34_type 1235 +#define _gather_33_type 1236 +#define _tmp_35_type 1237 +#define _loop0_37_type 1238 +#define _gather_36_type 1239 +#define _tmp_38_type 1240 +#define _loop0_40_type 1241 +#define _gather_39_type 1242 +#define _loop0_42_type 1243 +#define _gather_41_type 1244 +#define _loop0_44_type 1245 +#define _gather_43_type 1246 +#define _loop0_46_type 1247 +#define _gather_45_type 1248 +#define _tmp_47_type 1249 +#define _loop1_48_type 1250 +#define _tmp_49_type 1251 +#define _loop1_50_type 1252 +#define _loop0_52_type 1253 +#define _gather_51_type 1254 +#define _tmp_53_type 1255 +#define _tmp_54_type 1256 +#define _tmp_55_type 1257 +#define _loop0_57_type 1258 +#define _gather_56_type 1259 +#define _tmp_58_type 1260 +#define _loop0_60_type 1261 +#define _gather_59_type 1262 +#define _tmp_61_type 1263 +#define _loop0_63_type 1264 +#define _gather_62_type 1265 +#define _loop0_65_type 1266 +#define _gather_64_type 1267 +#define _tmp_66_type 1268 +#define _tmp_67_type 1269 +#define _tmp_68_type 1270 +#define _tmp_69_type 1271 +#define _loop0_70_type 1272 +#define _loop0_71_type 1273 +#define _loop0_72_type 1274 +#define _loop1_73_type 1275 +#define _loop0_74_type 1276 +#define _loop1_75_type 1277 +#define _loop1_76_type 1278 +#define _loop1_77_type 1279 +#define _loop0_78_type 1280 +#define _loop1_79_type 1281 +#define _loop0_80_type 1282 +#define _loop1_81_type 1283 +#define _loop0_82_type 1284 +#define _loop1_83_type 1285 +#define _loop1_84_type 1286 +#define _tmp_85_type 1287 +#define _loop1_86_type 1288 +#define _loop0_88_type 1289 +#define _gather_87_type 1290 +#define _loop1_89_type 1291 +#define _loop0_90_type 1292 +#define _loop0_91_type 1293 +#define _loop0_92_type 1294 +#define _loop1_93_type 1295 +#define _loop0_94_type 1296 +#define _loop1_95_type 1297 +#define _loop1_96_type 1298 +#define _loop1_97_type 1299 +#define _loop0_98_type 1300 +#define _loop1_99_type 1301 +#define _loop0_100_type 1302 +#define _loop1_101_type 1303 +#define _loop0_102_type 1304 +#define _loop1_103_type 1305 +#define _loop1_104_type 1306 +#define _loop1_105_type 1307 +#define _loop1_106_type 1308 +#define _tmp_107_type 1309 +#define _loop0_109_type 1310 +#define _gather_108_type 1311 +#define _tmp_110_type 1312 +#define _tmp_111_type 1313 +#define _tmp_112_type 1314 +#define _tmp_113_type 1315 +#define _loop1_114_type 1316 +#define _tmp_115_type 1317 +#define _tmp_116_type 1318 +#define _loop0_118_type 1319 +#define _gather_117_type 1320 +#define _loop1_119_type 1321 +#define _loop0_120_type 1322 +#define _loop0_121_type 1323 +#define _loop0_123_type 1324 +#define _gather_122_type 1325 +#define _tmp_124_type 1326 +#define _loop0_126_type 1327 +#define _gather_125_type 1328 +#define _loop0_128_type 1329 +#define _gather_127_type 1330 +#define _loop0_130_type 1331 +#define _gather_129_type 1332 +#define _loop0_132_type 1333 +#define _gather_131_type 1334 +#define _loop0_133_type 1335 +#define _loop0_135_type 1336 +#define _gather_134_type 1337 +#define _loop1_136_type 1338 +#define _tmp_137_type 1339 +#define _loop0_139_type 1340 +#define _gather_138_type 1341 +#define _loop0_141_type 1342 +#define _gather_140_type 1343 +#define _tmp_142_type 1344 +#define _tmp_143_type 1345 +#define _tmp_144_type 1346 +#define _tmp_145_type 1347 +#define _loop0_146_type 1348 +#define _loop0_147_type 1349 +#define _loop0_148_type 1350 +#define _tmp_149_type 1351 +#define _tmp_150_type 1352 +#define _tmp_151_type 1353 +#define _loop0_152_type 1354 +#define _loop1_153_type 1355 +#define _loop0_154_type 1356 +#define _loop1_155_type 1357 +#define _tmp_156_type 1358 +#define _tmp_157_type 1359 +#define _tmp_158_type 1360 +#define _loop0_160_type 1361 +#define _gather_159_type 1362 +#define _loop0_162_type 1363 +#define _gather_161_type 1364 +#define _tmp_163_type 1365 +#define _tmp_164_type 1366 +#define _tmp_165_type 1367 +#define _tmp_166_type 1368 +#define _tmp_167_type 1369 +#define _tmp_168_type 1370 +#define _tmp_169_type 1371 +#define _tmp_170_type 1372 +#define _tmp_171_type 1373 +#define _tmp_172_type 1374 +#define _tmp_173_type 1375 +#define _tmp_174_type 1376 +#define _tmp_175_type 1377 +#define _tmp_176_type 1378 +#define _tmp_177_type 1379 +#define _tmp_178_type 1380 +#define _tmp_179_type 1381 +#define _tmp_180_type 1382 +#define _tmp_181_type 1383 +#define _tmp_182_type 1384 +#define _tmp_183_type 1385 +#define _tmp_184_type 1386 +#define _tmp_185_type 1387 static mod_ty file_rule(Parser *p); static mod_ty interactive_rule(Parser *p); @@ -547,6 +548,7 @@ static expr_ty star_expression_rule(Parser *p); static asdl_expr_seq* star_named_expressions_rule(Parser *p); static expr_ty star_named_expression_rule(Parser *p); static expr_ty named_expression_rule(Parser *p); +static expr_ty direct_named_expression_rule(Parser *p); static expr_ty annotated_rhs_rule(Parser *p); static expr_ty expressions_rule(Parser *p); static expr_ty expression_rule(Parser *p); @@ -9397,6 +9399,99 @@ named_expression_rule(Parser *p) return _res; } +// direct_named_expression: NAME ':=' ~ expression | expression !':=' +static expr_ty +direct_named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME ':=' ~ expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> direct_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + int _cut_var = 0; + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 53)) // token=':=' + && + (_cut_var = 1) + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ direct_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyAST_NamedExpr ( CHECK ( expr_ty , _PyPegen_set_expr_context ( p , a , Store ) ) , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s direct_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ':=' ~ expression")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // expression !':=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> direct_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' + ) + { + D(fprintf(stderr, "%*c+ direct_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s direct_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + // annotated_rhs: yield_expr | star_expressions static expr_ty annotated_rhs_rule(Parser *p) @@ -14807,7 +14902,7 @@ arguments_rule(Parser *p) return _res; } -// args: ','.(starred_expression | named_expression !'=')+ [',' kwargs] | kwargs +// args: ','.(starred_expression | direct_named_expression !'=')+ [',' kwargs] | kwargs static expr_ty args_rule(Parser *p) { @@ -14827,21 +14922,21 @@ args_rule(Parser *p) UNUSED(_start_lineno); // Only used by EXTRA macro int _start_col_offset = p->tokens[_mark]->col_offset; UNUSED(_start_col_offset); // Only used by EXTRA macro - { // ','.(starred_expression | named_expression !'=')+ [',' kwargs] + { // ','.(starred_expression | direct_named_expression !'=')+ [',' kwargs] if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | direct_named_expression !'=')+ [',' kwargs]")); asdl_expr_seq* a; void *b; if ( - (a = (asdl_expr_seq*)_gather_122_rule(p)) // ','.(starred_expression | named_expression !'=')+ + (a = (asdl_expr_seq*)_gather_122_rule(p)) // ','.(starred_expression | direct_named_expression !'=')+ && (b = _tmp_124_rule(p), 1) // [',' kwargs] ) { - D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | direct_named_expression !'=')+ [',' kwargs]")); Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); if (_token == NULL) { D(p->level--); @@ -14861,7 +14956,7 @@ args_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | direct_named_expression !'=')+ [',' kwargs]")); } { // kwargs if (p->error_indicator) { @@ -26406,7 +26501,7 @@ _loop0_121_rule(Parser *p) return _seq; } -// _loop0_123: ',' (starred_expression | named_expression !'=') +// _loop0_123: ',' (starred_expression | direct_named_expression !'=') static asdl_seq * _loop0_123_rule(Parser *p) { @@ -26427,18 +26522,18 @@ _loop0_123_rule(Parser *p) } Py_ssize_t _children_capacity = 1; Py_ssize_t _n = 0; - { // ',' (starred_expression | named_expression !'=') + { // ',' (starred_expression | direct_named_expression !'=') if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | direct_named_expression !'=')")); Token * _literal; void *elem; while ( (_literal = _PyPegen_expect_token(p, 12)) // token=',' && - (elem = _tmp_175_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_175_rule(p)) // starred_expression | direct_named_expression !'=' ) { _res = elem; @@ -26464,7 +26559,7 @@ _loop0_123_rule(Parser *p) } p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | direct_named_expression !'=')")); } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -26481,7 +26576,7 @@ _loop0_123_rule(Parser *p) return _seq; } -// _gather_122: (starred_expression | named_expression !'=') _loop0_123 +// _gather_122: (starred_expression | direct_named_expression !'=') _loop0_123 static asdl_seq * _gather_122_rule(Parser *p) { @@ -26492,27 +26587,27 @@ _gather_122_rule(Parser *p) } asdl_seq * _res = NULL; int _mark = p->mark; - { // (starred_expression | named_expression !'=') _loop0_123 + { // (starred_expression | direct_named_expression !'=') _loop0_123 if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_123")); + D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | direct_named_expression !'=') _loop0_123")); void *elem; asdl_seq * seq; if ( - (elem = _tmp_175_rule(p)) // starred_expression | named_expression !'=' + (elem = _tmp_175_rule(p)) // starred_expression | direct_named_expression !'=' && (seq = _loop0_123_rule(p)) // _loop0_123 ) { - D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_123")); + D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | direct_named_expression !'=') _loop0_123")); _res = _PyPegen_seq_insert_in_front(p, elem, seq); goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _gather_122[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_123")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | direct_named_expression !'=') _loop0_123")); } _res = NULL; done: @@ -29491,7 +29586,7 @@ _tmp_174_rule(Parser *p) return _res; } -// _tmp_175: starred_expression | named_expression !'=' +// _tmp_175: starred_expression | direct_named_expression !'=' static void * _tmp_175_rule(Parser *p) { @@ -29521,26 +29616,26 @@ _tmp_175_rule(Parser *p) D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); } - { // named_expression !'=' + { // direct_named_expression !'=' if (p->error_indicator) { D(p->level--); return NULL; } - D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); - expr_ty named_expression_var; + D(fprintf(stderr, "%*c> _tmp_175[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "direct_named_expression !'='")); + expr_ty direct_named_expression_var; if ( - (named_expression_var = named_expression_rule(p)) // named_expression + (direct_named_expression_var = direct_named_expression_rule(p)) // direct_named_expression && _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' ) { - D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); - _res = named_expression_var; + D(fprintf(stderr, "%*c+ _tmp_175[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "direct_named_expression !'='")); + _res = direct_named_expression_var; goto done; } p->mark = _mark; D(fprintf(stderr, "%*c%s _tmp_175[%d-%d]: %s failed!\n", p->level, ' ', - p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "direct_named_expression !'='")); } _res = NULL; done: