jaclang 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of jaclang might be problematic. Click here for more details.

Files changed (73) hide show
  1. jaclang/__init__.py +4 -0
  2. jaclang/cli/__init__.py +7 -0
  3. jaclang/cli/cli.jac +46 -0
  4. jaclang/cli/cmds.jac +14 -0
  5. jaclang/cli/impl/__init__.py +1 -0
  6. jaclang/cli/impl/cli_impl.jac +93 -0
  7. jaclang/cli/impl/cmds_impl.jac +26 -0
  8. jaclang/core/__init__.py +12 -0
  9. jaclang/core/impl/__init__.py +1 -0
  10. jaclang/core/impl/arch_impl.jac +112 -0
  11. jaclang/core/impl/element_impl.jac +95 -0
  12. jaclang/core/impl/exec_ctx_impl.jac +17 -0
  13. jaclang/core/impl/memory_impl.jac +57 -0
  14. jaclang/core/primitives.jac +104 -0
  15. jaclang/jac/__init__.py +1 -0
  16. jaclang/jac/absyntree.py +1787 -0
  17. jaclang/jac/constant.py +46 -0
  18. jaclang/jac/importer.py +130 -0
  19. jaclang/jac/lexer.py +538 -0
  20. jaclang/jac/parser.py +1474 -0
  21. jaclang/jac/passes/__init__.py +5 -0
  22. jaclang/jac/passes/blue/__init__.py +25 -0
  23. jaclang/jac/passes/blue/ast_build_pass.py +3190 -0
  24. jaclang/jac/passes/blue/blue_pygen_pass.py +1335 -0
  25. jaclang/jac/passes/blue/decl_def_match_pass.py +278 -0
  26. jaclang/jac/passes/blue/import_pass.py +75 -0
  27. jaclang/jac/passes/blue/sub_node_tab_pass.py +30 -0
  28. jaclang/jac/passes/blue/tests/__init__.py +1 -0
  29. jaclang/jac/passes/blue/tests/test_ast_build_pass.py +61 -0
  30. jaclang/jac/passes/blue/tests/test_blue_pygen_pass.py +117 -0
  31. jaclang/jac/passes/blue/tests/test_decl_def_match_pass.py +43 -0
  32. jaclang/jac/passes/blue/tests/test_import_pass.py +18 -0
  33. jaclang/jac/passes/blue/tests/test_sub_node_pass.py +26 -0
  34. jaclang/jac/passes/blue/tests/test_type_analyze_pass.py +53 -0
  35. jaclang/jac/passes/blue/type_analyze_pass.py +731 -0
  36. jaclang/jac/passes/ir_pass.py +154 -0
  37. jaclang/jac/passes/purple/__init__.py +17 -0
  38. jaclang/jac/passes/purple/impl/__init__.py +1 -0
  39. jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac +289 -0
  40. jaclang/jac/passes/purple/purple_pygen_pass.jac +35 -0
  41. jaclang/jac/sym_table.py +127 -0
  42. jaclang/jac/tests/__init__.py +1 -0
  43. jaclang/jac/tests/fixtures/__init__.py +1 -0
  44. jaclang/jac/tests/fixtures/activity.py +10 -0
  45. jaclang/jac/tests/fixtures/fam.jac +68 -0
  46. jaclang/jac/tests/fixtures/hello_world.jac +5 -0
  47. jaclang/jac/tests/fixtures/lexer_fam.jac +61 -0
  48. jaclang/jac/tests/fixtures/stuff.jac +6 -0
  49. jaclang/jac/tests/test_importer.py +24 -0
  50. jaclang/jac/tests/test_lexer.py +57 -0
  51. jaclang/jac/tests/test_parser.py +50 -0
  52. jaclang/jac/tests/test_utils.py +12 -0
  53. jaclang/jac/transform.py +63 -0
  54. jaclang/jac/transpiler.py +69 -0
  55. jaclang/jac/utils.py +120 -0
  56. jaclang/utils/__init__.py +1 -0
  57. jaclang/utils/fstring_parser.py +73 -0
  58. jaclang/utils/log.py +9 -0
  59. jaclang/utils/sly/__init__.py +6 -0
  60. jaclang/utils/sly/docparse.py +62 -0
  61. jaclang/utils/sly/lex.py +510 -0
  62. jaclang/utils/sly/yacc.py +2398 -0
  63. jaclang/utils/test.py +81 -0
  64. jaclang/utils/tests/__init__.py +1 -0
  65. jaclang/utils/tests/test_fstring_parser.py +55 -0
  66. jaclang-0.0.3.dist-info/METADATA +12 -0
  67. jaclang-0.0.3.dist-info/RECORD +70 -0
  68. {jaclang-0.0.1.dist-info → jaclang-0.0.3.dist-info}/WHEEL +1 -1
  69. jaclang-0.0.3.dist-info/entry_points.txt +3 -0
  70. jaclang-0.0.3.dist-info/top_level.txt +1 -0
  71. jaclang-0.0.1.dist-info/METADATA +0 -7
  72. jaclang-0.0.1.dist-info/RECORD +0 -4
  73. jaclang-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,3190 @@
1
+ """Ast build pass for Jaseci Ast."""
2
+ from os import path
3
+
4
+ import jaclang.jac.absyntree as ast
5
+ from jaclang.jac.absyntree import replace_node
6
+ from jaclang.jac.constant import EdgeDir
7
+ from jaclang.jac.lexer import Tokens as Tok
8
+ from jaclang.jac.passes import Pass
9
+
10
+
11
+ class AstBuildPass(Pass):
12
+ """Jac Ast build pass."""
13
+
14
+ def enter_module(self, node: ast.AstNode) -> None:
15
+ """Grammar rule.
16
+
17
+ module -> DOC_STRING element_list
18
+ module -> DOC_STRING
19
+ """
20
+ mod_name = self.mod_path.split(path.sep)[-1].split(".")[0]
21
+ mod = ast.Module(
22
+ name=mod_name,
23
+ doc=node.kid[0],
24
+ body=node.kid[1] if len(node.kid) == 2 else None,
25
+ mod_path=self.mod_path,
26
+ rel_mod_path=self.rel_mod_path,
27
+ is_imported=False,
28
+ parent=None,
29
+ mod_link=None,
30
+ kid=node.kid,
31
+ line=node.line,
32
+ )
33
+ mod.mod_link = mod
34
+ self.mod_link = mod
35
+ self.ir = replace_node(node, mod)
36
+
37
+ def exit_module(self, node: ast.AstNode) -> None:
38
+ """Grammar rule.
39
+
40
+ module -> DOC_STRING element_list
41
+ module -> DOC_STRING
42
+ """
43
+ if type(self.ir) == ast.Module:
44
+ self.ir.doc = node.kid[0]
45
+ self.ir.body = node.kid[1] if len(node.kid) == 2 else None
46
+ else:
47
+ self.ice("Self IR should be module!")
48
+
49
+ def exit_element_list(self, node: ast.AstNode) -> None:
50
+ """Grammar rule.
51
+
52
+ element_list -> element_list element
53
+ element_list -> element
54
+ """
55
+ if len(node.kid) == 2:
56
+ node.kid = node.kid[0].kid + [node.kid[1]]
57
+ replace_node(
58
+ node,
59
+ ast.Elements(
60
+ elements=node.kid,
61
+ parent=node.parent,
62
+ mod_link=self.mod_link,
63
+ kid=node.kid,
64
+ line=node.line,
65
+ ),
66
+ )
67
+
68
+ def exit_element(self, node: ast.AstNode) -> None:
69
+ """Grammar rule.
70
+
71
+ element -> enum
72
+ element -> ability
73
+ element -> architype
74
+ element -> include_stmt
75
+ element -> import_stmt
76
+ element -> mod_code
77
+ element -> test
78
+ element -> global_var
79
+ """
80
+ replace_node(node, node.kid[0])
81
+
82
+ def exit_global_var(self, node: ast.AstNode) -> None:
83
+ """Grammar rule.
84
+
85
+ global_var -> doc_tag KW_FREEZE access_tag assignment_list SEMI
86
+ global_var -> doc_tag KW_GLOBAL access_tag assignment_list SEMI
87
+ """
88
+ is_frozen = node.kid[1].name == Tok.KW_FREEZE
89
+ node.kid = [node.kid[0], node.kid[2], node.kid[3]]
90
+ replace_node(
91
+ node,
92
+ ast.GlobalVars(
93
+ doc=node.kid[0],
94
+ access=node.kid[1],
95
+ assignments=node.kid[2],
96
+ is_frozen=is_frozen,
97
+ parent=node.parent,
98
+ mod_link=self.mod_link,
99
+ kid=node.kid,
100
+ line=node.line,
101
+ ),
102
+ )
103
+
104
+ def exit_access(self, node: ast.AstNode) -> None:
105
+ """Grammar rule.
106
+
107
+ access -> KW_PROT
108
+ access -> KW_PUB
109
+ access -> KW_PRIV
110
+ """
111
+ replace_node(node, node.kid[0])
112
+
113
+ def exit_access_tag(self, node: ast.AstNode) -> None:
114
+ """Grammar rule.
115
+
116
+ access_tag -> empty
117
+ access_tag -> COLON access
118
+ """
119
+ replace_node(node, node.kid[-1])
120
+
121
+ def exit_test(self, node: ast.AstNode) -> None:
122
+ """Grammar rule.
123
+
124
+ test -> doc_tag KW_TEST NAME multistring code_block
125
+ """
126
+ del node.kid[1]
127
+ replace_node(
128
+ node,
129
+ ast.Test(
130
+ doc=node.kid[0],
131
+ name=node.kid[1],
132
+ description=node.kid[2],
133
+ body=node.kid[3],
134
+ parent=node.parent,
135
+ mod_link=self.mod_link,
136
+ kid=node.kid,
137
+ line=node.line,
138
+ ),
139
+ )
140
+
141
+ def exit_mod_code(self, node: ast.AstNode) -> None:
142
+ """Grammar rule.
143
+
144
+ mod_code -> doc_tag KW_WITH KW_ENTRY code_block
145
+ """
146
+ node.kid = [node.kid[0], node.kid[-1]]
147
+ replace_node(
148
+ node,
149
+ ast.ModuleCode(
150
+ doc=node.kid[0],
151
+ body=node.kid[1],
152
+ parent=node.parent,
153
+ mod_link=self.mod_link,
154
+ kid=node.kid,
155
+ line=node.line,
156
+ ),
157
+ )
158
+
159
+ def exit_doc_tag(self, node: ast.AstNode) -> None:
160
+ """Grammar rule.
161
+
162
+ doc_tag -> DOC_STRING
163
+ doc_tag -> empty
164
+ """
165
+ replace_node(node, node.kid[0])
166
+
167
+ def exit_import_stmt(self, node: ast.AstNode) -> None:
168
+ """Grammar rule.
169
+
170
+ import_stmt -> KW_IMPORT sub_name KW_FROM import_path COMMA import_items SEMI
171
+ import_stmt -> KW_IMPORT sub_name import_path KW_AS NAME SEMI
172
+ import_stmt -> KW_IMPORT sub_name import_path SEMI
173
+ """
174
+ kid = node.kid
175
+ meta = {
176
+ "lang": kid[1],
177
+ "path": kid[2],
178
+ "alias": None,
179
+ "items": None,
180
+ "is_absorb": False,
181
+ }
182
+ if len(node.kid) == 7:
183
+ meta["path"] = kid[3]
184
+ meta["items"] = kid[5]
185
+ node.kid = [kid[1], kid[3], kid[5]]
186
+ elif len(node.kid) == 6:
187
+ meta["alias"] = kid[4]
188
+ node.kid = [kid[1], kid[2], kid[4]]
189
+ else:
190
+ node.kid = [kid[1], kid[2]]
191
+ replace_node(
192
+ node,
193
+ ast.Import(
194
+ lang=meta["lang"],
195
+ path=meta["path"],
196
+ alias=meta["alias"],
197
+ items=meta["items"],
198
+ is_absorb=meta["is_absorb"],
199
+ parent=node.parent,
200
+ mod_link=self.mod_link,
201
+ kid=node.kid,
202
+ line=node.line,
203
+ ),
204
+ )
205
+
206
+ def exit_include_stmt(self, node: ast.AstNode) -> None:
207
+ """Grammar rule.
208
+
209
+ include_stmt -> KW_INCLUDE sub_name import_path SEMI
210
+ """
211
+ kid = node.kid
212
+ meta = {
213
+ "lang": kid[1],
214
+ "path": kid[2],
215
+ "alias": None,
216
+ "items": None,
217
+ "is_absorb": True,
218
+ }
219
+ node.kid = [kid[1], kid[2]]
220
+ replace_node(
221
+ node,
222
+ ast.Import(
223
+ lang=meta["lang"],
224
+ path=meta["path"],
225
+ alias=meta["alias"],
226
+ items=meta["items"],
227
+ is_absorb=meta["is_absorb"],
228
+ parent=node.parent,
229
+ mod_link=self.mod_link,
230
+ kid=node.kid,
231
+ line=node.line,
232
+ ),
233
+ )
234
+
235
+ def exit_import_path(self, node: ast.AstNode) -> None:
236
+ """Grammar rule.
237
+
238
+ import_path -> import_path_prefix import_path_tail
239
+ import_path -> import_path_prefix
240
+ """
241
+ if len(node.kid) == 1:
242
+ node.kid = node.kid[0].kid
243
+ else:
244
+ node.kid = node.kid[0].kid + node.kid[1].kid
245
+ replace_node(
246
+ node,
247
+ ast.ModulePath(
248
+ path=node.kid,
249
+ parent=node.parent,
250
+ mod_link=self.mod_link,
251
+ kid=node.kid,
252
+ line=node.line,
253
+ ),
254
+ )
255
+
256
+ def exit_import_path_prefix(self, node: ast.AstNode) -> None:
257
+ """Grammar rule.
258
+
259
+ import_path_prefix -> DOT DOT NAME
260
+ import_path_prefix -> DOT NAME
261
+ import_path_prefix -> NAME
262
+ """
263
+
264
+ def exit_import_path_tail(self, node: ast.AstNode) -> None:
265
+ """Grammar rule.
266
+
267
+ import_path_tail -> import_path_tail DOT NAME
268
+ import_path_tail -> DOT NAME
269
+ """
270
+ if len(node.kid) > 2:
271
+ node.kid = node.kid[0].kid + [node.kid[1], node.kid[2]]
272
+
273
+ def exit_import_items(self, node: ast.AstNode) -> None:
274
+ """Grammar rule.
275
+
276
+ import_items -> import_items COMMA NAME KW_AS NAME
277
+ import_items -> import_items COMMA NAME
278
+ import_items -> NAME KW_AS NAME
279
+ import_items -> NAME
280
+ """
281
+ this_item = None
282
+ if type(node.kid[0]) == ast.Name:
283
+ this_item = ast.ModuleItem(
284
+ name=node.kid[0],
285
+ alias=node.kid[2] if len(node.kid) == 3 else None,
286
+ parent=node.parent,
287
+ mod_link=self.mod_link,
288
+ kid=[node.kid[0], node.kid[2]] if len(node.kid) == 3 else [node.kid[0]],
289
+ line=node.line,
290
+ )
291
+ node.kid = [this_item]
292
+ else:
293
+ this_item = ast.ModuleItem(
294
+ name=node.kid[-3] if node.kid[-2].name == Tok.KW_AS else node.kid[-1],
295
+ alias=node.kid[-1] if node.kid[-2].name == Tok.KW_AS else None,
296
+ parent=node.parent,
297
+ mod_link=self.mod_link,
298
+ kid=[node.kid[-3], node.kid[-1]]
299
+ if node.kid[-2].name == Tok.KW_AS
300
+ else [node.kid[-1]],
301
+ line=node.line,
302
+ )
303
+ node.kid = node.kid[0].kid + [this_item]
304
+ replace_node(
305
+ node,
306
+ ast.ModuleItems(
307
+ items=node.kid,
308
+ parent=node.parent,
309
+ mod_link=self.mod_link,
310
+ kid=node.kid,
311
+ line=node.line,
312
+ ),
313
+ )
314
+
315
+ def exit_architype(self, node: ast.AstNode) -> None:
316
+ """Grammar rule.
317
+
318
+ architype -> architype_def
319
+ architype -> architype_decl
320
+ architype -> architype_inline_spec
321
+ """
322
+ replace_node(node, node.kid[0])
323
+
324
+ def exit_architype_decl(self, node: ast.AstNode) -> None:
325
+ """Grammar rule.
326
+
327
+ architype_decl -> doc_tag decorators arch_type access_tag NAME inherited_archs member_block
328
+ architype_decl -> doc_tag arch_type access_tag NAME inherited_archs member_block
329
+ architype_decl -> doc_tag decorators arch_type access_tag NAME inherited_archs SEMI
330
+ architype_decl -> doc_tag arch_type access_tag NAME inherited_archs SEMI
331
+ """
332
+ replace_node(
333
+ node,
334
+ ast.Architype(
335
+ doc=node.kid[0],
336
+ decorators=node.kid[1] if len(node.kid) == 7 else None,
337
+ arch_type=node.kid[2] if len(node.kid) == 7 else node.kid[1],
338
+ access=node.kid[3] if len(node.kid) == 7 else node.kid[2],
339
+ name=node.kid[4] if len(node.kid) == 7 else node.kid[3],
340
+ base_classes=node.kid[5] if len(node.kid) == 7 else node.kid[4],
341
+ body=node.kid[-1] if type(node.kid[-1]) == ast.ArchBlock else None,
342
+ parent=node.parent,
343
+ mod_link=self.mod_link,
344
+ kid=node.kid,
345
+ line=node.line,
346
+ ),
347
+ )
348
+ if type(node.kid[-1]) == ast.Token:
349
+ del node.kid[-1]
350
+
351
+ def exit_architype_def(self, node: ast.AstNode) -> None:
352
+ """Grammar rule.
353
+
354
+ architype_def -> doc_tag dotted_name strict_arch_ref member_block
355
+ architype_def -> doc_tag strict_arch_ref member_block
356
+ """
357
+ replace_node(
358
+ node,
359
+ ast.ArchDef(
360
+ doc=node.kid[0],
361
+ mod=node.kid[1] if len(node.kid) == 4 else None,
362
+ arch=node.kid[2] if len(node.kid) == 4 else node.kid[1],
363
+ body=node.kid[-1],
364
+ parent=node.parent,
365
+ mod_link=self.mod_link,
366
+ kid=node.kid,
367
+ line=node.line,
368
+ ),
369
+ )
370
+
371
+ def exit_arch_type(self, node: ast.AstNode) -> None:
372
+ """Grammar rule.
373
+
374
+ arch_type -> KW_WALKER
375
+ arch_type -> KW_OBJECT
376
+ arch_type -> KW_EDGE
377
+ arch_type -> KW_NODE
378
+ """
379
+ replace_node(node, node.kid[0])
380
+
381
+ def exit_decorators(self, node: ast.AstNode) -> None:
382
+ """Grammar rule.
383
+
384
+ decorators -> decorators DECOR_OP atom
385
+ decorators -> DECOR_OP atom
386
+ """
387
+ if len(node.kid) == 3:
388
+ node.kid = node.kid[0].kid + [node.kid[2]]
389
+ else:
390
+ node.kid = [node.kid[1]]
391
+ replace_node(
392
+ node,
393
+ ast.Decorators(
394
+ calls=node.kid,
395
+ parent=node.parent,
396
+ mod_link=self.mod_link,
397
+ kid=node.kid,
398
+ line=node.line,
399
+ ),
400
+ )
401
+
402
+ def exit_inherited_archs(self, node: ast.AstNode) -> None:
403
+ """Grammar rule.
404
+
405
+ inherited_archs -> inherited_archs sub_name_dotted
406
+ inherited_archs -> empty
407
+ """
408
+ if len(node.kid) == 2:
409
+ node.kid = node.kid[0].kid + [node.kid[1]]
410
+ if not node.kid[0]:
411
+ del node.kid[0]
412
+ replace_node(
413
+ node,
414
+ ast.BaseClasses(
415
+ base_classes=node.kid,
416
+ parent=node.parent,
417
+ mod_link=self.mod_link,
418
+ kid=node.kid,
419
+ line=node.line,
420
+ ),
421
+ )
422
+
423
+ def exit_sub_name(self, node: ast.AstNode) -> None:
424
+ """Grammar rule.
425
+
426
+ sub_name -> COLON NAME
427
+ """
428
+ replace_node(node, node.kid[1])
429
+
430
+ def exit_sub_name_dotted(self, node: ast.AstNode) -> None:
431
+ """Grammar rule.
432
+
433
+ sub_name_dotted -> COLON dotted_name
434
+ """
435
+ replace_node(node, node.kid[1])
436
+
437
+ def exit_dotted_name(self, node: ast.AstNode) -> None:
438
+ """Grammar rule.
439
+
440
+ dotted_name -> dotted_name DOT all_refs
441
+ dotted_name -> all_refs
442
+ """
443
+ if len(node.kid) == 3:
444
+ node.kid = node.kid[0].kid + [node.kid[2]]
445
+ replace_node(
446
+ node,
447
+ ast.NameList(
448
+ names=node.kid,
449
+ parent=node.parent,
450
+ mod_link=self.mod_link,
451
+ kid=node.kid,
452
+ line=node.line,
453
+ ),
454
+ )
455
+
456
+ def exit_all_refs(self, node: ast.AstNode) -> None:
457
+ """Grammar rule.
458
+
459
+ all_refs -> named_refs
460
+ all_refs -> special_refs
461
+ """
462
+ replace_node(node, node.kid[0])
463
+
464
+ def exit_named_refs(self, node: ast.AstNode) -> None:
465
+ """Grammar rule.
466
+
467
+ named_refs -> NAME
468
+ named_refs -> arch_ref
469
+ named_refs -> global_ref
470
+ """
471
+ replace_node(node, node.kid[0])
472
+
473
+ def exit_special_refs(self, node: ast.AstNode) -> None:
474
+ """Grammar rule.
475
+
476
+ special_refs -> here_ref
477
+ special_refs -> self_ref
478
+ special_refs -> root_ref
479
+ special_refs -> super_ref
480
+ """
481
+ replace_node(node, node.kid[0])
482
+
483
+ def exit_ability(self, node: ast.AstNode) -> None:
484
+ """Grammar rule.
485
+
486
+ ability -> ability_def
487
+ ability -> KW_ASYNC ability_decl
488
+ ability -> ability_decl
489
+ """
490
+ if len(node.kid) == 2:
491
+ new_node = replace_node(node, node.kid[1])
492
+ if type(new_node) == ast.Ability:
493
+ new_node.is_async = True
494
+ else:
495
+ replace_node(node, node.kid[0])
496
+
497
+ def exit_ability_decl(self, node: ast.AstNode) -> None:
498
+ """Grammar rule.
499
+
500
+ ability_decl -> ability_decl_decor
501
+ ability_decl -> doc_tag static_tag KW_CAN access_tag NAME func_decl code_block
502
+ ability_decl -> doc_tag static_tag KW_CAN access_tag NAME event_clause code_block
503
+ ability_decl -> doc_tag static_tag KW_CAN access_tag NAME func_decl SEMI
504
+ ability_decl -> doc_tag static_tag KW_CAN access_tag NAME event_clause SEMI
505
+ """
506
+ if len(node.kid) == 1:
507
+ replace_node(node, node.kid[0])
508
+ return
509
+ del node.kid[2]
510
+ replace_node(
511
+ node,
512
+ ast.Ability(
513
+ doc=node.kid[0],
514
+ access=node.kid[2],
515
+ is_static=node.kid[1],
516
+ name=node.kid[3],
517
+ body=node.kid[-1] if type(node.kid[-1]) == ast.CodeBlock else None,
518
+ signature=node.kid[-2],
519
+ is_func=type(node.kid[-2]) == ast.FuncSignature,
520
+ is_async=False,
521
+ decorators=None,
522
+ parent=node.parent,
523
+ mod_link=self.mod_link,
524
+ kid=node.kid,
525
+ line=node.line,
526
+ ),
527
+ )
528
+ if type(node.kid[-1]) == ast.Token:
529
+ del node.kid[-1]
530
+
531
+ def exit_ability_decl_decor(self, node: ast.AstNode) -> None:
532
+ """Grammar rule.
533
+
534
+ ability_decl_decor -> doc_tag decorators static_tag KW_CAN access_tag NAME func_decl code_block
535
+ ability_decl_decor -> doc_tag decorators static_tag KW_CAN access_tag NAME event_clause code_block
536
+ ability_decl_decor -> doc_tag decorators static_tag KW_CAN access_tag NAME func_decl SEMI
537
+ ability_decl_decor -> doc_tag decorators static_tag KW_CAN access_tag NAME event_clause SEMI
538
+ """
539
+ del node.kid[3]
540
+ replace_node(
541
+ node,
542
+ ast.Ability(
543
+ doc=node.kid[0],
544
+ decorators=node.kid[1],
545
+ is_static=node.kid[2],
546
+ access=node.kid[3],
547
+ name=node.kid[4],
548
+ body=node.kid[-1] if type(node.kid[-1]) == ast.CodeBlock else None,
549
+ signature=node.kid[-2],
550
+ is_func=type(node.kid[-2]) == ast.FuncSignature,
551
+ is_async=False,
552
+ parent=node.parent,
553
+ mod_link=self.mod_link,
554
+ kid=node.kid,
555
+ line=node.line,
556
+ ),
557
+ )
558
+ if type(node.kid[-1]) == ast.Token:
559
+ del node.kid[-1]
560
+
561
+ def exit_ability_def(self, node: ast.AstNode) -> None:
562
+ """Grammar rule.
563
+
564
+ ability_def -> doc_tag dotted_name ability_ref func_decl code_block
565
+ ability_def -> doc_tag ability_ref func_decl code_block
566
+ ability_def -> doc_tag dotted_name ability_ref event_clause code_block
567
+ ability_def -> doc_tag ability_ref event_clause code_block
568
+ """
569
+ replace_node(
570
+ node,
571
+ ast.AbilityDef(
572
+ doc=node.kid[0],
573
+ target=node.kid[1] if len(node.kid) == 5 else None,
574
+ ability=node.kid[2] if len(node.kid) == 5 else node.kid[1],
575
+ signature=node.kid[-2],
576
+ body=node.kid[-1],
577
+ parent=node.parent,
578
+ mod_link=self.mod_link,
579
+ kid=node.kid,
580
+ line=node.line,
581
+ ),
582
+ )
583
+
584
+ def exit_event_clause(self, node: ast.AstNode) -> None:
585
+ """Grammar rule.
586
+
587
+ event_clause -> KW_WITH type_spec KW_EXIT return_type_tag
588
+ event_clause -> KW_WITH type_spec KW_ENTRY return_type_tag
589
+ event_clause -> KW_WITH KW_EXIT return_type_tag
590
+ event_clause -> KW_WITH KW_ENTRY return_type_tag
591
+ """
592
+ if len(node.kid) == 3:
593
+ node.kid = node.kid[1:]
594
+ replace_node(
595
+ node,
596
+ ast.EventSignature(
597
+ event=node.kid[0],
598
+ arch_tag_info=None,
599
+ return_type=node.kid[-1],
600
+ parent=node.parent,
601
+ mod_link=self.mod_link,
602
+ kid=node.kid,
603
+ line=node.line,
604
+ ),
605
+ )
606
+ else:
607
+ node.kid = node.kid[1:]
608
+ replace_node(
609
+ node,
610
+ ast.EventSignature(
611
+ event=node.kid[1],
612
+ arch_tag_info=node.kid[0],
613
+ return_type=node.kid[-1],
614
+ parent=node.parent,
615
+ mod_link=self.mod_link,
616
+ kid=node.kid,
617
+ line=node.line,
618
+ ),
619
+ )
620
+
621
+ def exit_func_decl(self, node: ast.AstNode) -> None:
622
+ """Grammar rule.
623
+
624
+ func_decl -> LPAREN func_decl_param_list RPAREN return_type_tag
625
+ func_decl -> LPAREN RPAREN return_type_tag
626
+ func_decl -> return_type_tag
627
+ """
628
+ if len(node.kid) <= 3:
629
+ node.kid = [node.kid[-1]]
630
+ replace_node(
631
+ node,
632
+ ast.FuncSignature(
633
+ params=None,
634
+ return_type=node.kid[0],
635
+ parent=node.parent,
636
+ mod_link=self.mod_link,
637
+ kid=node.kid,
638
+ line=node.line,
639
+ ),
640
+ )
641
+ else:
642
+ node.kid = [node.kid[1], node.kid[3]]
643
+ replace_node(
644
+ node,
645
+ ast.FuncSignature(
646
+ params=node.kid[0],
647
+ return_type=node.kid[1],
648
+ parent=node.parent,
649
+ mod_link=self.mod_link,
650
+ kid=node.kid,
651
+ line=node.line,
652
+ ),
653
+ )
654
+
655
+ def exit_func_decl_param_list(self, node: ast.AstNode) -> None:
656
+ """Grammar rule.
657
+
658
+ func_decl_param_list -> func_decl_param_list COMMA param_var
659
+ func_decl_param_list -> param_var
660
+ """
661
+ if len(node.kid) == 3:
662
+ node.kid = node.kid[0].kid + [node.kid[2]]
663
+ replace_node(
664
+ node,
665
+ ast.FuncParams(
666
+ params=node.kid,
667
+ parent=node.parent,
668
+ mod_link=self.mod_link,
669
+ kid=node.kid,
670
+ line=node.line,
671
+ ),
672
+ )
673
+
674
+ def exit_param_var(self, node: ast.AstNode) -> None:
675
+ """Grammar rule.
676
+
677
+ param_var -> STAR_POW NAME type_tag EQ expression
678
+ param_var -> STAR_POW NAME type_tag
679
+ param_var -> STAR_MUL NAME type_tag EQ expression
680
+ param_var -> STAR_MUL NAME type_tag
681
+ param_var -> NAME type_tag EQ expression
682
+ param_var -> NAME type_tag
683
+ """
684
+ meta = {"unpack": None, "value": None}
685
+ if node.kid[-2].name == Tok.EQ:
686
+ del node.kid[-2]
687
+ meta["value"] = node.kid[-1]
688
+ if node.kid[0].name != "NAME":
689
+ meta["unpack"] = node.kid[0]
690
+ meta["name"] = node.kid[1]
691
+ meta["type_tag"] = node.kid[2]
692
+ else:
693
+ meta["name"] = node.kid[0]
694
+ meta["type_tag"] = node.kid[1]
695
+ replace_node(
696
+ node,
697
+ ast.ParamVar(
698
+ name=meta["name"],
699
+ type_tag=meta["type_tag"],
700
+ unpack=meta["unpack"],
701
+ value=meta["value"],
702
+ parent=node.parent,
703
+ mod_link=self.mod_link,
704
+ kid=node.kid,
705
+ line=node.line,
706
+ ),
707
+ )
708
+
709
+ def exit_enum(self, node: ast.AstNode) -> None:
710
+ """Grammar rule.
711
+
712
+ enum -> enum_def
713
+ enum -> enum_decl
714
+ """
715
+ replace_node(node, node.kid[0])
716
+
717
+ def exit_enum_decl(self, node: ast.AstNode) -> None:
718
+ """Grammar rule.
719
+
720
+ enum_decl -> doc_tag decorators KW_ENUM access_tag NAME inherited_archs enum_block
721
+ enum_decl -> doc_tag decorators KW_ENUM access_tag NAME inherited_archs SEMI
722
+ enum_decl -> doc_tag KW_ENUM access_tag NAME inherited_archs enum_block
723
+ enum_decl -> doc_tag KW_ENUM access_tag NAME inherited_archs SEMI
724
+ """
725
+ if type(node.kid[1]) == ast.Token:
726
+ del node.kid[1]
727
+ replace_node(
728
+ node,
729
+ ast.Enum(
730
+ doc=node.kid[0],
731
+ decorators=None,
732
+ access=node.kid[1],
733
+ name=node.kid[2],
734
+ base_classes=node.kid[3],
735
+ body=node.kid[-1] if type(node.kid[-1]) == ast.EnumBlock else None,
736
+ parent=node.parent,
737
+ mod_link=self.mod_link,
738
+ kid=node.kid,
739
+ line=node.line,
740
+ ),
741
+ )
742
+ else:
743
+ replace_node(
744
+ node,
745
+ ast.Enum(
746
+ doc=node.kid[0],
747
+ decorators=node.kid[1],
748
+ access=node.kid[2],
749
+ name=node.kid[3],
750
+ base_classes=node.kid[4],
751
+ body=node.kid[-1] if type(node.kid[-1]) == ast.EnumBlock else None,
752
+ parent=node.parent,
753
+ mod_link=self.mod_link,
754
+ kid=node.kid,
755
+ line=node.line,
756
+ ),
757
+ )
758
+ if type(node.kid[-1]) == ast.Token:
759
+ del node.kid[-1]
760
+
761
+ def exit_enum_def(self, node: ast.AstNode) -> None:
762
+ """Grammar rule.
763
+
764
+ enum_def -> doc_tag dotted_name enum_ref enum_block
765
+ enum_def -> doc_tag enum_ref enum_block
766
+ """
767
+ replace_node(
768
+ node,
769
+ ast.EnumDef(
770
+ doc=node.kid[0],
771
+ enum=node.kid[-2],
772
+ mod=node.kid[1] if len(node.kid) == 4 else None,
773
+ body=node.kid[-1],
774
+ parent=node.parent,
775
+ mod_link=self.mod_link,
776
+ kid=node.kid,
777
+ line=node.line,
778
+ ),
779
+ )
780
+
781
+ def exit_enum_block(self, node: ast.AstNode) -> None:
782
+ """Grammar rule.
783
+
784
+ enum_block -> LBRACE enum_stmt_list RBRACE
785
+ enum_block -> LBRACE RBRACE
786
+ """
787
+ if len(node.kid) == 3:
788
+ ret = replace_node(node, node.kid[1])
789
+ node = ret if ret else node
790
+ else:
791
+ node.kid = []
792
+ replace_node(
793
+ node,
794
+ ast.EnumBlock(
795
+ stmts=node.kid,
796
+ parent=node.parent,
797
+ mod_link=self.mod_link,
798
+ kid=node.kid,
799
+ line=node.line,
800
+ ),
801
+ )
802
+
803
+ def exit_enum_stmt_list(self, node: ast.AstNode) -> None:
804
+ """Grammar rule.
805
+
806
+ enum_stmt_list -> enum_stmt_list COMMA enum_op_assign
807
+ enum_stmt_list -> enum_stmt_list COMMA NAME
808
+ enum_stmt_list -> enum_op_assign
809
+ enum_stmt_list -> NAME
810
+ """
811
+ if len(node.kid) == 3:
812
+ node.kid = node.kid[0].kid + [node.kid[2]]
813
+
814
+ def exit_enum_op_assign(self, node: ast.AstNode) -> None:
815
+ """Grammar rule.
816
+
817
+ enum_op_assign -> NAME EQ expression
818
+ """
819
+ del node.kid[1]
820
+ replace_node(
821
+ node,
822
+ ast.Assignment(
823
+ target=node.kid[0],
824
+ value=node.kid[1],
825
+ mutable=False,
826
+ is_static=False,
827
+ parent=node.parent,
828
+ mod_link=self.mod_link,
829
+ kid=node.kid,
830
+ line=node.line,
831
+ ),
832
+ )
833
+
834
+ def exit_member_block(self, node: ast.AstNode) -> None:
835
+ """Grammar rule.
836
+
837
+ member_block -> LBRACE member_stmt_list RBRACE
838
+ member_block -> LBRACE RBRACE
839
+ """
840
+ if len(node.kid) == 3:
841
+ ret = replace_node(node, node.kid[1])
842
+ node = ret if ret else node
843
+ else:
844
+ node.kid = []
845
+ replace_node(
846
+ node,
847
+ ast.ArchBlock(
848
+ members=node.kid,
849
+ parent=node.parent,
850
+ mod_link=self.mod_link,
851
+ kid=node.kid,
852
+ line=node.line,
853
+ ),
854
+ )
855
+
856
+ def exit_member_stmt_list(self, node: ast.AstNode) -> None:
857
+ """Grammar rule.
858
+
859
+ member_stmt_list -> member_stmt_list member_stmt
860
+ member_stmt_list -> member_stmt
861
+ """
862
+ if len(node.kid) == 2:
863
+ node.kid = node.kid[0].kid + [node.kid[1]]
864
+
865
+ def exit_member_stmt(self, node: ast.AstNode) -> None:
866
+ """Grammar rule.
867
+
868
+ member_stmt -> ability
869
+ member_stmt -> has_stmt
870
+ """
871
+ replace_node(node, node.kid[0])
872
+
873
+ def exit_has_stmt(self, node: ast.AstNode) -> None:
874
+ """Grammar rule.
875
+
876
+ has_stmt -> doc_tag static_tag KW_FREEZE access_tag has_assign_clause SEMI
877
+ has_stmt -> doc_tag static_tag KW_HAS access_tag has_assign_clause SEMI
878
+ """
879
+ is_frozen = node.kid[2].name == Tok.KW_FREEZE
880
+ node.kid = [node.kid[0], node.kid[1], node.kid[3], node.kid[4]]
881
+ replace_node(
882
+ node,
883
+ ast.ArchHas(
884
+ doc=node.kid[0],
885
+ is_static=node.kid[1],
886
+ access=node.kid[2],
887
+ vars=node.kid[3],
888
+ is_frozen=is_frozen,
889
+ parent=node.parent,
890
+ mod_link=self.mod_link,
891
+ kid=node.kid,
892
+ line=node.line,
893
+ ),
894
+ )
895
+
896
+ def exit_static_tag(self, node: ast.AstNode) -> None:
897
+ """Grammar rule.
898
+
899
+ static_tag -> KW_STATIC
900
+ static_tag -> empty
901
+ """
902
+ replace_node(node, node.kid[0] if len(node.kid) else None)
903
+
904
+ def exit_has_assign_clause(self, node: ast.AstNode) -> None:
905
+ """Grammar rule.
906
+
907
+ has_assign_clause -> has_assign_clause COMMA typed_has_clause
908
+ has_assign_clause -> typed_has_clause
909
+ """
910
+ if len(node.kid) == 3:
911
+ node.kid = node.kid[0].kid + [node.kid[2]]
912
+ replace_node(
913
+ node,
914
+ ast.HasVarList(
915
+ vars=node.kid,
916
+ parent=node.parent,
917
+ mod_link=self.mod_link,
918
+ kid=node.kid,
919
+ line=node.line,
920
+ ),
921
+ )
922
+
923
+ def exit_typed_has_clause(self, node: ast.AstNode) -> None:
924
+ """Grammar rule.
925
+
926
+ typed_has_clause -> NAME type_tag EQ expression
927
+ typed_has_clause -> NAME type_tag
928
+ """
929
+ if node.kid[-2].name == Tok.EQ:
930
+ del node.kid[-2]
931
+ replace_node(
932
+ node,
933
+ ast.HasVar(
934
+ name=node.kid[0],
935
+ type_tag=node.kid[1],
936
+ value=node.kid[2] if len(node.kid) == 3 else None,
937
+ parent=node.parent,
938
+ mod_link=self.mod_link,
939
+ kid=node.kid,
940
+ line=node.line,
941
+ ),
942
+ )
943
+
944
+ def exit_type_tag(self, node: ast.AstNode) -> None:
945
+ """Grammar rule.
946
+
947
+ type_tag -> COLON type_spec
948
+ """
949
+ replace_node(node, node.kid[1])
950
+
951
+ def exit_return_type_tag(self, node: ast.AstNode) -> None:
952
+ """Grammar rule.
953
+
954
+ return_type_tag -> RETURN_HINT type_spec
955
+ return_type_tag -> empty
956
+ """
957
+ if len(node.kid) == 2:
958
+ replace_node(node, node.kid[1])
959
+ else:
960
+ replace_node(node, None)
961
+
962
+ def exit_type_spec(self, node: ast.AstNode) -> None:
963
+ """Grammar rule.
964
+
965
+ type_spec -> type_spec BW_OR single_type
966
+ type_spec -> type_spec NULL_OK
967
+ type_spec -> single_type
968
+ """
969
+ if len(node.kid) == 3:
970
+ node.kid = node.kid[0].kid + [node.kid[2]]
971
+ if len(node.kid) == 2:
972
+ if type(node.kid[0]) == ast.TypeSpecList:
973
+ node.kid[0].kid[0].null_ok = True
974
+ node.kid = node.kid[0].kid
975
+ elif type(node.kid[0]) == ast.TypeSpec:
976
+ node.kid[0].null_ok = True
977
+ else:
978
+ raise Exception(f"Invalid type spec{type(node.kid[0])}")
979
+ replace_node(
980
+ node,
981
+ ast.TypeSpecList(
982
+ types=node.kid,
983
+ parent=node.parent,
984
+ mod_link=self.mod_link,
985
+ kid=node.kid,
986
+ line=node.line,
987
+ ),
988
+ )
989
+
990
+ def exit_single_type(self, node: ast.AstNode) -> None:
991
+ """Grammar rule.
992
+
993
+ single_type -> TYP_DICT LSQUARE single_type COMMA single_type RSQUARE
994
+ single_type -> TYP_SET LSQUARE single_type RSQUARE
995
+ single_type -> TYP_TUPLE LSQUARE single_type RSQUARE
996
+ single_type -> TYP_LIST LSQUARE single_type RSQUARE
997
+ single_type -> dotted_name
998
+ single_type -> NULL
999
+ """
1000
+ meta = {
1001
+ "typ": node.kid[0],
1002
+ "list_nest": None,
1003
+ "dict_nest": None,
1004
+ }
1005
+ if len(node.kid) == 4:
1006
+ node.kid = [node.kid[0], node.kid[2]]
1007
+ meta["list_nest"] = node.kid[1]
1008
+ elif len(node.kid) == 6:
1009
+ node.kid = [node.kid[0], node.kid[2], node.kid[4]]
1010
+ meta["list_nest"] = node.kid[1]
1011
+ meta["dict_nest"] = node.kid[2]
1012
+ replace_node(
1013
+ node,
1014
+ ast.TypeSpec(
1015
+ spec_type=meta["typ"],
1016
+ list_nest=meta["list_nest"],
1017
+ dict_nest=meta["dict_nest"],
1018
+ null_ok=False,
1019
+ parent=node.parent,
1020
+ mod_link=self.mod_link,
1021
+ kid=node.kid,
1022
+ line=node.line,
1023
+ ),
1024
+ )
1025
+
1026
+ def exit_builtin_type(self, node: ast.AstNode) -> None:
1027
+ """Grammar rule.
1028
+
1029
+ builtin_type -> TYP_TYPE
1030
+ builtin_type -> TYP_ANY
1031
+ builtin_type -> TYP_BOOL
1032
+ builtin_type -> TYP_DICT
1033
+ builtin_type -> TYP_SET
1034
+ builtin_type -> TYP_TUPLE
1035
+ builtin_type -> TYP_LIST
1036
+ builtin_type -> TYP_FLOAT
1037
+ builtin_type -> TYP_INT
1038
+ builtin_type -> TYP_BYTES
1039
+ builtin_type -> TYP_STRING
1040
+ """
1041
+ replace_node(node, node.kid[0])
1042
+
1043
+ def exit_code_block(self, node: ast.AstNode) -> None:
1044
+ """Grammar rule.
1045
+
1046
+ code_block -> LBRACE statement_list RBRACE
1047
+ code_block -> LBRACE RBRACE
1048
+ """
1049
+ if len(node.kid) == 3:
1050
+ ret = replace_node(node, node.kid[1])
1051
+ node = ret if ret else node
1052
+ else:
1053
+ node.kid = []
1054
+ replace_node(
1055
+ node,
1056
+ ast.CodeBlock(
1057
+ stmts=node.kid,
1058
+ parent=node.parent,
1059
+ mod_link=self.mod_link,
1060
+ kid=node.kid,
1061
+ line=node.line,
1062
+ ),
1063
+ )
1064
+
1065
+ def exit_statement_list(self, node: ast.AstNode) -> None:
1066
+ """Grammar rule.
1067
+
1068
+ statement_list -> statement
1069
+ statement_list -> statement_list statement
1070
+ """
1071
+ if len(node.kid) == 2:
1072
+ node.kid = node.kid[0].kid + [node.kid[1]]
1073
+
1074
+ def exit_statement(self, node: ast.AstNode) -> None:
1075
+ """Grammar rule.
1076
+
1077
+ statement -> walker_stmt
1078
+ statement -> await_stmt SEMI
1079
+ statement -> yield_stmt SEMI
1080
+ statement -> return_stmt SEMI
1081
+ statement -> report_stmt SEMI
1082
+ statement -> delete_stmt SEMI
1083
+ statement -> ctrl_stmt SEMI
1084
+ statement -> assert_stmt SEMI
1085
+ statement -> raise_stmt SEMI
1086
+ statement -> with_ctx_stmt
1087
+ statement -> while_stmt
1088
+ statement -> for_stmt
1089
+ statement -> try_stmt
1090
+ statement -> if_stmt
1091
+ statement -> expression SEMI
1092
+ statement -> static_assignment
1093
+ statement -> assignment SEMI
1094
+ statement -> ability_decl
1095
+ statement -> architype_decl
1096
+ """
1097
+ replace_node(node, node.kid[0])
1098
+
1099
+ def exit_typed_ctx_block(self, node: ast.AstNode) -> None:
1100
+ """Grammar rule.
1101
+
1102
+ typed_ctx_block -> RETURN_HINT type_spec code_block
1103
+ """
1104
+ del node.kid[0]
1105
+ replace_node(
1106
+ node,
1107
+ ast.TypedCtxBlock(
1108
+ type_ctx=node.kid[0],
1109
+ body=node.kid[1],
1110
+ parent=node.parent,
1111
+ mod_link=self.mod_link,
1112
+ kid=node.kid,
1113
+ line=node.line,
1114
+ ),
1115
+ )
1116
+
1117
+ def exit_if_stmt(self, node: ast.AstNode) -> None:
1118
+ """Grammar rule.
1119
+
1120
+ if_stmt -> KW_IF expression code_block elif_list else_stmt
1121
+ if_stmt -> KW_IF expression code_block elif_list
1122
+ if_stmt -> KW_IF expression code_block else_stmt
1123
+ if_stmt -> KW_IF expression code_block
1124
+ """
1125
+ if len(node.kid) == 3:
1126
+ node.kid = [node.kid[1], node.kid[2]]
1127
+ replace_node(
1128
+ node,
1129
+ ast.IfStmt(
1130
+ condition=node.kid[0],
1131
+ body=node.kid[1],
1132
+ elseifs=None,
1133
+ else_body=None,
1134
+ parent=node.parent,
1135
+ mod_link=self.mod_link,
1136
+ kid=node.kid,
1137
+ line=node.line,
1138
+ ),
1139
+ )
1140
+ elif len(node.kid) == 4 and type(node.kid[3]) == ast.ElseIfs:
1141
+ node.kid = [node.kid[1], node.kid[2], node.kid[3]]
1142
+ replace_node(
1143
+ node,
1144
+ ast.IfStmt(
1145
+ condition=node.kid[0],
1146
+ body=node.kid[1],
1147
+ elseifs=node.kid[2],
1148
+ else_body=None,
1149
+ parent=node.parent,
1150
+ mod_link=self.mod_link,
1151
+ kid=node.kid,
1152
+ line=node.line,
1153
+ ),
1154
+ )
1155
+ elif len(node.kid) == 4:
1156
+ node.kid = [node.kid[1], node.kid[2], node.kid[3]]
1157
+ replace_node(
1158
+ node,
1159
+ ast.IfStmt(
1160
+ condition=node.kid[0],
1161
+ body=node.kid[1],
1162
+ elseifs=None,
1163
+ else_body=node.kid[2],
1164
+ parent=node.parent,
1165
+ mod_link=self.mod_link,
1166
+ kid=node.kid,
1167
+ line=node.line,
1168
+ ),
1169
+ )
1170
+ else:
1171
+ node.kid = [node.kid[1], node.kid[2], node.kid[3], node.kid[4]]
1172
+ replace_node(
1173
+ node,
1174
+ ast.IfStmt(
1175
+ condition=node.kid[0],
1176
+ body=node.kid[1],
1177
+ elseifs=node.kid[2],
1178
+ else_body=node.kid[3],
1179
+ parent=node.parent,
1180
+ mod_link=self.mod_link,
1181
+ kid=node.kid,
1182
+ line=node.line,
1183
+ ),
1184
+ )
1185
+
1186
+ def exit_elif_list(self, node: ast.AstNode) -> None:
1187
+ """Grammar rule.
1188
+
1189
+ elif_list -> elif_list KW_ELIF expression code_block
1190
+ elif_list -> KW_ELIF expression code_block
1191
+ """
1192
+ cpy_node = ast.IfStmt(
1193
+ condition=node.kid[-2],
1194
+ body=node.kid[-1],
1195
+ elseifs=None,
1196
+ else_body=None,
1197
+ parent=node.parent,
1198
+ mod_link=self.mod_link,
1199
+ kid=[node.kid[-2], node.kid[-1]],
1200
+ line=node.line,
1201
+ )
1202
+ if len(node.kid) == 3:
1203
+ node.kid = [cpy_node]
1204
+ if len(node.kid) == 4:
1205
+ node.kid = node.kid[0].kid + [cpy_node]
1206
+ replace_node(
1207
+ node,
1208
+ ast.ElseIfs(
1209
+ elseifs=node.kid,
1210
+ parent=node.parent,
1211
+ mod_link=self.mod_link,
1212
+ kid=node.kid,
1213
+ line=node.line,
1214
+ ),
1215
+ )
1216
+
1217
+ def exit_else_stmt(self, node: ast.AstNode) -> None:
1218
+ """Grammar rule.
1219
+
1220
+ else_stmt -> KW_ELSE code_block
1221
+ """
1222
+ node.kid = [node.kid[1]]
1223
+ replace_node(
1224
+ node,
1225
+ ast.ElseStmt(
1226
+ body=node.kid[0],
1227
+ parent=node.parent,
1228
+ mod_link=self.mod_link,
1229
+ kid=node.kid,
1230
+ line=node.line,
1231
+ ),
1232
+ )
1233
+
1234
+ def exit_try_stmt(self, node: ast.AstNode) -> None:
1235
+ """Grammar rule.
1236
+
1237
+ try_stmt -> KW_TRY code_block except_list finally_stmt
1238
+ try_stmt -> KW_TRY code_block finally_stmt
1239
+ try_stmt -> KW_TRY code_block except_list
1240
+ try_stmt -> KW_TRY code_block
1241
+ """
1242
+ if len(node.kid) == 2:
1243
+ node.kid = [node.kid[1]]
1244
+ replace_node(
1245
+ node,
1246
+ ast.TryStmt(
1247
+ body=node.kid[0],
1248
+ excepts=None,
1249
+ finally_body=None,
1250
+ parent=node.parent,
1251
+ mod_link=self.mod_link,
1252
+ kid=node.kid,
1253
+ line=node.line,
1254
+ ),
1255
+ )
1256
+ elif len(node.kid) == 3 and type(node.kid[2]) == ast.ExceptList:
1257
+ node.kid = [node.kid[1], node.kid[2]]
1258
+ replace_node(
1259
+ node,
1260
+ ast.TryStmt(
1261
+ body=node.kid[0],
1262
+ excepts=node.kid[1],
1263
+ finally_body=None,
1264
+ parent=node.parent,
1265
+ mod_link=self.mod_link,
1266
+ kid=node.kid,
1267
+ line=node.line,
1268
+ ),
1269
+ )
1270
+ elif len(node.kid) == 3:
1271
+ node.kid = [node.kid[1], node.kid[2]]
1272
+ replace_node(
1273
+ node,
1274
+ ast.TryStmt(
1275
+ body=node.kid[0],
1276
+ excepts=None,
1277
+ finally_body=node.kid[1],
1278
+ parent=node.parent,
1279
+ mod_link=self.mod_link,
1280
+ kid=node.kid,
1281
+ line=node.line,
1282
+ ),
1283
+ )
1284
+ else:
1285
+ node.kid = [node.kid[1], node.kid[2], node.kid[3]]
1286
+ replace_node(
1287
+ node,
1288
+ ast.TryStmt(
1289
+ body=node.kid[0],
1290
+ excepts=node.kid[1],
1291
+ finally_body=node.kid[2],
1292
+ parent=node.parent,
1293
+ mod_link=self.mod_link,
1294
+ kid=node.kid,
1295
+ line=node.line,
1296
+ ),
1297
+ )
1298
+
1299
+ def exit_except_list(self, node: ast.AstNode) -> None:
1300
+ """Grammar rule.
1301
+
1302
+ except_list -> except_list except_def
1303
+ except_list -> except_def
1304
+ """
1305
+ if len(node.kid) == 2:
1306
+ node.kid = node.kid[0].kid + [node.kid[1]]
1307
+ replace_node(
1308
+ node,
1309
+ ast.ExceptList(
1310
+ excepts=node.kid,
1311
+ parent=node.parent,
1312
+ mod_link=self.mod_link,
1313
+ kid=node.kid,
1314
+ line=node.line,
1315
+ ),
1316
+ )
1317
+
1318
+ def exit_except_def(self, node: ast.AstNode) -> None:
1319
+ """Grammar rule.
1320
+
1321
+ except_def -> KW_EXCEPT expression KW_AS NAME code_block
1322
+ except_def -> KW_EXCEPT expression code_block
1323
+ """
1324
+ if len(node.kid) == 3:
1325
+ node.kid = [node.kid[1], node.kid[2]]
1326
+ replace_node(
1327
+ node,
1328
+ ast.Except(
1329
+ ex_type=node.kid[0],
1330
+ name=None,
1331
+ body=node.kid[1],
1332
+ parent=node.parent,
1333
+ mod_link=self.mod_link,
1334
+ kid=node.kid,
1335
+ line=node.line,
1336
+ ),
1337
+ )
1338
+ else:
1339
+ node.kid = [node.kid[1], node.kid[3], node.kid[4]]
1340
+ replace_node(
1341
+ node,
1342
+ ast.Except(
1343
+ ex_type=node.kid[0],
1344
+ name=node.kid[1],
1345
+ body=node.kid[2],
1346
+ parent=node.parent,
1347
+ mod_link=self.mod_link,
1348
+ kid=node.kid,
1349
+ line=node.line,
1350
+ ),
1351
+ )
1352
+
1353
+ def exit_finally_stmt(self, node: ast.AstNode) -> None:
1354
+ """Grammar rule.
1355
+
1356
+ finally_stmt -> KW_FINALLY code_block
1357
+ """
1358
+ node.kid = [node.kid[1]]
1359
+ replace_node(
1360
+ node,
1361
+ ast.FinallyStmt(
1362
+ body=node.kid[0],
1363
+ parent=node.parent,
1364
+ mod_link=self.mod_link,
1365
+ kid=node.kid,
1366
+ line=node.line,
1367
+ ),
1368
+ )
1369
+
1370
+ def exit_for_stmt(self, node: ast.AstNode) -> None:
1371
+ """Grammar rule.
1372
+
1373
+ for_stmt -> KW_FOR NAME COMMA NAME KW_IN expression code_block
1374
+ for_stmt -> KW_FOR NAME KW_IN expression code_block
1375
+ for_stmt -> KW_FOR assignment KW_TO expression KW_BY expression code_block
1376
+ """
1377
+ if node.kid[2].name == Tok.KW_TO:
1378
+ node.kid = [node.kid[1], node.kid[3], node.kid[5], node.kid[6]]
1379
+ replace_node(
1380
+ node,
1381
+ ast.IterForStmt(
1382
+ iter=node.kid[0],
1383
+ condition=node.kid[1],
1384
+ count_by=node.kid[2],
1385
+ body=node.kid[3],
1386
+ parent=node.parent,
1387
+ mod_link=self.mod_link,
1388
+ kid=node.kid,
1389
+ line=node.line,
1390
+ ),
1391
+ )
1392
+ elif node.kid[2].name == Tok.KW_IN:
1393
+ node.kid = [node.kid[1], node.kid[3], node.kid[4]]
1394
+ replace_node(
1395
+ node,
1396
+ ast.InForStmt(
1397
+ name=node.kid[0],
1398
+ collection=node.kid[1],
1399
+ body=node.kid[2],
1400
+ parent=node.parent,
1401
+ mod_link=self.mod_link,
1402
+ kid=node.kid,
1403
+ line=node.line,
1404
+ ),
1405
+ )
1406
+ else:
1407
+ node.kid = [node.kid[1], node.kid[3], node.kid[5], node.kid[6]]
1408
+ replace_node(
1409
+ node,
1410
+ ast.DictForStmt(
1411
+ k_name=node.kid[0],
1412
+ v_name=node.kid[1],
1413
+ collection=node.kid[2],
1414
+ body=node.kid[3],
1415
+ parent=node.parent,
1416
+ mod_link=self.mod_link,
1417
+ kid=node.kid,
1418
+ line=node.line,
1419
+ ),
1420
+ )
1421
+
1422
+ def exit_while_stmt(self, node: ast.AstNode) -> None:
1423
+ """Grammar rule.
1424
+
1425
+ while_stmt -> KW_WHILE expression code_block
1426
+ """
1427
+ node.kid = [node.kid[1], node.kid[2]]
1428
+ replace_node(
1429
+ node,
1430
+ ast.WhileStmt(
1431
+ condition=node.kid[0],
1432
+ body=node.kid[1],
1433
+ parent=node.parent,
1434
+ mod_link=self.mod_link,
1435
+ kid=node.kid,
1436
+ line=node.line,
1437
+ ),
1438
+ )
1439
+
1440
+ def exit_with_stmt(self, node: ast.AstNode) -> None:
1441
+ """Grammar rule.
1442
+
1443
+ KW_WITH expr_as_list code_block
1444
+ """
1445
+ node.kid = [node.kid[1], node.kid[2]]
1446
+ replace_node(
1447
+ node,
1448
+ ast.WithStmt(
1449
+ exprs=node.kid[0],
1450
+ body=node.kid[1],
1451
+ parent=node.parent,
1452
+ mod_link=self.mod_link,
1453
+ kid=node.kid,
1454
+ line=node.line,
1455
+ ),
1456
+ )
1457
+
1458
+ def exit_expr_as_list(self, node: ast.AstNode) -> None:
1459
+ """Grammar rule.
1460
+
1461
+ expr_as_list -> expr_as_list COMMA expression KW_AS NAME
1462
+ expr_as_list -> expr_as_list COMMA NAME
1463
+ expr_as_list -> expression KW_AS NAME
1464
+ expr_as_list -> expression
1465
+ """
1466
+ this_item = None
1467
+ if type(node.kid[0]) != ast.ExprAsItemList:
1468
+ this_item = ast.ExprAsItem(
1469
+ expr=node.kid[0],
1470
+ alias=node.kid[2] if len(node.kid) == 3 else None,
1471
+ parent=node.parent,
1472
+ mod_link=self.mod_link,
1473
+ kid=[node.kid[0], node.kid[2]] if len(node.kid) == 3 else [node.kid[0]],
1474
+ line=node.line,
1475
+ )
1476
+ node.kid = [this_item]
1477
+ else:
1478
+ this_item = ast.ExprAsItem(
1479
+ expr=node.kid[-3] if node.kid[-2].name == Tok.KW_AS else node.kid[-1],
1480
+ alias=node.kid[-1] if node.kid[-2].name == Tok.KW_AS else None,
1481
+ parent=node.parent,
1482
+ mod_link=self.mod_link,
1483
+ kid=[node.kid[-3], node.kid[-1]]
1484
+ if node.kid[-2].name == Tok.KW_AS
1485
+ else [node.kid[-1]],
1486
+ line=node.line,
1487
+ )
1488
+ node.kid = node.kid[0].kid + [this_item]
1489
+ replace_node(
1490
+ node,
1491
+ ast.ExprAsItemList(
1492
+ items=node.kid,
1493
+ parent=node.parent,
1494
+ mod_link=self.mod_link,
1495
+ kid=node.kid,
1496
+ line=node.line,
1497
+ ),
1498
+ )
1499
+
1500
+ def exit_raise_stmt(self, node: ast.AstNode) -> None:
1501
+ """Grammar rule.
1502
+
1503
+ raise_stmt -> KW_RAISE expression
1504
+ raise_stmt -> KW_RAISE
1505
+ """
1506
+ if len(node.kid) == 1:
1507
+ node.kid = []
1508
+ replace_node(
1509
+ node,
1510
+ ast.RaiseStmt(
1511
+ cause=None,
1512
+ parent=node.parent,
1513
+ mod_link=self.mod_link,
1514
+ kid=node.kid,
1515
+ line=node.line,
1516
+ ),
1517
+ )
1518
+ else:
1519
+ node.kid = [node.kid[1]]
1520
+ replace_node(
1521
+ node,
1522
+ ast.RaiseStmt(
1523
+ cause=node.kid[0],
1524
+ parent=node.parent,
1525
+ mod_link=self.mod_link,
1526
+ kid=node.kid,
1527
+ line=node.line,
1528
+ ),
1529
+ )
1530
+
1531
+ def exit_assert_stmt(self, node: ast.AstNode) -> None:
1532
+ """Grammar rule.
1533
+
1534
+ assert_stmt -> KW_ASSERT expression COMMA expression
1535
+ assert_stmt -> KW_ASSERT expression
1536
+ """
1537
+ if len(node.kid) == 4:
1538
+ node.kid = [node.kid[1], node.kid[3]]
1539
+ replace_node(
1540
+ node,
1541
+ ast.AssertStmt(
1542
+ condition=node.kid[0],
1543
+ error_msg=node.kid[1],
1544
+ parent=node.parent,
1545
+ mod_link=self.mod_link,
1546
+ kid=node.kid,
1547
+ line=node.line,
1548
+ ),
1549
+ )
1550
+ else:
1551
+ node.kid = [node.kid[1]]
1552
+ replace_node(
1553
+ node,
1554
+ ast.AssertStmt(
1555
+ condition=node.kid[0],
1556
+ error_msg=None,
1557
+ parent=node.parent,
1558
+ mod_link=self.mod_link,
1559
+ kid=node.kid,
1560
+ line=node.line,
1561
+ ),
1562
+ )
1563
+
1564
+ def exit_ctrl_stmt(self, node: ast.AstNode) -> None:
1565
+ """Grammar rule.
1566
+
1567
+ ctrl_stmt -> KW_SKIP
1568
+ ctrl_stmt -> KW_BREAK
1569
+ ctrl_stmt -> KW_CONTINUE
1570
+ """
1571
+ replace_node(
1572
+ node,
1573
+ ast.CtrlStmt(
1574
+ ctrl=node.kid[0],
1575
+ parent=node.parent,
1576
+ mod_link=self.mod_link,
1577
+ kid=node.kid,
1578
+ line=node.line,
1579
+ ),
1580
+ )
1581
+
1582
+ def exit_delete_stmt(self, node: ast.AstNode) -> None:
1583
+ """Grammar rule.
1584
+
1585
+ delete_stmt -> KW_DELETE expression
1586
+ """
1587
+ node.kid = [node.kid[1]]
1588
+ replace_node(
1589
+ node,
1590
+ ast.DeleteStmt(
1591
+ target=node.kid[0],
1592
+ parent=node.parent,
1593
+ mod_link=self.mod_link,
1594
+ kid=node.kid,
1595
+ line=node.line,
1596
+ ),
1597
+ )
1598
+
1599
+ def exit_report_stmt(self, node: ast.AstNode) -> None:
1600
+ """Grammar rule.
1601
+
1602
+ report_stmt -> KW_REPORT expression
1603
+ """
1604
+ node.kid = [node.kid[1]]
1605
+ replace_node(
1606
+ node,
1607
+ ast.ReportStmt(
1608
+ expr=node.kid[0],
1609
+ parent=node.parent,
1610
+ mod_link=self.mod_link,
1611
+ kid=node.kid,
1612
+ line=node.line,
1613
+ ),
1614
+ )
1615
+
1616
+ def exit_return_stmt(self, node: ast.AstNode) -> None:
1617
+ """Grammar rule.
1618
+
1619
+ return_stmt -> KW_RETURN expression
1620
+ return_stmt -> KW_RETURN
1621
+ """
1622
+ if len(node.kid) == 1:
1623
+ node.kid = []
1624
+ replace_node(
1625
+ node,
1626
+ ast.ReturnStmt(
1627
+ expr=None,
1628
+ parent=node.parent,
1629
+ mod_link=self.mod_link,
1630
+ kid=node.kid,
1631
+ line=node.line,
1632
+ ),
1633
+ )
1634
+ else:
1635
+ node.kid = [node.kid[1]]
1636
+ replace_node(
1637
+ node,
1638
+ ast.ReturnStmt(
1639
+ expr=node.kid[0],
1640
+ parent=node.parent,
1641
+ mod_link=self.mod_link,
1642
+ kid=node.kid,
1643
+ line=node.line,
1644
+ ),
1645
+ )
1646
+
1647
+ def exit_yield_stmt(self, node: ast.AstNode) -> None:
1648
+ """Grammar rule.
1649
+
1650
+ yield_stmt -> KW_YIELD expression
1651
+ yield_stmt -> KW_YIELD
1652
+ """
1653
+ node.kid = [node.kid[1]]
1654
+ replace_node(
1655
+ node,
1656
+ ast.YieldStmt(
1657
+ expr=node.kid[0],
1658
+ parent=node.parent,
1659
+ mod_link=self.mod_link,
1660
+ kid=node.kid,
1661
+ line=node.line,
1662
+ ),
1663
+ )
1664
+
1665
+ def exit_walker_stmt(self, node: ast.AstNode) -> None:
1666
+ """Grammar rule.
1667
+
1668
+ walker_stmt -> disengage_stmt SEMI
1669
+ walker_stmt -> revisit_stmt
1670
+ walker_stmt -> visit_stmt
1671
+ walker_stmt -> ignore_stmt SEMI
1672
+ """
1673
+ replace_node(node, node.kid[0])
1674
+
1675
+ def exit_ignore_stmt(self, node: ast.AstNode) -> None:
1676
+ """Grammar rule.
1677
+
1678
+ ignore_stmt -> KW_IGNORE expression
1679
+ """
1680
+ node.kid = [node.kid[1]]
1681
+ replace_node(
1682
+ node,
1683
+ ast.IgnoreStmt(
1684
+ target=node.kid[0],
1685
+ parent=node.parent,
1686
+ mod_link=self.mod_link,
1687
+ kid=node.kid,
1688
+ line=node.line,
1689
+ ),
1690
+ )
1691
+
1692
+ def exit_visit_stmt(self, node: ast.AstNode) -> None:
1693
+ """Grammar rule.
1694
+
1695
+ visit_stmt -> KW_VISIT sub_name_dotted expression else_stmt
1696
+ visit_stmt -> KW_VISIT expression else_stmt
1697
+ visit_stmt -> KW_VISIT sub_name_dotted expression SEMI
1698
+ visit_stmt -> KW_VISIT expression SEMI
1699
+ """
1700
+ meta = {"typ": None, "else_body": None}
1701
+ if type(node.kid[-1]) != ast.ElseStmt:
1702
+ if len(node.kid) == 4:
1703
+ node.kid = [node.kid[1], node.kid[2]]
1704
+ meta["typ"] = node.kid[0]
1705
+ meta["target"] = node.kid[1]
1706
+ else:
1707
+ node.kid = [node.kid[1]]
1708
+ meta["target"] = node.kid[0]
1709
+ elif len(node.kid) == 4:
1710
+ node.kid = [node.kid[1], node.kid[2], node.kid[3]]
1711
+ meta["typ"] = node.kid[0]
1712
+ meta["target"] = node.kid[1]
1713
+ meta["else_body"] = node.kid[2]
1714
+ else:
1715
+ node.kid = [node.kid[1], node.kid[2]]
1716
+ meta["target"] = node.kid[0]
1717
+ meta["else_body"] = node.kid[1]
1718
+ replace_node(
1719
+ node,
1720
+ ast.VisitStmt(
1721
+ vis_type=meta["typ"],
1722
+ target=meta["target"],
1723
+ else_body=meta["else_body"],
1724
+ parent=node.parent,
1725
+ mod_link=self.mod_link,
1726
+ kid=node.kid,
1727
+ line=node.line,
1728
+ ),
1729
+ )
1730
+
1731
+ def exit_revisit_stmt(self, node: ast.AstNode) -> None:
1732
+ """Grammar rule.
1733
+
1734
+ revisit_stmt -> KW_REVISIT expression else_stmt
1735
+ revisit_stmt -> KW_REVISIT else_stmt
1736
+ revisit_stmt -> KW_REVISIT expression SEMI
1737
+ revisit_stmt -> KW_REVISIT SEMI
1738
+ """
1739
+ meta = {"hops": None, "else_body": None}
1740
+ if node.kid[-1].name == Tok.SEMI:
1741
+ if len(node.kid) == 3:
1742
+ node.kid = [node.kid[1]]
1743
+ meta["hops"] = node.kid[0]
1744
+ elif len(node.kid) == 3:
1745
+ node.kid = [node.kid[1], node.kid[2]]
1746
+ meta["hops"] = node.kid[0]
1747
+ meta["else_body"] = node.kid[1]
1748
+ else:
1749
+ node.kid = [node.kid[1], node.kid[2]]
1750
+ meta["hops"] = node.kid[0]
1751
+ meta["else_body"] = node.kid[1]
1752
+ replace_node(
1753
+ node,
1754
+ ast.RevisitStmt(
1755
+ hops=meta["hops"],
1756
+ else_body=meta["else_body"],
1757
+ parent=node.parent,
1758
+ mod_link=self.mod_link,
1759
+ kid=node.kid,
1760
+ line=node.line,
1761
+ ),
1762
+ )
1763
+
1764
+ def exit_disengage_stmt(self, node: ast.AstNode) -> None:
1765
+ """Grammar rule.
1766
+
1767
+ disengage_stmt -> KW_DISENGAGE
1768
+ """
1769
+ node.kid = []
1770
+ replace_node(
1771
+ node,
1772
+ ast.DisengageStmt(
1773
+ parent=node.parent,
1774
+ mod_link=self.mod_link,
1775
+ kid=node.kid,
1776
+ line=node.line,
1777
+ ),
1778
+ )
1779
+
1780
+ def exit_await_stmt(self, node: ast.AstNode) -> None:
1781
+ """Grammar rule.
1782
+
1783
+ await_stmt -> KW_AWAIT expression
1784
+ """
1785
+ node.kid = [node.kid[1]]
1786
+ replace_node(
1787
+ node,
1788
+ ast.AwaitStmt(
1789
+ target=node.kid[0],
1790
+ parent=node.parent,
1791
+ mod_link=self.mod_link,
1792
+ kid=node.kid,
1793
+ line=node.line,
1794
+ ),
1795
+ )
1796
+
1797
+ def exit_assignment(self, node: ast.AstNode) -> None:
1798
+ """Grammar rule.
1799
+
1800
+ assignment -> KW_FREEZE atom EQ expression
1801
+ assignment -> atom EQ expression
1802
+ """
1803
+ frozen = len(node.kid) == 4
1804
+ node.kid = [node.kid[-3], node.kid[-1]]
1805
+ replace_node(
1806
+ node,
1807
+ ast.Assignment(
1808
+ is_static=False,
1809
+ target=node.kid[0],
1810
+ value=node.kid[1],
1811
+ mutable=not frozen,
1812
+ parent=node.parent,
1813
+ mod_link=self.mod_link,
1814
+ kid=node.kid,
1815
+ line=node.line,
1816
+ ),
1817
+ )
1818
+
1819
+ def exit_static_assignment(self, node: ast.AstNode) -> None:
1820
+ """Grammar rule.
1821
+
1822
+ static_assignment -> KW_HAS assignment_list SEMI
1823
+ """
1824
+ ret = replace_node(node, node.kid[1])
1825
+ node = ret if ret else node
1826
+ for i in node.kid:
1827
+ i.is_static = True
1828
+
1829
+ def binary_op_helper(self, node: ast.AstNode) -> None:
1830
+ """Grammar rule."""
1831
+ if len(node.kid) == 1:
1832
+ replace_node(node, node.kid[0])
1833
+ else:
1834
+ node.kid = [node.kid[0], node.kid[1], node.kid[2]]
1835
+ replace_node(
1836
+ node,
1837
+ ast.BinaryExpr(
1838
+ left=node.kid[0],
1839
+ op=node.kid[1],
1840
+ right=node.kid[2],
1841
+ parent=node.parent,
1842
+ mod_link=self.mod_link,
1843
+ kid=node.kid,
1844
+ line=node.line,
1845
+ ),
1846
+ )
1847
+
1848
+ def exit_expression(self, node: ast.AstNode) -> None:
1849
+ """Grammar rule.
1850
+
1851
+ expression -> walrus_assign KW_IF expression KW_ELSE expression
1852
+ expression -> walrus_assign
1853
+ """
1854
+ if len(node.kid) == 1:
1855
+ replace_node(node, node.kid[0])
1856
+ else:
1857
+ node.kid = [node.kid[0], node.kid[2], node.kid[4]]
1858
+ replace_node(
1859
+ node,
1860
+ ast.IfElseExpr(
1861
+ value=node.kid[0],
1862
+ condition=node.kid[1],
1863
+ else_value=node.kid[2],
1864
+ parent=node.parent,
1865
+ mod_link=self.mod_link,
1866
+ kid=node.kid,
1867
+ line=node.line,
1868
+ ),
1869
+ )
1870
+
1871
+ def exit_walrus_assign(self, node: ast.AstNode) -> None:
1872
+ """Grammar rule.
1873
+
1874
+ walrus_assign -> pipe walrus_op walrus_assign
1875
+ walrus_assign -> pipe
1876
+ """
1877
+ self.binary_op_helper(node)
1878
+
1879
+ def exit_pipe(self, node: ast.AstNode) -> None:
1880
+ """Grammar rule.
1881
+
1882
+ pipe -> pipe_back PIPE_FWD filter_compr
1883
+ pipe -> pipe_back PIPE_FWD pipe
1884
+ pipe -> pipe_back
1885
+ """
1886
+ self.binary_op_helper(node)
1887
+
1888
+ def exit_pipe_back(self, node: ast.AstNode) -> None:
1889
+ """Grammar rule.
1890
+
1891
+ pipe_back -> elvis_check PIPE_BKWD filter_compr
1892
+ pipe_back -> elvis_check PIPE_BKWD pipe_back
1893
+ pipe_back -> elvis_check
1894
+ """
1895
+ self.binary_op_helper(node)
1896
+
1897
+ def exit_elvis_check(self, node: ast.AstNode) -> None:
1898
+ """Grammar rule.
1899
+
1900
+ elvis_check -> bitwise_or ELVIS_OP elvis_check
1901
+ elvis_check -> bitwise_or
1902
+ """
1903
+ self.binary_op_helper(node)
1904
+
1905
+ def exit_bitwise_or(self, node: ast.AstNode) -> None:
1906
+ """Grammar rule.
1907
+
1908
+ bitwise_or -> bitwise_xor BW_OR bitwise_or
1909
+ bitwise_or -> bitwise_xor
1910
+ """
1911
+ self.binary_op_helper(node)
1912
+
1913
+ def exit_bitwise_xor(self, node: ast.AstNode) -> None:
1914
+ """Grammar rule.
1915
+
1916
+ bitwise_xor -> bitwise_and BW_XOR bitwise_xor
1917
+ bitwise_xor -> bitwise_and
1918
+ """
1919
+ self.binary_op_helper(node)
1920
+
1921
+ def exit_bitwise_and(self, node: ast.AstNode) -> None:
1922
+ """Grammar rule.
1923
+
1924
+ bitwise_and -> shift BW_AND bitwise_and
1925
+ bitwise_and -> shift
1926
+ """
1927
+ self.binary_op_helper(node)
1928
+
1929
+ def exit_shift(self, node: ast.AstNode) -> None:
1930
+ """Grammar rule.
1931
+
1932
+ shift -> logical RSHIFT shift
1933
+ shift -> logical LSHIFT shift
1934
+ shift -> logical
1935
+ """
1936
+ self.binary_op_helper(node)
1937
+
1938
+ def exit_logical(self, node: ast.AstNode) -> None:
1939
+ """Grammar rule.
1940
+
1941
+ logical -> NOT logical
1942
+ logical -> compare KW_OR logical
1943
+ logical -> compare KW_AND logical
1944
+ logical -> compare
1945
+ """
1946
+ if len(node.kid) == 2:
1947
+ node.kid = [node.kid[0], node.kid[1]]
1948
+ replace_node(
1949
+ node,
1950
+ ast.UnaryExpr(
1951
+ op=node.kid[0],
1952
+ operand=node.kid[1],
1953
+ parent=node.parent,
1954
+ mod_link=self.mod_link,
1955
+ kid=node.kid,
1956
+ line=node.line,
1957
+ ),
1958
+ )
1959
+ else:
1960
+ self.binary_op_helper(node)
1961
+
1962
+ def exit_compare(self, node: ast.AstNode) -> None:
1963
+ """Grammar rule.
1964
+
1965
+ compare -> arithmetic cmp_op compare
1966
+ compare -> arithmetic
1967
+ """
1968
+ self.binary_op_helper(node)
1969
+
1970
+ def exit_arithmetic(self, node: ast.AstNode) -> None:
1971
+ """Grammar rule.
1972
+
1973
+ arithmetic -> term MINUS arithmetic
1974
+ arithmetic -> term PLUS arithmetic
1975
+ arithmetic -> term
1976
+ """
1977
+ self.binary_op_helper(node)
1978
+
1979
+ def exit_term(self, node: ast.AstNode) -> None:
1980
+ """Grammar rule.
1981
+
1982
+ term -> factor MOD term
1983
+ term -> factor DIV term
1984
+ term -> factor FLOOR_DIV term
1985
+ term -> factor STAR_MUL term
1986
+ term -> factor
1987
+ """
1988
+ self.binary_op_helper(node)
1989
+
1990
+ def exit_factor(self, node: ast.AstNode) -> None:
1991
+ """Grammar rule.
1992
+
1993
+ factor -> power
1994
+ factor -> BW_NOT factor
1995
+ factor -> MINUS factor
1996
+ factor -> PLUS factor
1997
+ """
1998
+ if len(node.kid) == 2:
1999
+ node.kid = [node.kid[0], node.kid[1]]
2000
+ replace_node(
2001
+ node,
2002
+ ast.UnaryExpr(
2003
+ op=node.kid[0],
2004
+ operand=node.kid[1],
2005
+ parent=node.parent,
2006
+ mod_link=self.mod_link,
2007
+ kid=node.kid,
2008
+ line=node.line,
2009
+ ),
2010
+ )
2011
+ else:
2012
+ self.binary_op_helper(node)
2013
+
2014
+ def exit_power(self, node: ast.AstNode) -> None:
2015
+ """Grammar rule.
2016
+
2017
+ power -> connect STAR_POW power
2018
+ power -> connect
2019
+ """
2020
+ self.binary_op_helper(node)
2021
+
2022
+ def exit_connect(self, node: ast.AstNode) -> None:
2023
+ """Grammar rule.
2024
+
2025
+ connect -> atomic_pipe
2026
+ connect -> atomic_pipe connect_op connect
2027
+ connect -> atomic_pipe disconnect_op connect
2028
+ """
2029
+ self.binary_op_helper(node)
2030
+
2031
+ def exit_atomic_pipe(self, node: ast.AstNode) -> None:
2032
+ """Grammar rule.
2033
+
2034
+ atomic_pipe -> atomic_pipe_back
2035
+ atomic_pipe -> atomic_pipe spawn_pipe_op atomic_pipe_back
2036
+ """
2037
+ self.binary_op_helper(node)
2038
+
2039
+ def exit_atomic_pipe_back(self, node: ast.AstNode) -> None:
2040
+ """Grammar rule.
2041
+
2042
+ atomic_pipe -> unpack
2043
+ atomic_pipe -> atomic_pipe_back A_PIPE_BKWD unpack
2044
+ """
2045
+ self.binary_op_helper(node)
2046
+
2047
+ def exit_unpack(self, node: ast.AstNode) -> None:
2048
+ """Grammar rule.
2049
+
2050
+ unpack -> ref
2051
+ unpack -> STAR_MUL atom
2052
+ unpack -> STAR_POW atom
2053
+ """
2054
+ if len(node.kid) == 1:
2055
+ replace_node(node, node.kid[0])
2056
+ else:
2057
+ if node.kid[0].name == Tok.STAR_MUL:
2058
+ replace_node(
2059
+ node,
2060
+ ast.UnpackExpr(
2061
+ target=node.kid[-1],
2062
+ is_dict=False,
2063
+ parent=node.parent,
2064
+ mod_link=self.mod_link,
2065
+ kid=[node.kid[-1]],
2066
+ line=node.line,
2067
+ ),
2068
+ )
2069
+ else:
2070
+ replace_node(
2071
+ node,
2072
+ ast.UnpackExpr(
2073
+ target=node.kid[-1],
2074
+ is_dict=True,
2075
+ parent=node.parent,
2076
+ mod_link=self.mod_link,
2077
+ kid=[node.kid[-1]],
2078
+ line=node.line,
2079
+ ),
2080
+ )
2081
+
2082
+ def exit_ref(self, node: ast.AstNode) -> None:
2083
+ """Grammar rule.
2084
+
2085
+ ref -> ds_call
2086
+ ref -> KW_REF ds_call
2087
+ """
2088
+ if len(node.kid) == 2:
2089
+ node.kid = [node.kid[0], node.kid[1]]
2090
+ replace_node(
2091
+ node,
2092
+ ast.UnaryExpr(
2093
+ op=node.kid[0],
2094
+ operand=node.kid[1],
2095
+ parent=node.parent,
2096
+ mod_link=self.mod_link,
2097
+ kid=node.kid,
2098
+ line=node.line,
2099
+ ),
2100
+ )
2101
+
2102
+ else:
2103
+ self.binary_op_helper(node)
2104
+
2105
+ def exit_ds_call(self, node: ast.AstNode) -> None:
2106
+ """Grammar rule.
2107
+
2108
+ ds_call -> walrus_assign
2109
+ ds_call -> PIPE_FWD walrus_assign
2110
+ ds_call -> spawn_pipe_op walrus_assign
2111
+ """
2112
+ if len(node.kid) == 2:
2113
+ node.kid = [node.kid[0], node.kid[1]]
2114
+ replace_node(
2115
+ node,
2116
+ ast.UnaryExpr(
2117
+ op=node.kid[0],
2118
+ operand=node.kid[1],
2119
+ parent=node.parent,
2120
+ mod_link=self.mod_link,
2121
+ kid=node.kid,
2122
+ line=node.line,
2123
+ ),
2124
+ )
2125
+ else:
2126
+ self.binary_op_helper(node)
2127
+
2128
+ def exit_walrus_op(self, node: ast.AstNode) -> None:
2129
+ """Grammar rule.
2130
+
2131
+ walrus_op -> RSHIFT_EQ
2132
+ walrus_op -> LSHIFT_EQ
2133
+ walrus_op -> BW_NOT_EQ
2134
+ walrus_op -> BW_XOR_EQ
2135
+ walrus_op -> BW_OR_EQ
2136
+ walrus_op -> BW_AND_EQ
2137
+ walrus_op -> MOD_EQ
2138
+ walrus_op -> DIV_EQ
2139
+ walrus_op -> FLOOR_DIV_EQ
2140
+ walrus_op -> MUL_EQ
2141
+ walrus_op -> SUB_EQ
2142
+ walrus_op -> ADD_EQ
2143
+ walrus_op -> WALRUS_EQ
2144
+ """
2145
+ replace_node(node, node.kid[0])
2146
+
2147
+ def exit_cmp_op(self, node: ast.AstNode) -> None:
2148
+ """Grammar rule.
2149
+
2150
+ cmp_op -> KW_ISN
2151
+ cmp_op -> KW_IS
2152
+ cmp_op -> KW_NIN
2153
+ cmp_op -> KW_IN
2154
+ cmp_op -> NE
2155
+ cmp_op -> GTE
2156
+ cmp_op -> LTE
2157
+ cmp_op -> GT
2158
+ cmp_op -> LT
2159
+ cmp_op -> EE
2160
+ """
2161
+ replace_node(node, node.kid[0])
2162
+
2163
+ def exit_atom(self, node: ast.AstNode) -> None:
2164
+ """Grammar rule.
2165
+
2166
+ atom -> edge_op_ref
2167
+ atom -> all_refs
2168
+ atom -> atomic_chain
2169
+ atom -> LPAREN expression RPAREN
2170
+ atom -> atom_collection
2171
+ atom -> atom_literal
2172
+ """
2173
+ if len(node.kid) == 3:
2174
+ node.kid = [node.kid[0], node.kid[1]]
2175
+ replace_node(
2176
+ node,
2177
+ ast.UnaryExpr(
2178
+ op=node.kid[0],
2179
+ operand=node.kid[1],
2180
+ parent=node.parent,
2181
+ mod_link=self.mod_link,
2182
+ kid=node.kid,
2183
+ line=node.line,
2184
+ ),
2185
+ )
2186
+ else:
2187
+ replace_node(node, node.kid[0])
2188
+
2189
+ def exit_atom_literal(self, node: ast.AstNode) -> None:
2190
+ """Grammar rule.
2191
+
2192
+ atom_literal -> builtin_type
2193
+ atom_literal -> NAME
2194
+ atom_literal -> NULL
2195
+ atom_literal -> BOOL
2196
+ atom_literal -> multistring
2197
+ atom_literal -> FLOAT
2198
+ atom_literal -> OCT
2199
+ atom_literal -> BIN
2200
+ atom_literal -> HEX
2201
+ atom_literal -> INT
2202
+ """
2203
+ replace_node(node, node.kid[0])
2204
+
2205
+ def exit_atom_collection(self, node: ast.AstNode) -> None:
2206
+ """Grammar rule.
2207
+
2208
+ atom_collection -> dict_compr
2209
+ atom_collection -> set_compr
2210
+ atom_collection -> gen_compr
2211
+ atom_collection -> list_compr
2212
+ atom_collection -> dict_val
2213
+ atom_collection -> set_val
2214
+ atom_collection -> tuple_val
2215
+ atom_collection -> list_val
2216
+ """
2217
+ replace_node(node, node.kid[0])
2218
+
2219
+ def exit_multistring(self, node: ast.AstNode) -> None:
2220
+ """Grammar rule.
2221
+
2222
+ multistring -> fstring multistring
2223
+ multistring -> STRING multistring
2224
+ multistring -> fstring
2225
+ multistring -> STRING
2226
+ """
2227
+ if len(node.kid) == 2:
2228
+ node.kid = node.kid[0].kid + [node.kid[1]]
2229
+ replace_node(
2230
+ node,
2231
+ ast.MultiString(
2232
+ strings=node.kid,
2233
+ parent=node.parent,
2234
+ mod_link=self.mod_link,
2235
+ kid=node.kid,
2236
+ line=node.line,
2237
+ ),
2238
+ )
2239
+
2240
+ def exit_list_val(self, node: ast.AstNode) -> None:
2241
+ """Grammar rule.
2242
+
2243
+ list_val -> LSQUARE expr_list RSQUARE
2244
+ list_val -> LSQUARE RSQUARE
2245
+ """
2246
+ if len(node.kid) > 2:
2247
+ ret = replace_node(node, node.kid[1])
2248
+ node = ret if ret else node
2249
+ else:
2250
+ node.kid = []
2251
+ replace_node(
2252
+ node,
2253
+ ast.ListVal(
2254
+ values=node.kid,
2255
+ parent=node.parent,
2256
+ mod_link=self.mod_link,
2257
+ kid=node.kid,
2258
+ line=node.line,
2259
+ ),
2260
+ )
2261
+
2262
+ def exit_tuple_val(self, node: ast.AstNode) -> None:
2263
+ """Grammar rule.
2264
+
2265
+ tuple_val -> LPAREN tuple_list RPAREN
2266
+ tuple_val -> LPAREN RPAREN
2267
+ """
2268
+ if len(node.kid) > 2:
2269
+ replace_node(node, node.kid[1])
2270
+ else:
2271
+ node.kid = []
2272
+ replace_node(
2273
+ node,
2274
+ ast.TupleVal(
2275
+ first_expr=None,
2276
+ exprs=None,
2277
+ assigns=None,
2278
+ parent=node.parent,
2279
+ mod_link=self.mod_link,
2280
+ kid=node.kid,
2281
+ line=node.line,
2282
+ ),
2283
+ )
2284
+
2285
+ def exit_set_val(self, node: ast.AstNode) -> None:
2286
+ """Grammar rule.
2287
+
2288
+ set_val -> LBRACE expr_list RBRACE
2289
+ """
2290
+ ret = replace_node(node, node.kid[1])
2291
+ node = ret if ret else node
2292
+ replace_node(
2293
+ node,
2294
+ ast.SetVal(
2295
+ values=node.kid,
2296
+ parent=node.parent,
2297
+ mod_link=self.mod_link,
2298
+ kid=node.kid,
2299
+ line=node.line,
2300
+ ),
2301
+ )
2302
+
2303
+ def exit_expr_list(self, node: ast.AstNode) -> None:
2304
+ """Grammar rule.
2305
+
2306
+ expr_list -> expr_list COMMA expression
2307
+ expr_list -> expression
2308
+ """
2309
+ if len(node.kid) == 3:
2310
+ node.kid = node.kid[0].kid + [node.kid[2]]
2311
+ replace_node(
2312
+ node,
2313
+ ast.ExprList(
2314
+ values=node.kid,
2315
+ parent=node.parent,
2316
+ mod_link=self.mod_link,
2317
+ kid=node.kid,
2318
+ line=node.line,
2319
+ ),
2320
+ )
2321
+
2322
+ def exit_tuple_list(self, node: ast.AstNode) -> None:
2323
+ """Grammar rule.
2324
+
2325
+ tuple_list -> expression COMMA expr_list COMMA assignment_list
2326
+ tuple_list -> expression COMMA assignment_list
2327
+ tuple_list -> assignment_list
2328
+ tuple_list -> expression COMMA expr_list
2329
+ tuple_list -> expression COMMA
2330
+ """
2331
+ first_expr = None
2332
+ exprs = None
2333
+ assigns = None
2334
+ if len(node.kid) == 1:
2335
+ assigns = node.kid[0]
2336
+ elif len(node.kid) == 2:
2337
+ del node.kid[1]
2338
+ first_expr = node.kid[0]
2339
+ elif len(node.kid) == 3:
2340
+ del node.kid[1]
2341
+ first_expr = node.kid[0]
2342
+ if isinstance(node.kid[1], ast.ExprList):
2343
+ exprs = node.kid[1]
2344
+ else:
2345
+ assigns = node.kid[1]
2346
+ elif len(node.kid) == 5:
2347
+ first_expr = node.kid[0]
2348
+ exprs = node.kid[2]
2349
+ assigns = node.kid[4]
2350
+ del node.kid[3]
2351
+ del node.kid[1]
2352
+ replace_node(
2353
+ node,
2354
+ ast.TupleVal(
2355
+ first_expr=first_expr,
2356
+ exprs=exprs,
2357
+ assigns=assigns,
2358
+ parent=node.parent,
2359
+ mod_link=self.mod_link,
2360
+ kid=node.kid,
2361
+ line=node.line,
2362
+ ),
2363
+ )
2364
+
2365
+ def exit_dict_val(self, node: ast.AstNode) -> None:
2366
+ """Grammar rule.
2367
+
2368
+ dict_val -> LBRACE kv_pairs RBRACE
2369
+ dict_val -> LBRACE RBRACE
2370
+ """
2371
+ if len(node.kid) > 3:
2372
+ node.kid = node.kid[:-3]
2373
+ else:
2374
+ node.kid = []
2375
+ replace_node(
2376
+ node,
2377
+ ast.DictVal(
2378
+ kv_pairs=node.kid,
2379
+ parent=node.parent,
2380
+ mod_link=self.mod_link,
2381
+ kid=node.kid,
2382
+ line=node.line,
2383
+ ),
2384
+ )
2385
+
2386
+ def exit_list_compr(self, node: ast.AstNode) -> None:
2387
+ """Grammar rule.
2388
+
2389
+ list_compr -> LSQUARE inner_compr RSQUARE
2390
+ """
2391
+ ret = replace_node(node, node.kid[1])
2392
+ if type(ret) == ast.InnerCompr:
2393
+ ret.is_list = True
2394
+ else:
2395
+ self.ice("Expected InnerCompr")
2396
+
2397
+ def exit_gen_compr(self, node: ast.AstNode) -> None:
2398
+ """Grammar rule.
2399
+
2400
+ gen_compr -> LPAREN inner_compr RPAREN
2401
+ """
2402
+ ret = replace_node(node, node.kid[1])
2403
+ if type(ret) == ast.InnerCompr:
2404
+ ret.is_gen = True
2405
+ else:
2406
+ self.ice("Expected InnerCompr")
2407
+
2408
+ def exit_set_compr(self, node: ast.AstNode) -> None:
2409
+ """Grammar rule.
2410
+
2411
+ set_compr -> LBRACE inner_compr RBRACE
2412
+ """
2413
+ ret = replace_node(node, node.kid[1])
2414
+ if type(ret) == ast.InnerCompr:
2415
+ ret.is_set = True
2416
+ else:
2417
+ self.ice("Expected InnerCompr")
2418
+
2419
+ def exit_inner_compr(self, node: ast.AstNode) -> None:
2420
+ """Grammar rule.
2421
+
2422
+ inner_compr -> expression KW_FOR NAME KW_IN walrus_assign KW_IF expression
2423
+ inner_compr -> expression KW_FOR NAME KW_IN walrus_assign
2424
+ """
2425
+ meta = {
2426
+ "out_expr": node.kid[0],
2427
+ "name": node.kid[2],
2428
+ "collection": node.kid[4],
2429
+ "conditional": None,
2430
+ }
2431
+ if node.kid[-2].name == Tok.KW_IF:
2432
+ meta["conditional"] = node.kid[-1]
2433
+ if len(node.kid) == 5:
2434
+ node.kid = [node.kid[0], node.kid[2], node.kid[4]]
2435
+ elif len(node.kid) == 7:
2436
+ node.kid = [node.kid[0], node.kid[2], node.kid[4], node.kid[6]]
2437
+ replace_node(
2438
+ node,
2439
+ ast.InnerCompr(
2440
+ out_expr=meta["out_expr"],
2441
+ name=meta["name"],
2442
+ collection=meta["collection"],
2443
+ conditional=meta["conditional"],
2444
+ is_list=False,
2445
+ is_gen=False,
2446
+ is_set=False,
2447
+ parent=node.parent,
2448
+ mod_link=self.mod_link,
2449
+ kid=node.kid,
2450
+ line=node.line,
2451
+ ),
2452
+ )
2453
+
2454
+ def exit_dict_compr(self, node: ast.AstNode) -> None:
2455
+ """Grammar rule.
2456
+
2457
+ dict_compr -> LBRACE expression COLON expression KW_FOR NAME COMMA NAME KW_IN walrus_assign KW_IF expression RBRACE # noqa
2458
+ dict_compr -> LBRACE expression COLON expression KW_FOR NAME COMMA NAME KW_IN walrus_assign RBRACE
2459
+ dict_compr -> LBRACE expression COLON expression KW_FOR NAME KW_IN walrus_assign KW_IF expression RBRACE
2460
+ dict_compr -> LBRACE expression COLON expression KW_FOR NAME KW_IN walrus_assign RBRACE
2461
+ """
2462
+ meta = {
2463
+ "outk_expr": node.kid[1],
2464
+ "outv_expr": node.kid[3],
2465
+ "k_name": node.kid[5],
2466
+ "conditional": None,
2467
+ }
2468
+ if node.kid[6].name == Tok.COMMA:
2469
+ meta["v_name"] = node.kid[7]
2470
+ meta["collection"] = node.kid[9]
2471
+ else:
2472
+ meta["v_name"] = None
2473
+ meta["collection"] = node.kid[7]
2474
+ if node.kid[-3].name == Tok.KW_IF:
2475
+ meta["conditional"] = node.kid[-2]
2476
+ if len(node.kid) == 9:
2477
+ node.kid = [node.kid[1], node.kid[3], node.kid[5], node.kid[7]]
2478
+ elif len(node.kid) == 11:
2479
+ node.kid = [node.kid[1], node.kid[3], node.kid[5], node.kid[7], node.kid[9]]
2480
+ elif len(node.kid) == 13:
2481
+ node.kid = [
2482
+ node.kid[1],
2483
+ node.kid[3],
2484
+ node.kid[5],
2485
+ node.kid[7],
2486
+ node.kid[9],
2487
+ node.kid[11],
2488
+ ]
2489
+ replace_node(
2490
+ node,
2491
+ ast.DictCompr(
2492
+ outk_expr=meta["outk_expr"],
2493
+ outv_expr=meta["outv_expr"],
2494
+ k_name=meta["k_name"],
2495
+ v_name=meta["v_name"],
2496
+ collection=meta["collection"],
2497
+ conditional=meta["conditional"],
2498
+ parent=node.parent,
2499
+ mod_link=self.mod_link,
2500
+ kid=node.kid,
2501
+ line=node.line,
2502
+ ),
2503
+ )
2504
+
2505
+ def exit_kv_pairs(self, node: ast.AstNode) -> None:
2506
+ """Grammar rule.
2507
+
2508
+ kv_pairs -> kv_pairs COMMA expression COLON expression
2509
+ kv_pairs -> expression COLON expression
2510
+ """
2511
+ node = ast.KVPair(
2512
+ key=node.kid[-3],
2513
+ value=node.kid[-1],
2514
+ parent=node.parent,
2515
+ mod_link=self.mod_link,
2516
+ kid=node.kid,
2517
+ line=node.line,
2518
+ )
2519
+ if len(node.kid) == 3:
2520
+ if node.parent is not None:
2521
+ node.parent.kid = [node] + node.parent.kid
2522
+ node.kid = [node.kid[0], node.kid[2]]
2523
+ else:
2524
+ if node.parent is not None:
2525
+ node.parent.kid = [node] + node.kid[:-5] + node.parent.kid
2526
+ node.kid = [node.kid[-3], node.kid[-1]]
2527
+
2528
+ def exit_atomic_chain(self, node: ast.AstNode) -> None:
2529
+ """Grammar rule.
2530
+
2531
+ atomic_chain -> atomic_call
2532
+ atomic_chain -> atomic_chain_unsafe
2533
+ atomic_chain -> atomic_chain_safe
2534
+ """
2535
+ replace_node(node, node.kid[0])
2536
+
2537
+ def exit_atomic_chain_unsafe(self, node: ast.AstNode) -> None:
2538
+ """Grammar rule.
2539
+
2540
+ atomic_chain_unsafe -> atom filter_compr
2541
+ atomic_chain_unsafe -> atom arch_ref
2542
+ atomic_chain_unsafe -> atom index_slice
2543
+ atomic_chain_unsafe -> atom DOT NAME
2544
+ atomic_chain_unsafe -> atom DOT_FWD NAME
2545
+ atomic_chain_unsafe -> atom DOT_BKWD NAME
2546
+ """
2547
+ target = node.kid[0]
2548
+ right = node.kid[-1]
2549
+ if type(node.kid[1]) == ast.Token and node.kid[1].name == Tok.DOT_FWD:
2550
+ target = node.kid[-1]
2551
+ right = node.kid[0]
2552
+ if len(node.kid) == 3:
2553
+ del node.kid[1]
2554
+ replace_node(
2555
+ node,
2556
+ ast.AtomTrailer(
2557
+ target=target,
2558
+ right=right,
2559
+ null_ok=False,
2560
+ parent=node.parent,
2561
+ mod_link=self.mod_link,
2562
+ kid=node.kid,
2563
+ line=node.line,
2564
+ ),
2565
+ )
2566
+
2567
+ def exit_atomic_chain_safe(self, node: ast.AstNode) -> None:
2568
+ """Grammar rule.
2569
+
2570
+ atomic_chain_safe -> atom NULL_OK filter_compr
2571
+ atomic_chain_safe -> atom NULL_OK arch_ref
2572
+ atomic_chain_safe -> atom NULL_OK index_slice
2573
+ atomic_chain_safe -> atom NULL_OK DOT NAME
2574
+ atomic_chain_safe -> atom NULL_OK DOT_FWD NAME
2575
+ atomic_chain_safe -> atom NULL_OK DOT_BKWD NAME
2576
+ """
2577
+ target = node.kid[0]
2578
+ right = node.kid[-1]
2579
+ if type(node.kid[1]) == ast.Token and node.kid[1].name == Tok.DOT_FWD:
2580
+ target = node.kid[-1]
2581
+ right = node.kid[0]
2582
+ if len(node.kid) == 3:
2583
+ del node.kid[1]
2584
+ replace_node(
2585
+ node,
2586
+ ast.AtomTrailer(
2587
+ target=target,
2588
+ right=right,
2589
+ null_ok=True,
2590
+ parent=node.parent,
2591
+ mod_link=self.mod_link,
2592
+ kid=node.kid,
2593
+ line=node.line,
2594
+ ),
2595
+ )
2596
+
2597
+ def exit_atomic_call(self, node: ast.AstNode) -> None:
2598
+ """Grammar rule.
2599
+
2600
+ atomic_call -> atom func_call_tail
2601
+ """
2602
+ replace_node(
2603
+ node,
2604
+ ast.FuncCall(
2605
+ target=node.kid[0],
2606
+ params=node.kid[1],
2607
+ parent=node.parent,
2608
+ mod_link=self.mod_link,
2609
+ kid=node.kid,
2610
+ line=node.line,
2611
+ ),
2612
+ )
2613
+
2614
+ def exit_func_call_tail(self, node: ast.AstNode) -> None:
2615
+ """Grammar rule.
2616
+
2617
+ func_call_tail -> LPAREN param_list RPAREN
2618
+ func_call_tail -> LPAREN RPAREN
2619
+ """
2620
+ if len(node.kid) == 2:
2621
+ replace_node(node, None)
2622
+ else:
2623
+ replace_node(node, node.kid[1])
2624
+
2625
+ def exit_param_list(self, node: ast.AstNode) -> None:
2626
+ """Grammar rule.
2627
+
2628
+ param_list -> expr_list COMMA assignment_list
2629
+ param_list -> assignment_list
2630
+ param_list -> expr_list
2631
+ """
2632
+ if len(node.kid) == 1:
2633
+ if type(node.kid[0]) == ast.ExprList:
2634
+ replace_node(
2635
+ node,
2636
+ ast.ParamList(
2637
+ p_args=node.kid[0],
2638
+ p_kwargs=None,
2639
+ parent=node.parent,
2640
+ mod_link=self.mod_link,
2641
+ kid=node.kid,
2642
+ line=node.line,
2643
+ ),
2644
+ )
2645
+ else:
2646
+ replace_node(
2647
+ node,
2648
+ ast.ParamList(
2649
+ p_args=None,
2650
+ p_kwargs=node.kid[0],
2651
+ parent=node.parent,
2652
+ mod_link=self.mod_link,
2653
+ kid=node.kid,
2654
+ line=node.line,
2655
+ ),
2656
+ )
2657
+ else:
2658
+ node.kid = [node.kid[0], node.kid[2]]
2659
+ replace_node(
2660
+ node,
2661
+ ast.ParamList(
2662
+ p_args=node.kid[0],
2663
+ p_kwargs=node.kid[1],
2664
+ parent=node.parent,
2665
+ mod_link=self.mod_link,
2666
+ kid=node.kid,
2667
+ line=node.line,
2668
+ ),
2669
+ )
2670
+
2671
+ def exit_assignment_list(self, node: ast.AstNode) -> None:
2672
+ """Grammar rule.
2673
+
2674
+ assignment_list -> assignment_list COMMA assignment
2675
+ assignment_list -> assignment
2676
+ """
2677
+ if len(node.kid) == 3:
2678
+ node.kid = node.kid[0].kid + [node.kid[2]]
2679
+ replace_node(
2680
+ node,
2681
+ ast.AssignmentList(
2682
+ values=node.kid,
2683
+ parent=node.parent,
2684
+ mod_link=self.mod_link,
2685
+ kid=node.kid,
2686
+ line=node.line,
2687
+ ),
2688
+ )
2689
+
2690
+ def exit_index_slice(self, node: ast.AstNode) -> None:
2691
+ """Grammar rule.
2692
+
2693
+ index_slice -> LSQUARE COLON expression RSQUARE
2694
+ index_slice -> LSQUARE expression COLON RSQUARE
2695
+ index_slice -> LSQUARE expression COLON expression RSQUARE
2696
+ index_slice -> LSQUARE expression RSQUARE
2697
+ """
2698
+ if len(node.kid) == 3:
2699
+ node.kid = [node.kid[1]]
2700
+ replace_node(
2701
+ node,
2702
+ ast.IndexSlice(
2703
+ start=node.kid[0],
2704
+ stop=None,
2705
+ is_range=False,
2706
+ parent=node.parent,
2707
+ mod_link=self.mod_link,
2708
+ kid=node.kid,
2709
+ line=node.line,
2710
+ ),
2711
+ )
2712
+ elif len(node.kid) == 4:
2713
+ start = node.kid[1] if type(node.kid[1]) != ast.Token else None
2714
+ stop = node.kid[2] if type(node.kid[2]) != ast.Token else None
2715
+ node.kid = [start if start else stop]
2716
+ if not isinstance(node.kid[0], ast.AstNode):
2717
+ self.ice("Somethings wrong with the parser.")
2718
+ else:
2719
+ replace_node(
2720
+ node,
2721
+ ast.IndexSlice(
2722
+ start=start,
2723
+ stop=stop,
2724
+ is_range=True,
2725
+ parent=node.parent,
2726
+ mod_link=self.mod_link,
2727
+ kid=[node.kid[0]],
2728
+ line=node.line,
2729
+ ),
2730
+ )
2731
+ else:
2732
+ node.kid = [node.kid[1], node.kid[3]]
2733
+ replace_node(
2734
+ node,
2735
+ ast.IndexSlice(
2736
+ start=node.kid[0],
2737
+ stop=node.kid[1],
2738
+ is_range=True,
2739
+ parent=node.parent,
2740
+ mod_link=self.mod_link,
2741
+ kid=node.kid,
2742
+ line=node.line,
2743
+ ),
2744
+ )
2745
+
2746
+ def exit_global_ref(self, node: ast.AstNode) -> None:
2747
+ """Grammar rule.
2748
+
2749
+ global_ref -> GLOBAL_OP NAME
2750
+ """
2751
+ replace_node(
2752
+ node,
2753
+ ast.ArchRef(
2754
+ name=node.kid[-1],
2755
+ arch=node.kid[0],
2756
+ parent=node.parent,
2757
+ mod_link=self.mod_link,
2758
+ kid=node.kid,
2759
+ line=node.line,
2760
+ ),
2761
+ )
2762
+
2763
+ def exit_here_ref(self, node: ast.AstNode) -> None:
2764
+ """Grammar rule.
2765
+
2766
+ here_ref -> HERE_OP
2767
+ """
2768
+ replace_node(
2769
+ node,
2770
+ ast.SpecialVarRef(
2771
+ var=node.kid[0],
2772
+ parent=node.parent,
2773
+ mod_link=self.mod_link,
2774
+ kid=node.kid,
2775
+ line=node.line,
2776
+ ),
2777
+ )
2778
+
2779
+ def exit_self_ref(self, node: ast.AstNode) -> None:
2780
+ """Grammar rule.
2781
+
2782
+ self_ref -> SELF_OP
2783
+ """
2784
+ replace_node(
2785
+ node,
2786
+ ast.SpecialVarRef(
2787
+ var=node.kid[0],
2788
+ parent=node.parent,
2789
+ mod_link=self.mod_link,
2790
+ kid=node.kid,
2791
+ line=node.line,
2792
+ ),
2793
+ )
2794
+
2795
+ def exit_super_ref(self, node: ast.AstNode) -> None:
2796
+ """Grammar rule.
2797
+
2798
+ super_ref -> SUPER_OP
2799
+ """
2800
+ replace_node(
2801
+ node,
2802
+ ast.SpecialVarRef(
2803
+ var=node.kid[0],
2804
+ parent=node.parent,
2805
+ mod_link=self.mod_link,
2806
+ kid=node.kid,
2807
+ line=node.line,
2808
+ ),
2809
+ )
2810
+
2811
+ def exit_root_ref(self, node: ast.AstNode) -> None:
2812
+ """Grammar rule.
2813
+
2814
+ root_ref -> ROOT_OP
2815
+ """
2816
+ replace_node(
2817
+ node,
2818
+ ast.SpecialVarRef(
2819
+ var=node.kid[0],
2820
+ parent=node.parent,
2821
+ mod_link=self.mod_link,
2822
+ kid=node.kid,
2823
+ line=node.line,
2824
+ ),
2825
+ )
2826
+
2827
+ def exit_arch_ref(self, node: ast.AstNode) -> None:
2828
+ """Grammar rule.
2829
+
2830
+ arch_ref -> ability_ref
2831
+ arch_ref -> object_ref
2832
+ arch_ref -> walker_ref
2833
+ arch_ref -> edge_ref
2834
+ arch_ref -> node_ref
2835
+ """
2836
+ replace_node(node, node.kid[0])
2837
+
2838
+ def exit_strict_arch_ref(self, node: ast.AstNode) -> None:
2839
+ """Grammar rule.
2840
+
2841
+ strict_arch_ref -> object_ref
2842
+ strict_arch_ref -> walker_ref
2843
+ strict_arch_ref -> edge_ref
2844
+ strict_arch_ref -> node_ref
2845
+ """
2846
+ replace_node(node, node.kid[0])
2847
+
2848
+ def exit_node_ref(self, node: ast.AstNode) -> None:
2849
+ """Grammar rule.
2850
+
2851
+ node_ref -> NODE_OP NAME
2852
+ """
2853
+ replace_node(
2854
+ node,
2855
+ ast.ArchRef(
2856
+ name=node.kid[-1],
2857
+ arch=node.kid[0],
2858
+ parent=node.parent,
2859
+ mod_link=self.mod_link,
2860
+ kid=node.kid,
2861
+ line=node.line,
2862
+ ),
2863
+ )
2864
+
2865
+ def exit_edge_ref(self, node: ast.AstNode) -> None:
2866
+ """Grammar rule.
2867
+
2868
+ edge_ref -> EDGE_OP NAME
2869
+ """
2870
+ replace_node(
2871
+ node,
2872
+ ast.ArchRef(
2873
+ name=node.kid[-1],
2874
+ arch=node.kid[0],
2875
+ parent=node.parent,
2876
+ mod_link=self.mod_link,
2877
+ kid=node.kid,
2878
+ line=node.line,
2879
+ ),
2880
+ )
2881
+
2882
+ def exit_walker_ref(self, node: ast.AstNode) -> None:
2883
+ """Grammar rule.
2884
+
2885
+ walker_ref -> WALKER_OP NAME
2886
+ """
2887
+ replace_node(
2888
+ node,
2889
+ ast.ArchRef(
2890
+ name=node.kid[-1],
2891
+ arch=node.kid[0],
2892
+ parent=node.parent,
2893
+ mod_link=self.mod_link,
2894
+ kid=node.kid,
2895
+ line=node.line,
2896
+ ),
2897
+ )
2898
+
2899
+ def exit_object_ref(self, node: ast.AstNode) -> None:
2900
+ """Grammar rule.
2901
+
2902
+ object_ref -> OBJECT_OP NAME
2903
+ """
2904
+ replace_node(
2905
+ node,
2906
+ ast.ArchRef(
2907
+ name=node.kid[-1],
2908
+ arch=node.kid[0],
2909
+ parent=node.parent,
2910
+ mod_link=self.mod_link,
2911
+ kid=node.kid,
2912
+ line=node.line,
2913
+ ),
2914
+ )
2915
+
2916
+ def exit_enum_ref(self, node: ast.AstNode) -> None:
2917
+ """Grammar rule.
2918
+
2919
+ object_ref -> ENUM_OP NAME
2920
+ """
2921
+ replace_node(
2922
+ node,
2923
+ ast.ArchRef(
2924
+ name=node.kid[-1],
2925
+ arch=node.kid[0],
2926
+ parent=node.parent,
2927
+ mod_link=self.mod_link,
2928
+ kid=node.kid,
2929
+ line=node.line,
2930
+ ),
2931
+ )
2932
+
2933
+ def exit_ability_ref(self, node: ast.AstNode) -> None:
2934
+ """Grammar rule.
2935
+
2936
+ ability_ref -> ABILITY_OP NAME
2937
+ """
2938
+ replace_node(
2939
+ node,
2940
+ ast.ArchRef(
2941
+ name=node.kid[-1],
2942
+ arch=node.kid[0],
2943
+ parent=node.parent,
2944
+ mod_link=self.mod_link,
2945
+ kid=node.kid,
2946
+ line=node.line,
2947
+ ),
2948
+ )
2949
+
2950
+ def exit_edge_op_ref(self, node: ast.AstNode) -> None:
2951
+ """Grammar rule.
2952
+
2953
+ edge_op_ref -> edge_any
2954
+ edge_op_ref -> edge_from
2955
+ edge_op_ref -> edge_to
2956
+ """
2957
+ replace_node(node, node.kid[0])
2958
+
2959
+ def exit_edge_to(self, node: ast.AstNode) -> None:
2960
+ """Grammar rule.
2961
+
2962
+ edge_to -> ARROW_R_p1 expression COLON filter_compare_list ARROW_R_p2
2963
+ edge_to -> ARROW_R_p1 expression ARROW_R_p2
2964
+ edge_to -> ARROW_R
2965
+ """
2966
+ ftype = node.kid[1] if len(node.kid) >= 3 else None
2967
+ fcond = node.kid[3] if len(node.kid) >= 5 else None
2968
+ replace_node(
2969
+ node,
2970
+ ast.EdgeOpRef(
2971
+ filter_type=ftype,
2972
+ filter_cond=fcond,
2973
+ edge_dir=EdgeDir.OUT,
2974
+ parent=node.parent,
2975
+ mod_link=self.mod_link,
2976
+ kid=node.kid,
2977
+ line=node.line,
2978
+ ),
2979
+ )
2980
+
2981
+ def exit_edge_from(self, node: ast.AstNode) -> None:
2982
+ """Grammar rule.
2983
+
2984
+ edge_from -> ARROW_L_p1 expression COLON filter_compare_list ARROW_L_p2
2985
+ edge_from -> ARROW_L_p1 expression ARROW_L_p2
2986
+ edge_from -> ARROW_L
2987
+ """
2988
+ ftype = node.kid[1] if len(node.kid) >= 3 else None
2989
+ fcond = node.kid[3] if len(node.kid) >= 5 else None
2990
+ replace_node(
2991
+ node,
2992
+ ast.EdgeOpRef(
2993
+ filter_type=ftype,
2994
+ filter_cond=fcond,
2995
+ edge_dir=EdgeDir.IN,
2996
+ parent=node.parent,
2997
+ mod_link=self.mod_link,
2998
+ kid=node.kid,
2999
+ line=node.line,
3000
+ ),
3001
+ )
3002
+
3003
+ def exit_edge_any(self, node: ast.AstNode) -> None:
3004
+ """Grammar rule.
3005
+
3006
+ edge_any -> ARROW_L_p1 expression COLON filter_compare_list ARROW_R_p2
3007
+ edge_any -> ARROW_L_p1 expression ARROW_R_p2
3008
+ edge_any -> ARROW_BI
3009
+ """
3010
+ ftype = node.kid[1] if len(node.kid) >= 3 else None
3011
+ fcond = node.kid[3] if len(node.kid) >= 5 else None
3012
+ replace_node(
3013
+ node,
3014
+ ast.EdgeOpRef(
3015
+ filter_type=ftype,
3016
+ filter_cond=fcond,
3017
+ edge_dir=EdgeDir.ANY,
3018
+ parent=node.parent,
3019
+ mod_link=self.mod_link,
3020
+ kid=node.kid,
3021
+ line=node.line,
3022
+ ),
3023
+ )
3024
+
3025
+ def exit_connect_op(self, node: ast.AstNode) -> None:
3026
+ """Grammar rule.
3027
+
3028
+ connect_op -> connect_from
3029
+ connect_op -> connect_to
3030
+ """
3031
+ replace_node(node, node.kid[0])
3032
+
3033
+ def exit_disconnect_op(self, node: ast.AstNode) -> None:
3034
+ """Grammar rule.
3035
+
3036
+ disconnect_op -> NOT edge_op_ref
3037
+ """
3038
+ ret = replace_node(node, node.kid[1])
3039
+ node = ret if ret else node
3040
+ if type(node) == ast.EdgeOpRef:
3041
+ replace_node(
3042
+ node,
3043
+ ast.DisconnectOp(
3044
+ filter_type=node.filter_type,
3045
+ filter_cond=node.filter_cond,
3046
+ edge_dir=node.edge_dir,
3047
+ parent=node.parent,
3048
+ mod_link=self.mod_link,
3049
+ kid=node.kid,
3050
+ line=node.line,
3051
+ ),
3052
+ )
3053
+
3054
+ def exit_connect_to(self, node: ast.AstNode) -> None:
3055
+ """Grammar rule.
3056
+
3057
+ connect_to -> CARROW_R_p1 expression COLON assignment_list CARROW_R_p2
3058
+ connect_to -> CARROW_R_p1 expression CARROW_R_p2
3059
+ connect_to -> CARROW_R
3060
+ """
3061
+ ctype = node.kid[1] if len(node.kid) >= 3 else None
3062
+ cassig = node.kid[3] if len(node.kid) >= 5 else None
3063
+ replace_node(
3064
+ node,
3065
+ ast.ConnectOp(
3066
+ conn_type=ctype,
3067
+ conn_assign=cassig,
3068
+ edge_dir=EdgeDir.OUT,
3069
+ parent=node.parent,
3070
+ mod_link=self.mod_link,
3071
+ kid=node.kid,
3072
+ line=node.line,
3073
+ ),
3074
+ )
3075
+
3076
+ def exit_connect_from(self, node: ast.AstNode) -> None:
3077
+ """Grammar rule.
3078
+
3079
+ connect_from -> CARROW_L_p1 expression COLON assignment_list CARROW_L_p2
3080
+ connect_from -> CARROW_L_p1 expression CARROW_L_p2
3081
+ connect_from -> CARROW_L
3082
+ """
3083
+ ctype = node.kid[1] if len(node.kid) >= 3 else None
3084
+ cassig = node.kid[3] if len(node.kid) >= 5 else None
3085
+ replace_node(
3086
+ node,
3087
+ ast.ConnectOp(
3088
+ conn_type=ctype,
3089
+ conn_assign=cassig,
3090
+ edge_dir=EdgeDir.IN,
3091
+ parent=node.parent,
3092
+ mod_link=self.mod_link,
3093
+ kid=node.kid,
3094
+ line=node.line,
3095
+ ),
3096
+ )
3097
+
3098
+ def exit_filter_compr(self, node: ast.AstNode) -> None:
3099
+ """Grammar rule.
3100
+
3101
+ filter_compr -> LPAREN EQ filter_compare_list RPAREN
3102
+ """
3103
+ node.kid = node.kid[:-4]
3104
+ replace_node(
3105
+ node,
3106
+ ast.FilterCompr(
3107
+ compares=node.kid,
3108
+ parent=node.parent,
3109
+ mod_link=self.mod_link,
3110
+ kid=node.kid,
3111
+ line=node.line,
3112
+ ),
3113
+ )
3114
+
3115
+ def exit_filter_compare_list(self, node: ast.AstNode) -> None:
3116
+ """Grammar rule.
3117
+
3118
+ filter_compare_list -> filter_compare_list COMMA NAME cmp_op expression
3119
+ filter_compare_list -> NAME cmp_op expression
3120
+ """
3121
+ if len(node.kid) == 3:
3122
+ if node.parent is not None:
3123
+ node.parent.kid = [node] + node.parent.kid
3124
+ else:
3125
+ if node.parent is not None:
3126
+ node.parent.kid = [node] + node.kid[:-5] + node.parent.kid
3127
+ node.kid = [node.kid[-3], node.kid[-2], node.kid[-1]]
3128
+ replace_node(
3129
+ node,
3130
+ ast.BinaryExpr(
3131
+ op=node.kid[1],
3132
+ left=node.kid[0],
3133
+ right=node.kid[2],
3134
+ parent=node.parent,
3135
+ mod_link=self.mod_link,
3136
+ kid=node.kid,
3137
+ line=node.line,
3138
+ ),
3139
+ )
3140
+
3141
+ def exit_empty(self, node: ast.AstNode) -> None:
3142
+ """Grammar rule.
3143
+
3144
+ empty -> <empty>
3145
+ """
3146
+ replace_node(node, None)
3147
+
3148
+ # FString Parser Rules
3149
+ # --------------------
3150
+
3151
+ def exit_fstring(self, node: ast.AstNode) -> None:
3152
+ """Grammar rule.
3153
+
3154
+ fstring -> STRING_START fstr_parts STRING_END
3155
+ """
3156
+ replace_node(node, node.kid[1])
3157
+
3158
+ def exit_fstr_parts(self, node: ast.AstNode) -> None:
3159
+ """Grammar rule.
3160
+
3161
+ fstr_parts -> fstring
3162
+ fstr_parts -> expression
3163
+ fstr_parts -> PIECE
3164
+ fstr_parts -> fstr_parts PIECE
3165
+ fstr_parts -> fstr_parts expression
3166
+ """
3167
+ if len(node.kid) == 2:
3168
+ node.kid = node.kid[0].kid + [node.kid[1]]
3169
+ else:
3170
+ node.kid = [node.kid[0]]
3171
+ replace_node(
3172
+ node,
3173
+ ast.FString(
3174
+ parts=node.kid,
3175
+ parent=node.parent,
3176
+ mod_link=self.mod_link,
3177
+ kid=node.kid,
3178
+ line=node.line,
3179
+ ),
3180
+ )
3181
+
3182
+ def exit_fstr_expr(self, node: ast.AstNode) -> None:
3183
+ """Grammar rule.
3184
+
3185
+ Should not exist; replaced with expression
3186
+ """
3187
+ self.error("fstr_expr should not exist in parse tree; replaced with expression")
3188
+ raise ValueError(
3189
+ "fstr_expr should not exist in parse tree; replaced with expression"
3190
+ )