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.
- jaclang/__init__.py +4 -0
- jaclang/cli/__init__.py +7 -0
- jaclang/cli/cli.jac +46 -0
- jaclang/cli/cmds.jac +14 -0
- jaclang/cli/impl/__init__.py +1 -0
- jaclang/cli/impl/cli_impl.jac +93 -0
- jaclang/cli/impl/cmds_impl.jac +26 -0
- jaclang/core/__init__.py +12 -0
- jaclang/core/impl/__init__.py +1 -0
- jaclang/core/impl/arch_impl.jac +112 -0
- jaclang/core/impl/element_impl.jac +95 -0
- jaclang/core/impl/exec_ctx_impl.jac +17 -0
- jaclang/core/impl/memory_impl.jac +57 -0
- jaclang/core/primitives.jac +104 -0
- jaclang/jac/__init__.py +1 -0
- jaclang/jac/absyntree.py +1787 -0
- jaclang/jac/constant.py +46 -0
- jaclang/jac/importer.py +130 -0
- jaclang/jac/lexer.py +538 -0
- jaclang/jac/parser.py +1474 -0
- jaclang/jac/passes/__init__.py +5 -0
- jaclang/jac/passes/blue/__init__.py +25 -0
- jaclang/jac/passes/blue/ast_build_pass.py +3190 -0
- jaclang/jac/passes/blue/blue_pygen_pass.py +1335 -0
- jaclang/jac/passes/blue/decl_def_match_pass.py +278 -0
- jaclang/jac/passes/blue/import_pass.py +75 -0
- jaclang/jac/passes/blue/sub_node_tab_pass.py +30 -0
- jaclang/jac/passes/blue/tests/__init__.py +1 -0
- jaclang/jac/passes/blue/tests/test_ast_build_pass.py +61 -0
- jaclang/jac/passes/blue/tests/test_blue_pygen_pass.py +117 -0
- jaclang/jac/passes/blue/tests/test_decl_def_match_pass.py +43 -0
- jaclang/jac/passes/blue/tests/test_import_pass.py +18 -0
- jaclang/jac/passes/blue/tests/test_sub_node_pass.py +26 -0
- jaclang/jac/passes/blue/tests/test_type_analyze_pass.py +53 -0
- jaclang/jac/passes/blue/type_analyze_pass.py +731 -0
- jaclang/jac/passes/ir_pass.py +154 -0
- jaclang/jac/passes/purple/__init__.py +17 -0
- jaclang/jac/passes/purple/impl/__init__.py +1 -0
- jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac +289 -0
- jaclang/jac/passes/purple/purple_pygen_pass.jac +35 -0
- jaclang/jac/sym_table.py +127 -0
- jaclang/jac/tests/__init__.py +1 -0
- jaclang/jac/tests/fixtures/__init__.py +1 -0
- jaclang/jac/tests/fixtures/activity.py +10 -0
- jaclang/jac/tests/fixtures/fam.jac +68 -0
- jaclang/jac/tests/fixtures/hello_world.jac +5 -0
- jaclang/jac/tests/fixtures/lexer_fam.jac +61 -0
- jaclang/jac/tests/fixtures/stuff.jac +6 -0
- jaclang/jac/tests/test_importer.py +24 -0
- jaclang/jac/tests/test_lexer.py +57 -0
- jaclang/jac/tests/test_parser.py +50 -0
- jaclang/jac/tests/test_utils.py +12 -0
- jaclang/jac/transform.py +63 -0
- jaclang/jac/transpiler.py +69 -0
- jaclang/jac/utils.py +120 -0
- jaclang/utils/__init__.py +1 -0
- jaclang/utils/fstring_parser.py +73 -0
- jaclang/utils/log.py +9 -0
- jaclang/utils/sly/__init__.py +6 -0
- jaclang/utils/sly/docparse.py +62 -0
- jaclang/utils/sly/lex.py +510 -0
- jaclang/utils/sly/yacc.py +2398 -0
- jaclang/utils/test.py +81 -0
- jaclang/utils/tests/__init__.py +1 -0
- jaclang/utils/tests/test_fstring_parser.py +55 -0
- jaclang-0.0.3.dist-info/METADATA +12 -0
- jaclang-0.0.3.dist-info/RECORD +70 -0
- {jaclang-0.0.1.dist-info → jaclang-0.0.3.dist-info}/WHEEL +1 -1
- jaclang-0.0.3.dist-info/entry_points.txt +3 -0
- jaclang-0.0.3.dist-info/top_level.txt +1 -0
- jaclang-0.0.1.dist-info/METADATA +0 -7
- jaclang-0.0.1.dist-info/RECORD +0 -4
- 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
|
+
)
|