Skip to content

Instantly share code, notes, and snippets.

@amiremohamadi
Created January 14, 2025 18:40
Show Gist options
  • Save amiremohamadi/00bac164fb177195432ba18daad4ed15 to your computer and use it in GitHub Desktop.
Save amiremohamadi/00bac164fb177195432ba18daad4ed15 to your computer and use it in GitHub Desktop.
simple implementation of ++ operator for python 3.10
diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc
index 1a99f05..8396101 100644
--- a/Doc/library/token-list.inc
+++ b/Doc/library/token-list.inc
@@ -129,6 +129,10 @@
Token value for ``"**"``.
+.. data:: PLUSPLUS
+
+ Token value for ``"++"``.
+
.. data:: PLUSEQUAL
Token value for ``"+="``.
diff --git a/Grammar/Tokens b/Grammar/Tokens
index 1f3e3b0..684e99f 100644
--- a/Grammar/Tokens
+++ b/Grammar/Tokens
@@ -35,6 +35,7 @@ CIRCUMFLEX '^'
LEFTSHIFT '<<'
RIGHTSHIFT '>>'
DOUBLESTAR '**'
+PLUSPLUS '++'
PLUSEQUAL '+='
MINEQUAL '-='
STAREQUAL '*='
diff --git a/Grammar/python.gram b/Grammar/python.gram
index de582d2..139c044 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -102,10 +102,15 @@ assignment[stmt_ty]:
CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _PyAST_AnnAssign(a, b, c, 0, EXTRA)) }
| a[asdl_expr_seq*]=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] {
_PyAST_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) }
+ | a=single_target b=unaryassign {
+ _PyAST_AugAssign(a, b->kind, 0, EXTRA) }
| a=single_target b=augassign ~ c=(yield_expr | star_expressions) {
_PyAST_AugAssign(a, b->kind, c, EXTRA) }
| invalid_assignment
+unaryassign[AugOperator*]:
+ | '++' { _PyPegen_augoperator(p, PlusPlus) }
+
augassign[AugOperator*]:
| '+=' { _PyPegen_augoperator(p, Add) }
| '-=' { _PyPegen_augoperator(p, Sub) }
diff --git a/Include/internal/pycore_ast.h b/Include/internal/pycore_ast.h
index ebb6a90..4506650 100644
--- a/Include/internal/pycore_ast.h
+++ b/Include/internal/pycore_ast.h
@@ -24,7 +24,7 @@ typedef enum _boolop { And=1, Or=2 } boolop_ty;
typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7,
LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12,
- FloorDiv=13 } operator_ty;
+ FloorDiv=13, PlusPlus=14 } operator_ty;
typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty;
diff --git a/Include/opcode.h b/Include/opcode.h
index 5203975..3da9915 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -135,6 +135,8 @@ extern "C" {
#define SET_UPDATE 163
#define DICT_MERGE 164
#define DICT_UPDATE 165
+#define INPLACE_PLUS_PLUS 166
+#define UNARY_PLUS_PLUS 167
#ifdef NEED_OPCODE_JUMP_TABLES
static uint32_t _PyOpcode_RelativeJump[8] = {
0U,
diff --git a/Include/token.h b/Include/token.h
index eb1b9ea..4b0135a 100644
--- a/Include/token.h
+++ b/Include/token.h
@@ -46,32 +46,33 @@ extern "C" {
#define LEFTSHIFT 33
#define RIGHTSHIFT 34
#define DOUBLESTAR 35
-#define PLUSEQUAL 36
-#define MINEQUAL 37
-#define STAREQUAL 38
-#define SLASHEQUAL 39
-#define PERCENTEQUAL 40
-#define AMPEREQUAL 41
-#define VBAREQUAL 42
-#define CIRCUMFLEXEQUAL 43
-#define LEFTSHIFTEQUAL 44
-#define RIGHTSHIFTEQUAL 45
-#define DOUBLESTAREQUAL 46
-#define DOUBLESLASH 47
-#define DOUBLESLASHEQUAL 48
-#define AT 49
-#define ATEQUAL 50
-#define RARROW 51
-#define ELLIPSIS 52
-#define COLONEQUAL 53
-#define OP 54
-#define AWAIT 55
-#define ASYNC 56
-#define TYPE_IGNORE 57
-#define TYPE_COMMENT 58
-#define SOFT_KEYWORD 59
-#define ERRORTOKEN 60
-#define N_TOKENS 64
+#define PLUSPLUS 36
+#define PLUSEQUAL 37
+#define MINEQUAL 38
+#define STAREQUAL 39
+#define SLASHEQUAL 40
+#define PERCENTEQUAL 41
+#define AMPEREQUAL 42
+#define VBAREQUAL 43
+#define CIRCUMFLEXEQUAL 44
+#define LEFTSHIFTEQUAL 45
+#define RIGHTSHIFTEQUAL 46
+#define DOUBLESTAREQUAL 47
+#define DOUBLESLASH 48
+#define DOUBLESLASHEQUAL 49
+#define AT 50
+#define ATEQUAL 51
+#define RARROW 52
+#define ELLIPSIS 53
+#define COLONEQUAL 54
+#define OP 55
+#define AWAIT 56
+#define ASYNC 57
+#define TYPE_IGNORE 58
+#define TYPE_COMMENT 59
+#define SOFT_KEYWORD 60
+#define ERRORTOKEN 61
+#define N_TOKENS 65
#define NT_OFFSET 256
/* Special definitions for cooperation with parser */
diff --git a/Lib/token.py b/Lib/token.py
index 9d0c0bf..a714c51 100644
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -39,36 +39,37 @@
LEFTSHIFT = 33
RIGHTSHIFT = 34
DOUBLESTAR = 35
-PLUSEQUAL = 36
-MINEQUAL = 37
-STAREQUAL = 38
-SLASHEQUAL = 39
-PERCENTEQUAL = 40
-AMPEREQUAL = 41
-VBAREQUAL = 42
-CIRCUMFLEXEQUAL = 43
-LEFTSHIFTEQUAL = 44
-RIGHTSHIFTEQUAL = 45
-DOUBLESTAREQUAL = 46
-DOUBLESLASH = 47
-DOUBLESLASHEQUAL = 48
-AT = 49
-ATEQUAL = 50
-RARROW = 51
-ELLIPSIS = 52
-COLONEQUAL = 53
-OP = 54
-AWAIT = 55
-ASYNC = 56
-TYPE_IGNORE = 57
-TYPE_COMMENT = 58
-SOFT_KEYWORD = 59
+PLUSPLUS = 36
+PLUSEQUAL = 37
+MINEQUAL = 38
+STAREQUAL = 39
+SLASHEQUAL = 40
+PERCENTEQUAL = 41
+AMPEREQUAL = 42
+VBAREQUAL = 43
+CIRCUMFLEXEQUAL = 44
+LEFTSHIFTEQUAL = 45
+RIGHTSHIFTEQUAL = 46
+DOUBLESTAREQUAL = 47
+DOUBLESLASH = 48
+DOUBLESLASHEQUAL = 49
+AT = 50
+ATEQUAL = 51
+RARROW = 52
+ELLIPSIS = 53
+COLONEQUAL = 54
+OP = 55
+AWAIT = 56
+ASYNC = 57
+TYPE_IGNORE = 58
+TYPE_COMMENT = 59
+SOFT_KEYWORD = 60
# These aren't used by the C tokenizer but are needed for tokenize.py
-ERRORTOKEN = 60
-COMMENT = 61
-NL = 62
-ENCODING = 63
-N_TOKENS = 64
+ERRORTOKEN = 61
+COMMENT = 62
+NL = 63
+ENCODING = 64
+N_TOKENS = 65
# Special definitions for cooperation with parser
NT_OFFSET = 256
@@ -90,6 +91,7 @@
'**=': DOUBLESTAREQUAL,
'*=': STAREQUAL,
'+': PLUS,
+ '++': PLUSPLUS,
'+=': PLUSEQUAL,
',': COMMA,
'-': MINUS,
diff --git a/Parser/parser.c b/Parser/parser.c
index b1d8427..5c51c9b 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -86,422 +86,423 @@ static char *soft_keywords[] = {
#define simple_stmt_type 1010
#define compound_stmt_type 1011
#define assignment_type 1012
-#define augassign_type 1013
-#define global_stmt_type 1014
-#define nonlocal_stmt_type 1015
-#define yield_stmt_type 1016
-#define assert_stmt_type 1017
-#define del_stmt_type 1018
-#define import_stmt_type 1019
-#define import_name_type 1020
-#define import_from_type 1021
-#define import_from_targets_type 1022
-#define import_from_as_names_type 1023
-#define import_from_as_name_type 1024
-#define dotted_as_names_type 1025
-#define dotted_as_name_type 1026
-#define dotted_name_type 1027 // Left-recursive
-#define if_stmt_type 1028
-#define elif_stmt_type 1029
-#define else_block_type 1030
-#define while_stmt_type 1031
-#define for_stmt_type 1032
-#define with_stmt_type 1033
-#define with_item_type 1034
-#define try_stmt_type 1035
-#define except_block_type 1036
-#define finally_block_type 1037
-#define match_stmt_type 1038
-#define subject_expr_type 1039
-#define case_block_type 1040
-#define guard_type 1041
-#define patterns_type 1042
-#define pattern_type 1043
-#define as_pattern_type 1044
-#define or_pattern_type 1045
-#define closed_pattern_type 1046
-#define literal_pattern_type 1047
-#define literal_expr_type 1048
-#define complex_number_type 1049
-#define signed_number_type 1050
-#define signed_real_number_type 1051
-#define real_number_type 1052
-#define imaginary_number_type 1053
-#define capture_pattern_type 1054
-#define pattern_capture_target_type 1055
-#define wildcard_pattern_type 1056
-#define value_pattern_type 1057
-#define attr_type 1058 // Left-recursive
-#define name_or_attr_type 1059 // Left-recursive
-#define group_pattern_type 1060
-#define sequence_pattern_type 1061
-#define open_sequence_pattern_type 1062
-#define maybe_sequence_pattern_type 1063
-#define maybe_star_pattern_type 1064
-#define star_pattern_type 1065
-#define mapping_pattern_type 1066
-#define items_pattern_type 1067
-#define key_value_pattern_type 1068
-#define double_star_pattern_type 1069
-#define class_pattern_type 1070
-#define positional_patterns_type 1071
-#define keyword_patterns_type 1072
-#define keyword_pattern_type 1073
-#define return_stmt_type 1074
-#define raise_stmt_type 1075
-#define function_def_type 1076
-#define function_def_raw_type 1077
-#define func_type_comment_type 1078
-#define params_type 1079
-#define parameters_type 1080
-#define slash_no_default_type 1081
-#define slash_with_default_type 1082
-#define star_etc_type 1083
-#define kwds_type 1084
-#define param_no_default_type 1085
-#define param_with_default_type 1086
-#define param_maybe_default_type 1087
-#define param_type 1088
-#define annotation_type 1089
-#define default_type 1090
-#define decorators_type 1091
-#define class_def_type 1092
-#define class_def_raw_type 1093
-#define block_type 1094
-#define star_expressions_type 1095
-#define star_expression_type 1096
-#define star_named_expressions_type 1097
-#define star_named_expression_type 1098
-#define assignment_expression_type 1099
-#define named_expression_type 1100
-#define annotated_rhs_type 1101
-#define expressions_type 1102
-#define expression_type 1103
-#define lambdef_type 1104
-#define lambda_params_type 1105
-#define lambda_parameters_type 1106
-#define lambda_slash_no_default_type 1107
-#define lambda_slash_with_default_type 1108
-#define lambda_star_etc_type 1109
-#define lambda_kwds_type 1110
-#define lambda_param_no_default_type 1111
-#define lambda_param_with_default_type 1112
-#define lambda_param_maybe_default_type 1113
-#define lambda_param_type 1114
-#define disjunction_type 1115
-#define conjunction_type 1116
-#define inversion_type 1117
-#define comparison_type 1118
-#define compare_op_bitwise_or_pair_type 1119
-#define eq_bitwise_or_type 1120
-#define noteq_bitwise_or_type 1121
-#define lte_bitwise_or_type 1122
-#define lt_bitwise_or_type 1123
-#define gte_bitwise_or_type 1124
-#define gt_bitwise_or_type 1125
-#define notin_bitwise_or_type 1126
-#define in_bitwise_or_type 1127
-#define isnot_bitwise_or_type 1128
-#define is_bitwise_or_type 1129
-#define bitwise_or_type 1130 // Left-recursive
-#define bitwise_xor_type 1131 // Left-recursive
-#define bitwise_and_type 1132 // Left-recursive
-#define shift_expr_type 1133 // Left-recursive
-#define sum_type 1134 // Left-recursive
-#define term_type 1135 // Left-recursive
-#define factor_type 1136
-#define power_type 1137
-#define await_primary_type 1138
-#define primary_type 1139 // Left-recursive
-#define slices_type 1140
-#define slice_type 1141
-#define atom_type 1142
-#define strings_type 1143
-#define list_type 1144
-#define listcomp_type 1145
-#define tuple_type 1146
-#define group_type 1147
-#define genexp_type 1148
-#define set_type 1149
-#define setcomp_type 1150
-#define dict_type 1151
-#define dictcomp_type 1152
-#define double_starred_kvpairs_type 1153
-#define double_starred_kvpair_type 1154
-#define kvpair_type 1155
-#define for_if_clauses_type 1156
-#define for_if_clause_type 1157
-#define yield_expr_type 1158
-#define arguments_type 1159
-#define args_type 1160
-#define kwargs_type 1161
-#define starred_expression_type 1162
-#define kwarg_or_starred_type 1163
-#define kwarg_or_double_starred_type 1164
-#define star_targets_type 1165
-#define star_targets_list_seq_type 1166
-#define star_targets_tuple_seq_type 1167
-#define star_target_type 1168
-#define target_with_star_atom_type 1169
-#define star_atom_type 1170
-#define single_target_type 1171
-#define single_subscript_attribute_target_type 1172
-#define del_targets_type 1173
-#define del_target_type 1174
-#define del_t_atom_type 1175
-#define t_primary_type 1176 // Left-recursive
-#define t_lookahead_type 1177
-#define invalid_arguments_type 1178
-#define invalid_kwarg_type 1179
-#define expression_without_invalid_type 1180
-#define invalid_legacy_expression_type 1181
-#define invalid_expression_type 1182
-#define invalid_named_expression_type 1183
-#define invalid_assignment_type 1184
-#define invalid_ann_assign_target_type 1185
-#define invalid_del_stmt_type 1186
-#define invalid_block_type 1187
-#define invalid_comprehension_type 1188
-#define invalid_dict_comprehension_type 1189
-#define invalid_parameters_type 1190
-#define invalid_parameters_helper_type 1191
-#define invalid_lambda_parameters_type 1192
-#define invalid_lambda_parameters_helper_type 1193
-#define invalid_star_etc_type 1194
-#define invalid_lambda_star_etc_type 1195
-#define invalid_double_type_comments_type 1196
-#define invalid_with_item_type 1197
-#define invalid_for_target_type 1198
-#define invalid_group_type 1199
-#define invalid_import_from_targets_type 1200
-#define invalid_with_stmt_type 1201
-#define invalid_with_stmt_indent_type 1202
-#define invalid_try_stmt_type 1203
-#define invalid_except_stmt_type 1204
-#define invalid_finally_stmt_type 1205
-#define invalid_except_stmt_indent_type 1206
-#define invalid_match_stmt_type 1207
-#define invalid_case_block_type 1208
-#define invalid_as_pattern_type 1209
-#define invalid_class_pattern_type 1210
-#define invalid_class_argument_pattern_type 1211
-#define invalid_if_stmt_type 1212
-#define invalid_elif_stmt_type 1213
-#define invalid_else_stmt_type 1214
-#define invalid_while_stmt_type 1215
-#define invalid_for_stmt_type 1216
-#define invalid_def_raw_type 1217
-#define invalid_class_def_raw_type 1218
-#define invalid_double_starred_kvpairs_type 1219
-#define invalid_kvpair_type 1220
-#define _loop0_1_type 1221
-#define _loop0_2_type 1222
-#define _loop0_4_type 1223
-#define _gather_3_type 1224
-#define _loop0_6_type 1225
-#define _gather_5_type 1226
-#define _loop0_8_type 1227
-#define _gather_7_type 1228
-#define _loop0_10_type 1229
-#define _gather_9_type 1230
-#define _loop1_11_type 1231
-#define _loop0_13_type 1232
-#define _gather_12_type 1233
-#define _tmp_14_type 1234
-#define _tmp_15_type 1235
-#define _tmp_16_type 1236
-#define _tmp_17_type 1237
-#define _tmp_18_type 1238
-#define _tmp_19_type 1239
-#define _tmp_20_type 1240
-#define _tmp_21_type 1241
-#define _loop1_22_type 1242
-#define _tmp_23_type 1243
-#define _tmp_24_type 1244
-#define _loop0_26_type 1245
-#define _gather_25_type 1246
-#define _loop0_28_type 1247
-#define _gather_27_type 1248
-#define _tmp_29_type 1249
-#define _tmp_30_type 1250
-#define _loop0_31_type 1251
-#define _loop1_32_type 1252
-#define _loop0_34_type 1253
-#define _gather_33_type 1254
-#define _tmp_35_type 1255
-#define _loop0_37_type 1256
-#define _gather_36_type 1257
-#define _tmp_38_type 1258
-#define _loop0_40_type 1259
-#define _gather_39_type 1260
-#define _loop0_42_type 1261
-#define _gather_41_type 1262
-#define _loop0_44_type 1263
-#define _gather_43_type 1264
-#define _loop0_46_type 1265
-#define _gather_45_type 1266
-#define _tmp_47_type 1267
-#define _loop1_48_type 1268
-#define _tmp_49_type 1269
-#define _loop1_50_type 1270
-#define _loop0_52_type 1271
-#define _gather_51_type 1272
-#define _tmp_53_type 1273
-#define _tmp_54_type 1274
-#define _tmp_55_type 1275
-#define _tmp_56_type 1276
-#define _loop0_58_type 1277
-#define _gather_57_type 1278
-#define _loop0_60_type 1279
-#define _gather_59_type 1280
-#define _tmp_61_type 1281
-#define _loop0_63_type 1282
-#define _gather_62_type 1283
-#define _loop0_65_type 1284
-#define _gather_64_type 1285
-#define _tmp_66_type 1286
-#define _tmp_67_type 1287
-#define _tmp_68_type 1288
-#define _tmp_69_type 1289
-#define _loop0_70_type 1290
-#define _loop0_71_type 1291
-#define _loop0_72_type 1292
-#define _loop1_73_type 1293
-#define _loop0_74_type 1294
-#define _loop1_75_type 1295
-#define _loop1_76_type 1296
-#define _loop1_77_type 1297
-#define _loop0_78_type 1298
-#define _loop1_79_type 1299
-#define _loop0_80_type 1300
-#define _loop1_81_type 1301
-#define _loop0_82_type 1302
-#define _loop1_83_type 1303
-#define _loop1_84_type 1304
-#define _tmp_85_type 1305
-#define _loop1_86_type 1306
-#define _loop0_88_type 1307
-#define _gather_87_type 1308
-#define _loop1_89_type 1309
-#define _loop0_90_type 1310
-#define _loop0_91_type 1311
-#define _loop0_92_type 1312
-#define _loop1_93_type 1313
-#define _loop0_94_type 1314
-#define _loop1_95_type 1315
-#define _loop1_96_type 1316
-#define _loop1_97_type 1317
-#define _loop0_98_type 1318
-#define _loop1_99_type 1319
-#define _loop0_100_type 1320
-#define _loop1_101_type 1321
-#define _loop0_102_type 1322
-#define _loop1_103_type 1323
-#define _loop1_104_type 1324
-#define _loop1_105_type 1325
-#define _loop1_106_type 1326
-#define _tmp_107_type 1327
-#define _loop0_109_type 1328
-#define _gather_108_type 1329
-#define _tmp_110_type 1330
-#define _tmp_111_type 1331
-#define _tmp_112_type 1332
-#define _tmp_113_type 1333
-#define _loop1_114_type 1334
-#define _tmp_115_type 1335
-#define _tmp_116_type 1336
-#define _tmp_117_type 1337
-#define _loop0_119_type 1338
-#define _gather_118_type 1339
-#define _loop1_120_type 1340
-#define _loop0_121_type 1341
-#define _loop0_122_type 1342
-#define _loop0_124_type 1343
-#define _gather_123_type 1344
-#define _tmp_125_type 1345
-#define _loop0_127_type 1346
-#define _gather_126_type 1347
-#define _loop0_129_type 1348
-#define _gather_128_type 1349
-#define _loop0_131_type 1350
-#define _gather_130_type 1351
-#define _loop0_133_type 1352
-#define _gather_132_type 1353
-#define _loop0_134_type 1354
-#define _loop0_136_type 1355
-#define _gather_135_type 1356
-#define _loop1_137_type 1357
-#define _tmp_138_type 1358
-#define _loop0_140_type 1359
-#define _gather_139_type 1360
-#define _tmp_141_type 1361
-#define _tmp_142_type 1362
-#define _tmp_143_type 1363
-#define _tmp_144_type 1364
-#define _tmp_145_type 1365
-#define _tmp_146_type 1366
-#define _tmp_147_type 1367
-#define _tmp_148_type 1368
-#define _loop0_149_type 1369
-#define _loop0_150_type 1370
-#define _loop0_151_type 1371
-#define _tmp_152_type 1372
-#define _tmp_153_type 1373
-#define _tmp_154_type 1374
-#define _tmp_155_type 1375
-#define _loop0_156_type 1376
-#define _loop1_157_type 1377
-#define _loop0_158_type 1378
-#define _loop1_159_type 1379
-#define _tmp_160_type 1380
-#define _tmp_161_type 1381
-#define _tmp_162_type 1382
-#define _loop0_164_type 1383
-#define _gather_163_type 1384
-#define _loop0_166_type 1385
-#define _gather_165_type 1386
-#define _loop0_168_type 1387
-#define _gather_167_type 1388
-#define _loop0_170_type 1389
-#define _gather_169_type 1390
-#define _tmp_171_type 1391
-#define _tmp_172_type 1392
-#define _tmp_173_type 1393
-#define _tmp_174_type 1394
-#define _tmp_175_type 1395
-#define _tmp_176_type 1396
-#define _tmp_177_type 1397
-#define _tmp_178_type 1398
-#define _loop0_180_type 1399
-#define _gather_179_type 1400
-#define _tmp_181_type 1401
-#define _tmp_182_type 1402
-#define _tmp_183_type 1403
-#define _tmp_184_type 1404
-#define _tmp_185_type 1405
-#define _tmp_186_type 1406
-#define _tmp_187_type 1407
-#define _tmp_188_type 1408
-#define _tmp_189_type 1409
-#define _tmp_190_type 1410
-#define _tmp_191_type 1411
-#define _tmp_192_type 1412
-#define _tmp_193_type 1413
-#define _tmp_194_type 1414
-#define _tmp_195_type 1415
-#define _tmp_196_type 1416
-#define _tmp_197_type 1417
-#define _tmp_198_type 1418
-#define _tmp_199_type 1419
-#define _tmp_200_type 1420
-#define _tmp_201_type 1421
-#define _tmp_202_type 1422
-#define _tmp_203_type 1423
-#define _tmp_204_type 1424
-#define _tmp_205_type 1425
-#define _tmp_206_type 1426
-#define _tmp_207_type 1427
-#define _tmp_208_type 1428
+#define unaryassign_type 1013
+#define augassign_type 1014
+#define global_stmt_type 1015
+#define nonlocal_stmt_type 1016
+#define yield_stmt_type 1017
+#define assert_stmt_type 1018
+#define del_stmt_type 1019
+#define import_stmt_type 1020
+#define import_name_type 1021
+#define import_from_type 1022
+#define import_from_targets_type 1023
+#define import_from_as_names_type 1024
+#define import_from_as_name_type 1025
+#define dotted_as_names_type 1026
+#define dotted_as_name_type 1027
+#define dotted_name_type 1028 // Left-recursive
+#define if_stmt_type 1029
+#define elif_stmt_type 1030
+#define else_block_type 1031
+#define while_stmt_type 1032
+#define for_stmt_type 1033
+#define with_stmt_type 1034
+#define with_item_type 1035
+#define try_stmt_type 1036
+#define except_block_type 1037
+#define finally_block_type 1038
+#define match_stmt_type 1039
+#define subject_expr_type 1040
+#define case_block_type 1041
+#define guard_type 1042
+#define patterns_type 1043
+#define pattern_type 1044
+#define as_pattern_type 1045
+#define or_pattern_type 1046
+#define closed_pattern_type 1047
+#define literal_pattern_type 1048
+#define literal_expr_type 1049
+#define complex_number_type 1050
+#define signed_number_type 1051
+#define signed_real_number_type 1052
+#define real_number_type 1053
+#define imaginary_number_type 1054
+#define capture_pattern_type 1055
+#define pattern_capture_target_type 1056
+#define wildcard_pattern_type 1057
+#define value_pattern_type 1058
+#define attr_type 1059 // Left-recursive
+#define name_or_attr_type 1060 // Left-recursive
+#define group_pattern_type 1061
+#define sequence_pattern_type 1062
+#define open_sequence_pattern_type 1063
+#define maybe_sequence_pattern_type 1064
+#define maybe_star_pattern_type 1065
+#define star_pattern_type 1066
+#define mapping_pattern_type 1067
+#define items_pattern_type 1068
+#define key_value_pattern_type 1069
+#define double_star_pattern_type 1070
+#define class_pattern_type 1071
+#define positional_patterns_type 1072
+#define keyword_patterns_type 1073
+#define keyword_pattern_type 1074
+#define return_stmt_type 1075
+#define raise_stmt_type 1076
+#define function_def_type 1077
+#define function_def_raw_type 1078
+#define func_type_comment_type 1079
+#define params_type 1080
+#define parameters_type 1081
+#define slash_no_default_type 1082
+#define slash_with_default_type 1083
+#define star_etc_type 1084
+#define kwds_type 1085
+#define param_no_default_type 1086
+#define param_with_default_type 1087
+#define param_maybe_default_type 1088
+#define param_type 1089
+#define annotation_type 1090
+#define default_type 1091
+#define decorators_type 1092
+#define class_def_type 1093
+#define class_def_raw_type 1094
+#define block_type 1095
+#define star_expressions_type 1096
+#define star_expression_type 1097
+#define star_named_expressions_type 1098
+#define star_named_expression_type 1099
+#define assignment_expression_type 1100
+#define named_expression_type 1101
+#define annotated_rhs_type 1102
+#define expressions_type 1103
+#define expression_type 1104
+#define lambdef_type 1105
+#define lambda_params_type 1106
+#define lambda_parameters_type 1107
+#define lambda_slash_no_default_type 1108
+#define lambda_slash_with_default_type 1109
+#define lambda_star_etc_type 1110
+#define lambda_kwds_type 1111
+#define lambda_param_no_default_type 1112
+#define lambda_param_with_default_type 1113
+#define lambda_param_maybe_default_type 1114
+#define lambda_param_type 1115
+#define disjunction_type 1116
+#define conjunction_type 1117
+#define inversion_type 1118
+#define comparison_type 1119
+#define compare_op_bitwise_or_pair_type 1120
+#define eq_bitwise_or_type 1121
+#define noteq_bitwise_or_type 1122
+#define lte_bitwise_or_type 1123
+#define lt_bitwise_or_type 1124
+#define gte_bitwise_or_type 1125
+#define gt_bitwise_or_type 1126
+#define notin_bitwise_or_type 1127
+#define in_bitwise_or_type 1128
+#define isnot_bitwise_or_type 1129
+#define is_bitwise_or_type 1130
+#define bitwise_or_type 1131 // Left-recursive
+#define bitwise_xor_type 1132 // Left-recursive
+#define bitwise_and_type 1133 // Left-recursive
+#define shift_expr_type 1134 // Left-recursive
+#define sum_type 1135 // Left-recursive
+#define term_type 1136 // Left-recursive
+#define factor_type 1137
+#define power_type 1138
+#define await_primary_type 1139
+#define primary_type 1140 // Left-recursive
+#define slices_type 1141
+#define slice_type 1142
+#define atom_type 1143
+#define strings_type 1144
+#define list_type 1145
+#define listcomp_type 1146
+#define tuple_type 1147
+#define group_type 1148
+#define genexp_type 1149
+#define set_type 1150
+#define setcomp_type 1151
+#define dict_type 1152
+#define dictcomp_type 1153
+#define double_starred_kvpairs_type 1154
+#define double_starred_kvpair_type 1155
+#define kvpair_type 1156
+#define for_if_clauses_type 1157
+#define for_if_clause_type 1158
+#define yield_expr_type 1159
+#define arguments_type 1160
+#define args_type 1161
+#define kwargs_type 1162
+#define starred_expression_type 1163
+#define kwarg_or_starred_type 1164
+#define kwarg_or_double_starred_type 1165
+#define star_targets_type 1166
+#define star_targets_list_seq_type 1167
+#define star_targets_tuple_seq_type 1168
+#define star_target_type 1169
+#define target_with_star_atom_type 1170
+#define star_atom_type 1171
+#define single_target_type 1172
+#define single_subscript_attribute_target_type 1173
+#define del_targets_type 1174
+#define del_target_type 1175
+#define del_t_atom_type 1176
+#define t_primary_type 1177 // Left-recursive
+#define t_lookahead_type 1178
+#define invalid_arguments_type 1179
+#define invalid_kwarg_type 1180
+#define expression_without_invalid_type 1181
+#define invalid_legacy_expression_type 1182
+#define invalid_expression_type 1183
+#define invalid_named_expression_type 1184
+#define invalid_assignment_type 1185
+#define invalid_ann_assign_target_type 1186
+#define invalid_del_stmt_type 1187
+#define invalid_block_type 1188
+#define invalid_comprehension_type 1189
+#define invalid_dict_comprehension_type 1190
+#define invalid_parameters_type 1191
+#define invalid_parameters_helper_type 1192
+#define invalid_lambda_parameters_type 1193
+#define invalid_lambda_parameters_helper_type 1194
+#define invalid_star_etc_type 1195
+#define invalid_lambda_star_etc_type 1196
+#define invalid_double_type_comments_type 1197
+#define invalid_with_item_type 1198
+#define invalid_for_target_type 1199
+#define invalid_group_type 1200
+#define invalid_import_from_targets_type 1201
+#define invalid_with_stmt_type 1202
+#define invalid_with_stmt_indent_type 1203
+#define invalid_try_stmt_type 1204
+#define invalid_except_stmt_type 1205
+#define invalid_finally_stmt_type 1206
+#define invalid_except_stmt_indent_type 1207
+#define invalid_match_stmt_type 1208
+#define invalid_case_block_type 1209
+#define invalid_as_pattern_type 1210
+#define invalid_class_pattern_type 1211
+#define invalid_class_argument_pattern_type 1212
+#define invalid_if_stmt_type 1213
+#define invalid_elif_stmt_type 1214
+#define invalid_else_stmt_type 1215
+#define invalid_while_stmt_type 1216
+#define invalid_for_stmt_type 1217
+#define invalid_def_raw_type 1218
+#define invalid_class_def_raw_type 1219
+#define invalid_double_starred_kvpairs_type 1220
+#define invalid_kvpair_type 1221
+#define _loop0_1_type 1222
+#define _loop0_2_type 1223
+#define _loop0_4_type 1224
+#define _gather_3_type 1225
+#define _loop0_6_type 1226
+#define _gather_5_type 1227
+#define _loop0_8_type 1228
+#define _gather_7_type 1229
+#define _loop0_10_type 1230
+#define _gather_9_type 1231
+#define _loop1_11_type 1232
+#define _loop0_13_type 1233
+#define _gather_12_type 1234
+#define _tmp_14_type 1235
+#define _tmp_15_type 1236
+#define _tmp_16_type 1237
+#define _tmp_17_type 1238
+#define _tmp_18_type 1239
+#define _tmp_19_type 1240
+#define _tmp_20_type 1241
+#define _tmp_21_type 1242
+#define _loop1_22_type 1243
+#define _tmp_23_type 1244
+#define _tmp_24_type 1245
+#define _loop0_26_type 1246
+#define _gather_25_type 1247
+#define _loop0_28_type 1248
+#define _gather_27_type 1249
+#define _tmp_29_type 1250
+#define _tmp_30_type 1251
+#define _loop0_31_type 1252
+#define _loop1_32_type 1253
+#define _loop0_34_type 1254
+#define _gather_33_type 1255
+#define _tmp_35_type 1256
+#define _loop0_37_type 1257
+#define _gather_36_type 1258
+#define _tmp_38_type 1259
+#define _loop0_40_type 1260
+#define _gather_39_type 1261
+#define _loop0_42_type 1262
+#define _gather_41_type 1263
+#define _loop0_44_type 1264
+#define _gather_43_type 1265
+#define _loop0_46_type 1266
+#define _gather_45_type 1267
+#define _tmp_47_type 1268
+#define _loop1_48_type 1269
+#define _tmp_49_type 1270
+#define _loop1_50_type 1271
+#define _loop0_52_type 1272
+#define _gather_51_type 1273
+#define _tmp_53_type 1274
+#define _tmp_54_type 1275
+#define _tmp_55_type 1276
+#define _tmp_56_type 1277
+#define _loop0_58_type 1278
+#define _gather_57_type 1279
+#define _loop0_60_type 1280
+#define _gather_59_type 1281
+#define _tmp_61_type 1282
+#define _loop0_63_type 1283
+#define _gather_62_type 1284
+#define _loop0_65_type 1285
+#define _gather_64_type 1286
+#define _tmp_66_type 1287
+#define _tmp_67_type 1288
+#define _tmp_68_type 1289
+#define _tmp_69_type 1290
+#define _loop0_70_type 1291
+#define _loop0_71_type 1292
+#define _loop0_72_type 1293
+#define _loop1_73_type 1294
+#define _loop0_74_type 1295
+#define _loop1_75_type 1296
+#define _loop1_76_type 1297
+#define _loop1_77_type 1298
+#define _loop0_78_type 1299
+#define _loop1_79_type 1300
+#define _loop0_80_type 1301
+#define _loop1_81_type 1302
+#define _loop0_82_type 1303
+#define _loop1_83_type 1304
+#define _loop1_84_type 1305
+#define _tmp_85_type 1306
+#define _loop1_86_type 1307
+#define _loop0_88_type 1308
+#define _gather_87_type 1309
+#define _loop1_89_type 1310
+#define _loop0_90_type 1311
+#define _loop0_91_type 1312
+#define _loop0_92_type 1313
+#define _loop1_93_type 1314
+#define _loop0_94_type 1315
+#define _loop1_95_type 1316
+#define _loop1_96_type 1317
+#define _loop1_97_type 1318
+#define _loop0_98_type 1319
+#define _loop1_99_type 1320
+#define _loop0_100_type 1321
+#define _loop1_101_type 1322
+#define _loop0_102_type 1323
+#define _loop1_103_type 1324
+#define _loop1_104_type 1325
+#define _loop1_105_type 1326
+#define _loop1_106_type 1327
+#define _tmp_107_type 1328
+#define _loop0_109_type 1329
+#define _gather_108_type 1330
+#define _tmp_110_type 1331
+#define _tmp_111_type 1332
+#define _tmp_112_type 1333
+#define _tmp_113_type 1334
+#define _loop1_114_type 1335
+#define _tmp_115_type 1336
+#define _tmp_116_type 1337
+#define _tmp_117_type 1338
+#define _loop0_119_type 1339
+#define _gather_118_type 1340
+#define _loop1_120_type 1341
+#define _loop0_121_type 1342
+#define _loop0_122_type 1343
+#define _loop0_124_type 1344
+#define _gather_123_type 1345
+#define _tmp_125_type 1346
+#define _loop0_127_type 1347
+#define _gather_126_type 1348
+#define _loop0_129_type 1349
+#define _gather_128_type 1350
+#define _loop0_131_type 1351
+#define _gather_130_type 1352
+#define _loop0_133_type 1353
+#define _gather_132_type 1354
+#define _loop0_134_type 1355
+#define _loop0_136_type 1356
+#define _gather_135_type 1357
+#define _loop1_137_type 1358
+#define _tmp_138_type 1359
+#define _loop0_140_type 1360
+#define _gather_139_type 1361
+#define _tmp_141_type 1362
+#define _tmp_142_type 1363
+#define _tmp_143_type 1364
+#define _tmp_144_type 1365
+#define _tmp_145_type 1366
+#define _tmp_146_type 1367
+#define _tmp_147_type 1368
+#define _tmp_148_type 1369
+#define _loop0_149_type 1370
+#define _loop0_150_type 1371
+#define _loop0_151_type 1372
+#define _tmp_152_type 1373
+#define _tmp_153_type 1374
+#define _tmp_154_type 1375
+#define _tmp_155_type 1376
+#define _loop0_156_type 1377
+#define _loop1_157_type 1378
+#define _loop0_158_type 1379
+#define _loop1_159_type 1380
+#define _tmp_160_type 1381
+#define _tmp_161_type 1382
+#define _tmp_162_type 1383
+#define _loop0_164_type 1384
+#define _gather_163_type 1385
+#define _loop0_166_type 1386
+#define _gather_165_type 1387
+#define _loop0_168_type 1388
+#define _gather_167_type 1389
+#define _loop0_170_type 1390
+#define _gather_169_type 1391
+#define _tmp_171_type 1392
+#define _tmp_172_type 1393
+#define _tmp_173_type 1394
+#define _tmp_174_type 1395
+#define _tmp_175_type 1396
+#define _tmp_176_type 1397
+#define _tmp_177_type 1398
+#define _tmp_178_type 1399
+#define _loop0_180_type 1400
+#define _gather_179_type 1401
+#define _tmp_181_type 1402
+#define _tmp_182_type 1403
+#define _tmp_183_type 1404
+#define _tmp_184_type 1405
+#define _tmp_185_type 1406
+#define _tmp_186_type 1407
+#define _tmp_187_type 1408
+#define _tmp_188_type 1409
+#define _tmp_189_type 1410
+#define _tmp_190_type 1411
+#define _tmp_191_type 1412
+#define _tmp_192_type 1413
+#define _tmp_193_type 1414
+#define _tmp_194_type 1415
+#define _tmp_195_type 1416
+#define _tmp_196_type 1417
+#define _tmp_197_type 1418
+#define _tmp_198_type 1419
+#define _tmp_199_type 1420
+#define _tmp_200_type 1421
+#define _tmp_201_type 1422
+#define _tmp_202_type 1423
+#define _tmp_203_type 1424
+#define _tmp_204_type 1425
+#define _tmp_205_type 1426
+#define _tmp_206_type 1427
+#define _tmp_207_type 1428
+#define _tmp_208_type 1429
static mod_ty file_rule(Parser *p);
static mod_ty interactive_rule(Parser *p);
@@ -516,6 +517,7 @@ static asdl_stmt_seq* simple_stmts_rule(Parser *p);
static stmt_ty simple_stmt_rule(Parser *p);
static stmt_ty compound_stmt_rule(Parser *p);
static stmt_ty assignment_rule(Parser *p);
+static AugOperator* unaryassign_rule(Parser *p);
static AugOperator* augassign_rule(Parser *p);
static stmt_ty global_stmt_rule(Parser *p);
static stmt_ty nonlocal_stmt_rule(Parser *p);
@@ -1109,7 +1111,7 @@ func_type_rule(Parser *p)
&&
(_literal_1 = _PyPegen_expect_token(p, 8)) // token=')'
&&
- (_literal_2 = _PyPegen_expect_token(p, 51)) // token='->'
+ (_literal_2 = _PyPegen_expect_token(p, 52)) // token='->'
&&
(b = expression_rule(p)) // expression
&&
@@ -2313,6 +2315,7 @@ compound_stmt_rule(Parser *p)
// | NAME ':' expression ['=' annotated_rhs]
// | ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]
// | ((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?
+// | single_target unaryassign
// | single_target augassign ~ (yield_expr | star_expressions)
// | invalid_assignment
static stmt_ty
@@ -2462,6 +2465,42 @@ assignment_rule(Parser *p)
D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?"));
}
+ { // single_target unaryassign
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_target unaryassign"));
+ expr_ty a;
+ AugOperator* b;
+ if (
+ (a = single_target_rule(p)) // single_target
+ &&
+ (b = unaryassign_rule(p)) // unaryassign
+ )
+ {
+ D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target unaryassign"));
+ Token *_token = _PyPegen_get_last_nonnwhitespace_token(p);
+ if (_token == NULL) {
+ 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_AugAssign ( a , b -> kind , 0 , EXTRA );
+ if (_res == NULL && PyErr_Occurred()) {
+ p->error_indicator = 1;
+ p->level--;
+ return NULL;
+ }
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_target unaryassign"));
+ }
{ // single_target augassign ~ (yield_expr | star_expressions)
if (p->error_indicator) {
p->level--;
@@ -2533,6 +2572,50 @@ assignment_rule(Parser *p)
return _res;
}
+// unaryassign: '++'
+static AugOperator*
+unaryassign_rule(Parser *p)
+{
+ if (p->level++ == MAXSTACK) {
+ p->error_indicator = 1;
+ PyErr_NoMemory();
+ }
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ AugOperator* _res = NULL;
+ int _mark = p->mark;
+ { // '++'
+ if (p->error_indicator) {
+ p->level--;
+ return NULL;
+ }
+ D(fprintf(stderr, "%*c> unaryassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'++'"));
+ Token * _literal;
+ if (
+ (_literal = _PyPegen_expect_token(p, 36)) // token='++'
+ )
+ {
+ D(fprintf(stderr, "%*c+ unaryassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'++'"));
+ _res = _PyPegen_augoperator ( p , PlusPlus );
+ if (_res == NULL && PyErr_Occurred()) {
+ p->error_indicator = 1;
+ p->level--;
+ return NULL;
+ }
+ goto done;
+ }
+ p->mark = _mark;
+ D(fprintf(stderr, "%*c%s unaryassign[%d-%d]: %s failed!\n", p->level, ' ',
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'++'"));
+ }
+ _res = NULL;
+ done:
+ p->level--;
+ return _res;
+}
+
// augassign:
// | '+='
// | '-='
@@ -2568,7 +2651,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 36)) // token='+='
+ (_literal = _PyPegen_expect_token(p, 37)) // token='+='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+='"));
@@ -2592,7 +2675,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 37)) // token='-='
+ (_literal = _PyPegen_expect_token(p, 38)) // token='-='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-='"));
@@ -2616,7 +2699,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 38)) // token='*='
+ (_literal = _PyPegen_expect_token(p, 39)) // token='*='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*='"));
@@ -2640,7 +2723,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 50)) // token='@='
+ (_literal = _PyPegen_expect_token(p, 51)) // token='@='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@='"));
@@ -2664,7 +2747,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 39)) // token='/='
+ (_literal = _PyPegen_expect_token(p, 40)) // token='/='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/='"));
@@ -2688,7 +2771,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 40)) // token='%='
+ (_literal = _PyPegen_expect_token(p, 41)) // token='%='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%='"));
@@ -2712,7 +2795,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'&='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 41)) // token='&='
+ (_literal = _PyPegen_expect_token(p, 42)) // token='&='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'&='"));
@@ -2736,7 +2819,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 42)) // token='|='
+ (_literal = _PyPegen_expect_token(p, 43)) // token='|='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|='"));
@@ -2760,7 +2843,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'^='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 43)) // token='^='
+ (_literal = _PyPegen_expect_token(p, 44)) // token='^='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'^='"));
@@ -2784,7 +2867,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<<='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 44)) // token='<<='
+ (_literal = _PyPegen_expect_token(p, 45)) // token='<<='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<<='"));
@@ -2808,7 +2891,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>>='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 45)) // token='>>='
+ (_literal = _PyPegen_expect_token(p, 46)) // token='>>='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>>='"));
@@ -2832,7 +2915,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 46)) // token='**='
+ (_literal = _PyPegen_expect_token(p, 47)) // token='**='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**='"));
@@ -2856,7 +2939,7 @@ augassign_rule(Parser *p)
D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 48)) // token='//='
+ (_literal = _PyPegen_expect_token(p, 49)) // token='//='
)
{
D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//='"));
@@ -10565,7 +10648,7 @@ assignment_expression_rule(Parser *p)
if (
(a = _PyPegen_name_token(p)) // NAME
&&
- (_literal = _PyPegen_expect_token(p, 53)) // token=':='
+ (_literal = _PyPegen_expect_token(p, 54)) // token=':='
&&
(_cut_var = 1)
&&
@@ -10666,7 +10749,7 @@ named_expression_rule(Parser *p)
if (
(expression_var = expression_rule(p)) // expression
&&
- _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':='
+ _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 54) // token=':='
)
{
D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='"));
@@ -13865,7 +13948,7 @@ term_raw(Parser *p)
if (
(a = term_rule(p)) // term
&&
- (_literal = _PyPegen_expect_token(p, 47)) // token='//'
+ (_literal = _PyPegen_expect_token(p, 48)) // token='//'
&&
(b = factor_rule(p)) // factor
)
@@ -13943,7 +14026,7 @@ term_raw(Parser *p)
if (
(a = term_rule(p)) // term
&&
- (_literal = _PyPegen_expect_token(p, 49)) // token='@'
+ (_literal = _PyPegen_expect_token(p, 50)) // token='@'
&&
(b = factor_rule(p)) // factor
)
@@ -15030,7 +15113,7 @@ atom_rule(Parser *p)
D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 52)) // token='...'
+ (_literal = _PyPegen_expect_token(p, 53)) // token='...'
)
{
D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'"));
@@ -18976,7 +19059,7 @@ invalid_named_expression_rule(Parser *p)
if (
(a = expression_rule(p)) // expression
&&
- (_literal = _PyPegen_expect_token(p, 53)) // token=':='
+ (_literal = _PyPegen_expect_token(p, 54)) // token=':='
&&
(expression_var = expression_rule(p)) // expression
)
@@ -22928,7 +23011,7 @@ _tmp_15_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 49)) // token='@'
+ (_literal = _PyPegen_expect_token(p, 50)) // token='@'
)
{
D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'"));
@@ -23005,7 +23088,7 @@ _tmp_16_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 49)) // token='@'
+ (_literal = _PyPegen_expect_token(p, 50)) // token='@'
)
{
D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'"));
@@ -26045,7 +26128,7 @@ _tmp_67_rule(Parser *p)
Token * _literal;
expr_ty z;
if (
- (_literal = _PyPegen_expect_token(p, 51)) // token='->'
+ (_literal = _PyPegen_expect_token(p, 52)) // token='->'
&&
(z = expression_rule(p)) // expression
)
@@ -26092,7 +26175,7 @@ _tmp_68_rule(Parser *p)
Token * _literal;
expr_ty z;
if (
- (_literal = _PyPegen_expect_token(p, 51)) // token='->'
+ (_literal = _PyPegen_expect_token(p, 52)) // token='->'
&&
(z = expression_rule(p)) // expression
)
@@ -29404,7 +29487,7 @@ _tmp_117_rule(Parser *p)
if (
(expression_var = expression_rule(p)) // expression
&&
- _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':='
+ _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 54) // token=':='
)
{
D(fprintf(stderr, "%*c+ _tmp_117[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='"));
@@ -31152,7 +31235,7 @@ _tmp_146_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 53)) // token=':='
+ (_literal = _PyPegen_expect_token(p, 54)) // token=':='
)
{
D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='"));
@@ -31344,7 +31427,7 @@ _tmp_148_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':='"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 53)) // token=':='
+ (_literal = _PyPegen_expect_token(p, 54)) // token=':='
)
{
D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':='"));
@@ -33022,7 +33105,7 @@ _tmp_176_rule(Parser *p)
Token * _literal;
expr_ty expression_var;
if (
- (_literal = _PyPegen_expect_token(p, 51)) // token='->'
+ (_literal = _PyPegen_expect_token(p, 52)) // token='->'
&&
(expression_var = expression_rule(p)) // expression
)
@@ -33456,7 +33539,7 @@ _tmp_184_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_184[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 52)) // token='...'
+ (_literal = _PyPegen_expect_token(p, 53)) // token='...'
)
{
D(fprintf(stderr, "%*c+ _tmp_184[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'"));
@@ -33514,7 +33597,7 @@ _tmp_185_rule(Parser *p)
D(fprintf(stderr, "%*c> _tmp_185[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'"));
Token * _literal;
if (
- (_literal = _PyPegen_expect_token(p, 52)) // token='...'
+ (_literal = _PyPegen_expect_token(p, 53)) // token='...'
)
{
D(fprintf(stderr, "%*c+ _tmp_185[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'"));
@@ -33555,7 +33638,7 @@ _tmp_186_rule(Parser *p)
expr_ty f;
Token * newline_var;
if (
- (_literal = _PyPegen_expect_token(p, 49)) // token='@'
+ (_literal = _PyPegen_expect_token(p, 50)) // token='@'
&&
(f = named_expression_rule(p)) // named_expression
&&
@@ -34432,7 +34515,7 @@ _tmp_204_rule(Parser *p)
if (
(expression_var = expression_rule(p)) // expression
&&
- _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':='
+ _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 54) // token=':='
)
{
D(fprintf(stderr, "%*c+ _tmp_204[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='"));
diff --git a/Parser/token.c b/Parser/token.c
index 74bca0e..f3dbc42 100644
--- a/Parser/token.c
+++ b/Parser/token.c
@@ -42,6 +42,7 @@ const char * const _PyParser_TokenNames[] = {
"LEFTSHIFT",
"RIGHTSHIFT",
"DOUBLESTAR",
+ "PLUSPLUS",
"PLUSEQUAL",
"MINEQUAL",
"STAREQUAL",
@@ -133,6 +134,7 @@ PyToken_TwoChars(int c1, int c2)
break;
case '+':
switch (c2) {
+ case '+': return PLUSPLUS;
case '=': return PLUSEQUAL;
}
break;
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 2f84cad..fa2fc6a 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -2110,7 +2110,7 @@ _PyAST_AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
"field 'op' is required for AugAssign");
return NULL;
}
- if (!value) {
+ if (!value && op != PlusPlus) {
PyErr_SetString(PyExc_ValueError,
"field 'value' is required for AugAssign");
return NULL;
@@ -2118,6 +2118,23 @@ _PyAST_AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
+
+
+ if (op == PlusPlus) {
+ value = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
+ if (!value)
+ return NULL;
+ value->kind = Constant_kind;
+ value->v.Constant.value = PyLong_FromLong(1);
+ value->v.Constant.kind = 0;
+ value->lineno = lineno;
+ value->col_offset = col_offset;
+ value->end_lineno = end_lineno;
+ value->end_col_offset = end_col_offset;
+
+ op = Add;
+ }
+
p->kind = AugAssign_kind;
p->v.AugAssign.target = target;
p->v.AugAssign.op = op;
diff --git a/Python/ceval.c b/Python/ceval.c
index 9f4ef6b..0ce153d 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1947,6 +1947,16 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
DISPATCH();
}
+ case TARGET(UNARY_PLUS_PLUS): {
+ PyObject *value = TOP();
+ PyObject *res = PyNumber_Negative(value);
+ Py_DECREF(value);
+ SET_TOP(res);
+ if (res == NULL)
+ goto error;
+ DISPATCH();
+ }
+
case TARGET(UNARY_NEGATIVE): {
PyObject *value = TOP();
PyObject *res = PyNumber_Negative(value);
diff --git a/Python/compile.c b/Python/compile.c
index 80caa8f..5f729e0 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -973,6 +973,7 @@ stack_effect(int opcode, int oparg, int jump)
return 2;
/* Unary operators */
+ case UNARY_PLUS_PLUS:
case UNARY_POSITIVE:
case UNARY_NEGATIVE:
case UNARY_NOT:
@@ -3639,6 +3640,8 @@ binop(operator_ty op)
return BINARY_AND;
case FloorDiv:
return BINARY_FLOOR_DIVIDE;
+ case PlusPlus:
+ return UNARY_PLUS_PLUS;
default:
PyErr_Format(PyExc_SystemError,
"binary op %d should not be possible", op);
@@ -3676,6 +3679,8 @@ inplace_binop(operator_ty op)
return INPLACE_AND;
case FloorDiv:
return INPLACE_FLOOR_DIVIDE;
+ case PlusPlus:
+ return INPLACE_PLUS_PLUS;
default:
PyErr_Format(PyExc_SystemError,
"inplace binary op %d should not be possible", op);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment