@@ -234,20 +234,20 @@ case_block[match_case_ty]:
234
234
_PyAST_match_case(pattern, guard, body, p->arena) }
235
235
guard[expr_ty]: 'if' guard=named_expression { guard }
236
236
237
- patterns[expr_ty ]:
238
- | values[asdl_expr_seq *]=open_sequence_pattern {
239
- _PyAST_Tuple(values, Load , EXTRA) }
237
+ patterns[pattern_ty ]:
238
+ | patterns[asdl_pattern_seq *]=open_sequence_pattern {
239
+ _PyAST_MatchSequence(patterns , EXTRA) }
240
240
| pattern
241
- pattern[expr_ty ]:
241
+ pattern[pattern_ty ]:
242
242
| as_pattern
243
243
| or_pattern
244
- as_pattern[expr_ty ]:
245
- | pattern=or_pattern 'as' target=capture_pattern {
244
+ as_pattern[pattern_ty ]:
245
+ | pattern=or_pattern 'as' target=pattern_capture_target {
246
246
_PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) }
247
- or_pattern[expr_ty ]:
248
- | patterns[asdl_expr_seq *]='|'.closed_pattern+ {
247
+ or_pattern[pattern_ty ]:
248
+ | patterns[asdl_pattern_seq *]='|'.closed_pattern+ {
249
249
asdl_seq_LEN(patterns) == 1 ? asdl_seq_GET(patterns, 0) : _PyAST_MatchOr(patterns, EXTRA) }
250
- closed_pattern[expr_ty ]:
250
+ closed_pattern[pattern_ty ]:
251
251
| literal_pattern
252
252
| capture_pattern
253
253
| wildcard_pattern
@@ -257,78 +257,125 @@ closed_pattern[expr_ty]:
257
257
| mapping_pattern
258
258
| class_pattern
259
259
260
- literal_pattern[expr_ty]:
260
+ # Literal patterns are used for equality and identity constraints
261
+ literal_pattern[pattern_ty]:
262
+ | value=signed_number !('+' | '-') { _PyAST_MatchValue(value, EXTRA) }
263
+ | value=complex_number { _PyAST_MatchValue(value, EXTRA) }
264
+ | value=strings { _PyAST_MatchValue(value, EXTRA) }
265
+ | 'None' { _PyAST_MatchSingleton(Py_None, EXTRA) }
266
+ | 'True' { _PyAST_MatchSingleton(Py_True, EXTRA) }
267
+ | 'False' { _PyAST_MatchSingleton(Py_False, EXTRA) }
268
+
269
+ # Literal expressions are used to restrict permitted mapping pattern keys
270
+ literal_expr[expr_ty]:
261
271
| signed_number !('+' | '-')
262
- | real=signed_number '+' imag=NUMBER { _PyAST_BinOp(real, Add, imag, EXTRA) }
263
- | real=signed_number '-' imag=NUMBER { _PyAST_BinOp(real, Sub, imag, EXTRA) }
272
+ | complex_number
264
273
| strings
265
274
| 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) }
266
275
| 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) }
267
276
| 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) }
277
+
278
+ complex_number[expr_ty]:
279
+ | real=signed_number '+' imag=imaginary_number { _PyAST_BinOp(real, Add, imag, EXTRA) }
280
+ | real=signed_number '-' imag=imaginary_number { _PyAST_BinOp(real, Sub, imag, EXTRA) }
281
+
268
282
signed_number[expr_ty]:
269
283
| NUMBER
270
284
| '-' number=NUMBER { _PyAST_UnaryOp(USub, number, EXTRA) }
271
285
272
- capture_pattern[expr_ty]:
286
+ imaginary_number[expr_ty]:
287
+ | imag=NUMBER { _PyPegen_ensure_imaginary(p, imag) }
288
+
289
+ capture_pattern[pattern_ty]:
290
+ | target=pattern_capture_target { _PyAST_MatchAs(NULL, target->v.Name.id, EXTRA) }
291
+
292
+ pattern_capture_target[expr_ty]:
273
293
| !"_" name=NAME !('.' | '(' | '=') {
274
294
_PyPegen_set_expr_context(p, name, Store) }
275
295
276
- wildcard_pattern[expr_ty ]:
277
- | "_" { _PyAST_Name(CHECK(PyObject*, _PyPegen_new_identifier(p, "_")), Store , EXTRA) }
296
+ wildcard_pattern[pattern_ty ]:
297
+ | "_" { _PyAST_MatchAs(NULL, NULL , EXTRA) }
278
298
279
- value_pattern[expr_ty ]:
280
- | attr=attr !('.' | '(' | '=') { attr }
299
+ value_pattern[pattern_ty ]:
300
+ | attr=attr !('.' | '(' | '=') { _PyAST_MatchValue( attr, EXTRA) }
281
301
attr[expr_ty]:
282
302
| value=name_or_attr '.' attr=NAME {
283
303
_PyAST_Attribute(value, attr->v.Name.id, Load, EXTRA) }
284
304
name_or_attr[expr_ty]:
285
305
| attr
286
306
| NAME
287
307
288
- group_pattern[expr_ty ]:
308
+ group_pattern[pattern_ty ]:
289
309
| '(' pattern=pattern ')' { pattern }
290
310
291
- sequence_pattern[expr_ty ]:
292
- | '[' values =maybe_sequence_pattern? ']' { _PyAST_List(values, Load , EXTRA) }
293
- | '(' values =open_sequence_pattern? ')' { _PyAST_Tuple(values, Load , EXTRA) }
311
+ sequence_pattern[pattern_ty ]:
312
+ | '[' patterns =maybe_sequence_pattern? ']' { _PyAST_MatchSequence(patterns , EXTRA) }
313
+ | '(' patterns =open_sequence_pattern? ')' { _PyAST_MatchSequence(patterns , EXTRA) }
294
314
open_sequence_pattern[asdl_seq*]:
295
- | value =maybe_star_pattern ',' values =maybe_sequence_pattern? {
296
- _PyPegen_seq_insert_in_front(p, value, values ) }
315
+ | pattern =maybe_star_pattern ',' patterns =maybe_sequence_pattern? {
316
+ _PyPegen_seq_insert_in_front(p, pattern, patterns ) }
297
317
maybe_sequence_pattern[asdl_seq*]:
298
- | values =','.maybe_star_pattern+ ','? { values }
299
- maybe_star_pattern[expr_ty ]:
318
+ | patterns =','.maybe_star_pattern+ ','? { patterns }
319
+ maybe_star_pattern[pattern_ty ]:
300
320
| star_pattern
301
321
| pattern
302
- star_pattern[expr_ty]:
303
- | '*' value=(capture_pattern | wildcard_pattern) {
304
- _PyAST_Starred(value, Store, EXTRA) }
305
-
306
- mapping_pattern[expr_ty]:
307
- | '{' items=items_pattern? '}' {
308
- _PyAST_Dict(CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, items)), CHECK(asdl_expr_seq*, _PyPegen_get_values(p, items)), EXTRA) }
322
+ star_pattern[pattern_ty]:
323
+ | '*' target=pattern_capture_target {
324
+ _PyAST_MatchStar(target->v.Name.id, EXTRA) }
325
+ | '*' wildcard_pattern {
326
+ _PyAST_MatchStar(NULL, EXTRA) }
327
+
328
+ mapping_pattern[pattern_ty]:
329
+ | '{' '}' {
330
+ _PyAST_MatchMapping(NULL, NULL, NULL, EXTRA) }
331
+ | '{' rest=double_star_pattern ','? '}' {
332
+ _PyAST_MatchMapping(NULL, NULL, rest->v.Name.id, EXTRA) }
333
+ | '{' items=items_pattern ',' rest=double_star_pattern ','? '}' {
334
+ _PyAST_MatchMapping(
335
+ CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
336
+ CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
337
+ rest->v.Name.id,
338
+ EXTRA) }
339
+ | '{' items=items_pattern ','? '}' {
340
+ _PyAST_MatchMapping(
341
+ CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)),
342
+ CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)),
343
+ NULL,
344
+ EXTRA) }
309
345
items_pattern[asdl_seq*]:
310
- | items=','.key_value_pattern+ ','? { items }
311
- key_value_pattern[KeyValuePair*]:
312
- | key=(literal_pattern | value_pattern) ':' value=pattern {
313
- _PyPegen_key_value_pair(p, key, value) }
314
- | double_star_pattern
315
- double_star_pattern[KeyValuePair*]:
316
- | '**' value=capture_pattern { _PyPegen_key_value_pair(p, NULL, value) }
317
-
318
- class_pattern[expr_ty]:
319
- | func=name_or_attr '(' ')' { _PyAST_Call(func, NULL, NULL, EXTRA) }
320
- | func=name_or_attr '(' args=positional_patterns ','? ')' {
321
- _PyAST_Call(func, args, NULL, EXTRA) }
322
- | func=name_or_attr '(' keywords=keyword_patterns ','? ')' {
323
- _PyAST_Call(func, NULL, keywords, EXTRA) }
324
- | func=name_or_attr '(' args=positional_patterns ',' keywords=keyword_patterns ','? ')' {
325
- _PyAST_Call(func, args, keywords, EXTRA) }
326
- positional_patterns[asdl_expr_seq*]:
327
- | args[asdl_expr_seq*]=','.pattern+ { args }
328
- keyword_patterns[asdl_keyword_seq*]:
329
- | keywords[asdl_keyword_seq*]=','.keyword_pattern+ { keywords }
330
- keyword_pattern[keyword_ty]:
331
- | arg=NAME '=' value=pattern { _PyAST_keyword(arg->v.Name.id, value, EXTRA) }
346
+ | items=','.key_value_pattern+ { items }
347
+ key_value_pattern[KeyPatternPair*]:
348
+ | key=(literal_expr | attr) ':' pattern=pattern {
349
+ _PyPegen_key_pattern_pair(p, key, pattern) }
350
+ double_star_pattern[expr_ty]:
351
+ | '**' target=pattern_capture_target { target }
352
+
353
+ class_pattern[pattern_ty]:
354
+ | cls=name_or_attr '(' ')' {
355
+ _PyAST_MatchClass(cls, NULL, NULL, NULL, EXTRA) }
356
+ | cls=name_or_attr '(' patterns=positional_patterns ','? ')' {
357
+ _PyAST_MatchClass(cls, patterns, NULL, NULL, EXTRA) }
358
+ | cls=name_or_attr '(' keywords=keyword_patterns ','? ')' {
359
+ _PyAST_MatchClass(
360
+ cls, NULL,
361
+ CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
362
+ CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
363
+ CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
364
+ EXTRA) }
365
+ | cls=name_or_attr '(' patterns=positional_patterns ',' keywords=keyword_patterns ','? ')' {
366
+ _PyAST_MatchClass(
367
+ cls,
368
+ patterns,
369
+ CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p,
370
+ CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))),
371
+ CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)),
372
+ EXTRA) }
373
+ positional_patterns[asdl_pattern_seq*]:
374
+ | args[asdl_pattern_seq*]=','.pattern+ { args }
375
+ keyword_patterns[asdl_seq*]:
376
+ | keywords[asdl_seq*]=','.keyword_pattern+ { keywords }
377
+ keyword_pattern[KeyPatternPair*]:
378
+ | arg=NAME '=' value=pattern { _PyPegen_key_pattern_pair(p, arg, value) }
332
379
333
380
return_stmt[stmt_ty]:
334
381
| 'return' a=[star_expressions] { _PyAST_Return(a, EXTRA) }
0 commit comments