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
jaclang/jac/lexer.py
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
"""Lexer for Jac language."""
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Generator
|
|
4
|
+
|
|
5
|
+
from jaclang.jac.transform import ABCLexerMeta, Transform
|
|
6
|
+
from jaclang.utils.sly.lex import Lexer, Token
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class JacLexer(Lexer, Transform, metaclass=ABCLexerMeta):
|
|
10
|
+
"""Jac Lexer."""
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self, mod_path: str, input_ir: str, base_path: str = "", prior: Transform = None
|
|
14
|
+
) -> None:
|
|
15
|
+
"""Initialize lexer."""
|
|
16
|
+
Transform.__init__(self, mod_path, input_ir, base_path, prior) # type: ignore
|
|
17
|
+
self.ir: Generator = self.ir
|
|
18
|
+
|
|
19
|
+
tokens = {
|
|
20
|
+
"FLOAT",
|
|
21
|
+
"STRING",
|
|
22
|
+
"DOC_STRING",
|
|
23
|
+
"FSTRING",
|
|
24
|
+
"BOOL",
|
|
25
|
+
"INT",
|
|
26
|
+
"HEX",
|
|
27
|
+
"BIN",
|
|
28
|
+
"OCT",
|
|
29
|
+
"NULL",
|
|
30
|
+
"NAME",
|
|
31
|
+
"TYP_STRING",
|
|
32
|
+
"TYP_INT",
|
|
33
|
+
"TYP_FLOAT",
|
|
34
|
+
"TYP_LIST",
|
|
35
|
+
"TYP_TUPLE",
|
|
36
|
+
"TYP_SET",
|
|
37
|
+
"TYP_DICT",
|
|
38
|
+
"TYP_BOOL",
|
|
39
|
+
"TYP_BYTES",
|
|
40
|
+
"TYP_ANY",
|
|
41
|
+
"TYP_TYPE",
|
|
42
|
+
"KW_FREEZE",
|
|
43
|
+
"KW_OBJECT",
|
|
44
|
+
"KW_ENUM",
|
|
45
|
+
"KW_NODE",
|
|
46
|
+
"KW_IGNORE",
|
|
47
|
+
"KW_VISIT",
|
|
48
|
+
"KW_REVISIT",
|
|
49
|
+
"KW_SPAWN",
|
|
50
|
+
"KW_WITH",
|
|
51
|
+
"KW_ENTRY",
|
|
52
|
+
"KW_EXIT",
|
|
53
|
+
"KW_IMPORT",
|
|
54
|
+
"KW_INCLUDE",
|
|
55
|
+
"KW_FROM",
|
|
56
|
+
"KW_AS",
|
|
57
|
+
"KW_EDGE",
|
|
58
|
+
"KW_WALKER",
|
|
59
|
+
"KW_ASYNC",
|
|
60
|
+
"KW_AWAIT",
|
|
61
|
+
"KW_TEST",
|
|
62
|
+
"KW_ASSERT",
|
|
63
|
+
"COLON",
|
|
64
|
+
"PIPE_FWD",
|
|
65
|
+
"PIPE_BKWD",
|
|
66
|
+
"DOT_FWD",
|
|
67
|
+
"DOT_BKWD",
|
|
68
|
+
"LBRACE",
|
|
69
|
+
"RBRACE",
|
|
70
|
+
"SEMI",
|
|
71
|
+
"EQ",
|
|
72
|
+
"ADD_EQ",
|
|
73
|
+
"SUB_EQ",
|
|
74
|
+
"MUL_EQ",
|
|
75
|
+
"FLOOR_DIV_EQ",
|
|
76
|
+
"DIV_EQ",
|
|
77
|
+
"MOD_EQ",
|
|
78
|
+
"BW_AND_EQ",
|
|
79
|
+
"BW_OR_EQ",
|
|
80
|
+
"BW_XOR_EQ",
|
|
81
|
+
"BW_NOT_EQ",
|
|
82
|
+
"LSHIFT_EQ",
|
|
83
|
+
"RSHIFT_EQ",
|
|
84
|
+
"WALRUS_EQ",
|
|
85
|
+
"KW_AND",
|
|
86
|
+
"KW_OR",
|
|
87
|
+
"KW_IF",
|
|
88
|
+
"KW_ELIF",
|
|
89
|
+
"KW_ELSE",
|
|
90
|
+
"KW_FOR",
|
|
91
|
+
"KW_TO",
|
|
92
|
+
"KW_BY",
|
|
93
|
+
"KW_WHILE",
|
|
94
|
+
"KW_CONTINUE",
|
|
95
|
+
"KW_BREAK",
|
|
96
|
+
"KW_DISENGAGE",
|
|
97
|
+
"KW_YIELD",
|
|
98
|
+
"KW_SKIP",
|
|
99
|
+
"KW_REPORT",
|
|
100
|
+
"KW_RETURN",
|
|
101
|
+
"KW_DELETE",
|
|
102
|
+
"KW_TRY",
|
|
103
|
+
"KW_EXCEPT",
|
|
104
|
+
"KW_FINALLY",
|
|
105
|
+
"KW_RAISE",
|
|
106
|
+
"DOT",
|
|
107
|
+
"NOT",
|
|
108
|
+
"EE",
|
|
109
|
+
"LT",
|
|
110
|
+
"GT",
|
|
111
|
+
"LTE",
|
|
112
|
+
"GTE",
|
|
113
|
+
"NE",
|
|
114
|
+
"KW_IN",
|
|
115
|
+
"KW_IS",
|
|
116
|
+
"KW_NIN",
|
|
117
|
+
"KW_ISN",
|
|
118
|
+
"KW_PRIV",
|
|
119
|
+
"KW_PUB",
|
|
120
|
+
"KW_PROT",
|
|
121
|
+
"KW_HAS",
|
|
122
|
+
"KW_GLOBAL",
|
|
123
|
+
"COMMA",
|
|
124
|
+
"KW_CAN",
|
|
125
|
+
"KW_STATIC",
|
|
126
|
+
"PLUS",
|
|
127
|
+
"MINUS",
|
|
128
|
+
"STAR_MUL",
|
|
129
|
+
"FLOOR_DIV",
|
|
130
|
+
"DIV",
|
|
131
|
+
"MOD",
|
|
132
|
+
"BW_AND",
|
|
133
|
+
"BW_OR",
|
|
134
|
+
"BW_XOR",
|
|
135
|
+
"BW_NOT",
|
|
136
|
+
"LSHIFT",
|
|
137
|
+
"RSHIFT",
|
|
138
|
+
"STAR_POW",
|
|
139
|
+
"LPAREN",
|
|
140
|
+
"RPAREN",
|
|
141
|
+
"LSQUARE",
|
|
142
|
+
"RSQUARE",
|
|
143
|
+
"ARROW_L",
|
|
144
|
+
"ARROW_R",
|
|
145
|
+
"ARROW_BI",
|
|
146
|
+
"ARROW_L_p1",
|
|
147
|
+
"ARROW_L_p2",
|
|
148
|
+
"ARROW_R_p1",
|
|
149
|
+
"ARROW_R_p2",
|
|
150
|
+
"CARROW_L",
|
|
151
|
+
"CARROW_R",
|
|
152
|
+
"CARROW_L_p1",
|
|
153
|
+
"CARROW_L_p2",
|
|
154
|
+
"CARROW_R_p1",
|
|
155
|
+
"CARROW_R_p2",
|
|
156
|
+
"GLOBAL_OP",
|
|
157
|
+
"HERE_OP",
|
|
158
|
+
"SELF_OP",
|
|
159
|
+
"SUPER_OP",
|
|
160
|
+
"ROOT_OP",
|
|
161
|
+
"WALKER_OP",
|
|
162
|
+
"NODE_OP",
|
|
163
|
+
"EDGE_OP",
|
|
164
|
+
"OBJECT_OP",
|
|
165
|
+
"ENUM_OP",
|
|
166
|
+
"ABILITY_OP",
|
|
167
|
+
"A_PIPE_FWD",
|
|
168
|
+
"A_PIPE_BKWD",
|
|
169
|
+
"ELVIS_OP",
|
|
170
|
+
"RETURN_HINT",
|
|
171
|
+
"NULL_OK",
|
|
172
|
+
"DECOR_OP",
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
# Ignored patterns
|
|
176
|
+
ignore_ws = r"[ \t]+"
|
|
177
|
+
ignore_newline = r"[\r\n]+" # type: ignore
|
|
178
|
+
ignore_comment = r"#\*(.|\n|\r)*?\*#" # type: ignore
|
|
179
|
+
ignore_py_comment = r"#.*"
|
|
180
|
+
|
|
181
|
+
# Regular expression rules for tokens
|
|
182
|
+
FLOAT = r"(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?"
|
|
183
|
+
DOC_STRING = r'"""(.|\n|\r)*?"""|\'\'\'(.|\n|\r)*?\'\'\'' # type: ignore
|
|
184
|
+
FSTRING = r'f"[^"\r\n]*"|f\'[^\'\r\n]*\''
|
|
185
|
+
STRING = r'"[^"\r\n]*"|\'[^\'\r\n]*\''
|
|
186
|
+
BOOL = r"True|False"
|
|
187
|
+
KW_NIN = r"\bnot\s+in\b"
|
|
188
|
+
KW_ISN = r"\bis\s+not\b"
|
|
189
|
+
HEX = r"0[xX][0-9a-fA-F_]+"
|
|
190
|
+
BIN = r"0[bB][01_]+"
|
|
191
|
+
OCT = r"0[oO][0-7_]+"
|
|
192
|
+
INT = r"[0-9][0-9_]*"
|
|
193
|
+
NULL = r"None"
|
|
194
|
+
NAME = r"[a-zA-Z_][a-zA-Z0-9_]*"
|
|
195
|
+
|
|
196
|
+
# Keywords
|
|
197
|
+
NAME["str"] = "TYP_STRING" # type: ignore
|
|
198
|
+
NAME["int"] = "TYP_INT" # type: ignore
|
|
199
|
+
NAME["float"] = "TYP_FLOAT" # type: ignore
|
|
200
|
+
NAME["list"] = "TYP_LIST" # type: ignore
|
|
201
|
+
NAME["tuple"] = "TYP_TUPLE" # type: ignore
|
|
202
|
+
NAME["set"] = "TYP_SET" # type: ignore
|
|
203
|
+
NAME["dict"] = "TYP_DICT" # type: ignore
|
|
204
|
+
NAME["bool"] = "TYP_BOOL" # type: ignore
|
|
205
|
+
NAME["bytes"] = "TYP_BYTES" # type: ignore
|
|
206
|
+
NAME["any"] = "TYP_ANY" # type: ignore
|
|
207
|
+
NAME["type"] = "TYP_TYPE" # type: ignore
|
|
208
|
+
NAME["freeze"] = "KW_FREEZE" # type: ignore
|
|
209
|
+
NAME["object"] = "KW_OBJECT" # type: ignore
|
|
210
|
+
NAME["enum"] = "KW_ENUM" # type: ignore
|
|
211
|
+
NAME["node"] = "KW_NODE" # type: ignore
|
|
212
|
+
NAME["ignore"] = "KW_IGNORE" # type: ignore
|
|
213
|
+
NAME["visit"] = "KW_VISIT" # type: ignore
|
|
214
|
+
NAME["revisit"] = "KW_REVISIT" # type: ignore
|
|
215
|
+
NAME["spawn"] = "KW_SPAWN" # type: ignore
|
|
216
|
+
NAME["with"] = "KW_WITH" # type: ignore
|
|
217
|
+
NAME["entry"] = "KW_ENTRY" # type: ignore
|
|
218
|
+
NAME["exit"] = "KW_EXIT" # type: ignore
|
|
219
|
+
NAME["import"] = "KW_IMPORT" # type: ignore
|
|
220
|
+
NAME["include"] = "KW_INCLUDE" # type: ignore
|
|
221
|
+
NAME["from"] = "KW_FROM" # type: ignore
|
|
222
|
+
NAME["as"] = "KW_AS" # type: ignore
|
|
223
|
+
NAME["edge"] = "KW_EDGE" # type: ignore
|
|
224
|
+
NAME["walker"] = "KW_WALKER" # type: ignore
|
|
225
|
+
NAME["async"] = "KW_ASYNC" # type: ignore
|
|
226
|
+
NAME["await"] = "KW_AWAIT" # type: ignore
|
|
227
|
+
NAME["test"] = "KW_TEST" # type: ignore
|
|
228
|
+
NAME["assert"] = "KW_ASSERT" # type: ignore
|
|
229
|
+
NAME["and"] = "KW_AND" # type: ignore
|
|
230
|
+
NAME["or"] = "KW_OR" # type: ignore
|
|
231
|
+
NAME["if"] = "KW_IF" # type: ignore
|
|
232
|
+
NAME["elif"] = "KW_ELIF" # type: ignore
|
|
233
|
+
NAME["else"] = "KW_ELSE" # type: ignore
|
|
234
|
+
NAME["for"] = "KW_FOR" # type: ignore
|
|
235
|
+
NAME["to"] = "KW_TO" # type: ignore
|
|
236
|
+
NAME["by"] = "KW_BY" # type: ignore
|
|
237
|
+
NAME["while"] = "KW_WHILE" # type: ignore
|
|
238
|
+
NAME["continue"] = "KW_CONTINUE" # type: ignore
|
|
239
|
+
NAME["break"] = "KW_BREAK" # type: ignore
|
|
240
|
+
NAME["disengage"] = "KW_DISENGAGE" # type: ignore
|
|
241
|
+
NAME["yield"] = "KW_YIELD" # type: ignore
|
|
242
|
+
NAME["skip"] = "KW_SKIP" # type: ignore
|
|
243
|
+
NAME["report"] = "KW_REPORT" # type: ignore
|
|
244
|
+
NAME["return"] = "KW_RETURN" # type: ignore
|
|
245
|
+
NAME["del"] = "KW_DELETE" # type: ignore
|
|
246
|
+
NAME["try"] = "KW_TRY" # type: ignore
|
|
247
|
+
NAME["except"] = "KW_EXCEPT" # type: ignore
|
|
248
|
+
NAME["finally"] = "KW_FINALLY" # type: ignore
|
|
249
|
+
NAME["raise"] = "KW_RAISE" # type: ignore
|
|
250
|
+
NAME["in"] = "KW_IN" # type: ignore
|
|
251
|
+
NAME["is"] = "KW_IS" # type: ignore
|
|
252
|
+
NAME["not"] = "NOT" # type: ignore
|
|
253
|
+
NAME["private"] = "KW_PRIV" # type: ignore
|
|
254
|
+
NAME["public"] = "KW_PUB" # type: ignore
|
|
255
|
+
NAME["protected"] = "KW_PROT" # type: ignore
|
|
256
|
+
NAME["has"] = "KW_HAS" # type: ignore
|
|
257
|
+
NAME["global"] = "KW_GLOBAL" # type: ignore
|
|
258
|
+
NAME["can"] = "KW_CAN" # type: ignore
|
|
259
|
+
NAME["static"] = "KW_STATIC" # type: ignore
|
|
260
|
+
|
|
261
|
+
# Special Arrow Tokens
|
|
262
|
+
ARROW_L = r"<--"
|
|
263
|
+
ARROW_R = r"-->"
|
|
264
|
+
ARROW_BI = r"<-->"
|
|
265
|
+
ARROW_L_p1 = r"<-\["
|
|
266
|
+
ARROW_L_p2 = r"]-"
|
|
267
|
+
ARROW_R_p1 = r"-\["
|
|
268
|
+
ARROW_R_p2 = r"]->"
|
|
269
|
+
CARROW_L = r"<\+\+"
|
|
270
|
+
CARROW_R = r"\+\+>"
|
|
271
|
+
CARROW_L_p1 = r"<\+\["
|
|
272
|
+
CARROW_R_p2 = r"]\+>"
|
|
273
|
+
CARROW_L_p2 = r"]\+"
|
|
274
|
+
CARROW_R_p1 = r"\+\["
|
|
275
|
+
|
|
276
|
+
# Just special
|
|
277
|
+
GLOBAL_OP = r":g:|:global:"
|
|
278
|
+
HERE_OP = r"<h>|<here>"
|
|
279
|
+
SELF_OP = r"<s>|<self>"
|
|
280
|
+
SUPER_OP = r"<super>"
|
|
281
|
+
ROOT_OP = r"<r>|<root>"
|
|
282
|
+
WALKER_OP = r":w:|:walker:"
|
|
283
|
+
NODE_OP = r":n:|:node:"
|
|
284
|
+
EDGE_OP = r":e:|:edge:"
|
|
285
|
+
OBJECT_OP = r":o:|:object:"
|
|
286
|
+
ENUM_OP = r":enum:"
|
|
287
|
+
ABILITY_OP = r":a:|:ability:"
|
|
288
|
+
A_PIPE_FWD = r":>"
|
|
289
|
+
A_PIPE_BKWD = r"<:"
|
|
290
|
+
PIPE_FWD = r"\|>"
|
|
291
|
+
PIPE_BKWD = r"<\|"
|
|
292
|
+
DOT_FWD = r"\.>"
|
|
293
|
+
DOT_BKWD = r"<\."
|
|
294
|
+
RETURN_HINT = r"->"
|
|
295
|
+
ELVIS_OP = r"\?:"
|
|
296
|
+
NULL_OK = r"\?"
|
|
297
|
+
DECOR_OP = r"@"
|
|
298
|
+
|
|
299
|
+
# Token rules
|
|
300
|
+
KW_AND = r"&&"
|
|
301
|
+
KW_OR = r"\|\|"
|
|
302
|
+
ADD_EQ = r"\+="
|
|
303
|
+
SUB_EQ = r"-="
|
|
304
|
+
MUL_EQ = r"\*="
|
|
305
|
+
FLOOR_DIV_EQ = r"//="
|
|
306
|
+
DIV_EQ = r"/="
|
|
307
|
+
MOD_EQ = r"%="
|
|
308
|
+
BW_AND_EQ = r"&="
|
|
309
|
+
BW_OR_EQ = r"\|="
|
|
310
|
+
BW_XOR_EQ = r"\^="
|
|
311
|
+
BW_NOT_EQ = r"~="
|
|
312
|
+
LSHIFT_EQ = r"<<="
|
|
313
|
+
RSHIFT_EQ = r">>="
|
|
314
|
+
LSHIFT = r"<<"
|
|
315
|
+
RSHIFT = r">>"
|
|
316
|
+
LTE = r"<="
|
|
317
|
+
GTE = r">="
|
|
318
|
+
NE = r"!="
|
|
319
|
+
NOT = r"!"
|
|
320
|
+
WALRUS_EQ = r":="
|
|
321
|
+
COLON = r":"
|
|
322
|
+
LBRACE = r"{"
|
|
323
|
+
RBRACE = r"}"
|
|
324
|
+
SEMI = r";"
|
|
325
|
+
EE = r"=="
|
|
326
|
+
EQ = r"="
|
|
327
|
+
DOT = r"\."
|
|
328
|
+
LT = r"<"
|
|
329
|
+
GT = r">"
|
|
330
|
+
COMMA = r","
|
|
331
|
+
PLUS = r"\+"
|
|
332
|
+
MINUS = r"-"
|
|
333
|
+
STAR_POW = r"\*\*"
|
|
334
|
+
STAR_MUL = r"\*"
|
|
335
|
+
FLOOR_DIV = r"//"
|
|
336
|
+
DIV = r"/"
|
|
337
|
+
MOD = r"%"
|
|
338
|
+
BW_AND = r"&"
|
|
339
|
+
BW_OR = r"\|"
|
|
340
|
+
BW_XOR = r"\^"
|
|
341
|
+
BW_NOT = r"~"
|
|
342
|
+
LPAREN = r"\("
|
|
343
|
+
RPAREN = r"\)"
|
|
344
|
+
LSQUARE = r"\["
|
|
345
|
+
RSQUARE = r"\]"
|
|
346
|
+
|
|
347
|
+
def ignore_newline(self, t: Token) -> Token:
|
|
348
|
+
"""Increment line number."""
|
|
349
|
+
self.lineno += len(t.value)
|
|
350
|
+
return t
|
|
351
|
+
|
|
352
|
+
def ignore_comment(self, t: Token) -> Token: # noqa: N802
|
|
353
|
+
"""Add docstring to lexer."""
|
|
354
|
+
self.lineno += t.value.count("\n")
|
|
355
|
+
self.lineno += t.value.count("\r")
|
|
356
|
+
return t
|
|
357
|
+
|
|
358
|
+
def DOC_STRING(self, t: Token) -> Token: # noqa: N802
|
|
359
|
+
"""Add docstring to lexer."""
|
|
360
|
+
self.lineno += t.value.count("\n")
|
|
361
|
+
self.lineno += t.value.count("\r")
|
|
362
|
+
return t
|
|
363
|
+
|
|
364
|
+
# Transform Implementations
|
|
365
|
+
# -------------------------
|
|
366
|
+
def transform(self, ir: str) -> Generator:
|
|
367
|
+
"""Tokenize the input."""
|
|
368
|
+
return self.tokenize(ir)
|
|
369
|
+
|
|
370
|
+
def error(self, t: Token) -> None:
|
|
371
|
+
"""Raise an error for illegal characters."""
|
|
372
|
+
self.cur_line = self.lineno
|
|
373
|
+
self.log_error(msg=f"Illegal character '{t.value[0]}'")
|
|
374
|
+
self.index += 1
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
# Done like this for type checker
|
|
378
|
+
# validated synced with test
|
|
379
|
+
class Tokens(str, Enum):
|
|
380
|
+
"""Token constants for the lexer."""
|
|
381
|
+
|
|
382
|
+
FLOAT = "FLOAT"
|
|
383
|
+
STRING = "STRING"
|
|
384
|
+
DOC_STRING = "DOC_STRING"
|
|
385
|
+
FSTRING = "FSTRING"
|
|
386
|
+
BOOL = "BOOL"
|
|
387
|
+
INT = "INT"
|
|
388
|
+
HEX = "HEX"
|
|
389
|
+
BIN = "BIN"
|
|
390
|
+
OCT = "OCT"
|
|
391
|
+
NULL = "NULL"
|
|
392
|
+
NAME = "NAME"
|
|
393
|
+
TYP_STRING = "TYP_STRING"
|
|
394
|
+
TYP_INT = "TYP_INT"
|
|
395
|
+
TYP_FLOAT = "TYP_FLOAT"
|
|
396
|
+
TYP_LIST = "TYP_LIST"
|
|
397
|
+
TYP_TUPLE = "TYP_TUPLE"
|
|
398
|
+
TYP_SET = "TYP_SET"
|
|
399
|
+
TYP_DICT = "TYP_DICT"
|
|
400
|
+
TYP_BOOL = "TYP_BOOL"
|
|
401
|
+
TYP_BYTES = "TYP_BYTES"
|
|
402
|
+
TYP_ANY = "TYP_ANY"
|
|
403
|
+
TYP_TYPE = "TYP_TYPE"
|
|
404
|
+
KW_FREEZE = "KW_FREEZE"
|
|
405
|
+
KW_OBJECT = "KW_OBJECT"
|
|
406
|
+
KW_ENUM = "KW_ENUM"
|
|
407
|
+
KW_NODE = "KW_NODE"
|
|
408
|
+
KW_IGNORE = "KW_IGNORE"
|
|
409
|
+
KW_VISIT = "KW_VISIT"
|
|
410
|
+
KW_REVISIT = "KW_REVISIT"
|
|
411
|
+
KW_SPAWN = "KW_SPAWN"
|
|
412
|
+
KW_WITH = "KW_WITH"
|
|
413
|
+
KW_ENTRY = "KW_ENTRY"
|
|
414
|
+
KW_EXIT = "KW_EXIT"
|
|
415
|
+
KW_IMPORT = "KW_IMPORT"
|
|
416
|
+
KW_INCLUDE = "KW_INCLUDE"
|
|
417
|
+
KW_FROM = "KW_FROM"
|
|
418
|
+
KW_AS = "KW_AS"
|
|
419
|
+
KW_EDGE = "KW_EDGE"
|
|
420
|
+
KW_WALKER = "KW_WALKER"
|
|
421
|
+
KW_ASYNC = "KW_ASYNC"
|
|
422
|
+
KW_AWAIT = "KW_AWAIT"
|
|
423
|
+
KW_TEST = "KW_TEST"
|
|
424
|
+
KW_ASSERT = "KW_ASSERT"
|
|
425
|
+
COLON = "COLON"
|
|
426
|
+
PIPE_FWD = "PIPE_FWD"
|
|
427
|
+
PIPE_BKWD = "PIPE_BKWD"
|
|
428
|
+
DOT_FWD = "DOT_FWD"
|
|
429
|
+
DOT_BKWD = "DOT_BKWD"
|
|
430
|
+
LBRACE = "LBRACE"
|
|
431
|
+
RBRACE = "RBRACE"
|
|
432
|
+
SEMI = "SEMI"
|
|
433
|
+
EQ = "EQ"
|
|
434
|
+
ADD_EQ = "ADD_EQ"
|
|
435
|
+
SUB_EQ = "SUB_EQ"
|
|
436
|
+
MUL_EQ = "MUL_EQ"
|
|
437
|
+
FLOOR_DIV_EQ = "FLOOR_DIV_EQ"
|
|
438
|
+
DIV_EQ = "DIV_EQ"
|
|
439
|
+
MOD_EQ = "MOD_EQ"
|
|
440
|
+
BW_AND_EQ = "BW_AND_EQ"
|
|
441
|
+
BW_OR_EQ = "BW_OR_EQ"
|
|
442
|
+
BW_XOR_EQ = "BW_XOR_EQ"
|
|
443
|
+
BW_NOT_EQ = "BW_NOT_EQ"
|
|
444
|
+
LSHIFT_EQ = "LSHIFT_EQ"
|
|
445
|
+
RSHIFT_EQ = "RSHIFT_EQ"
|
|
446
|
+
WALRUS_EQ = "WALRUS_EQ"
|
|
447
|
+
KW_AND = "KW_AND"
|
|
448
|
+
KW_OR = "KW_OR"
|
|
449
|
+
KW_IF = "KW_IF"
|
|
450
|
+
KW_ELIF = "KW_ELIF"
|
|
451
|
+
KW_ELSE = "KW_ELSE"
|
|
452
|
+
KW_FOR = "KW_FOR"
|
|
453
|
+
KW_TO = "KW_TO"
|
|
454
|
+
KW_BY = "KW_BY"
|
|
455
|
+
KW_WHILE = "KW_WHILE"
|
|
456
|
+
KW_CONTINUE = "KW_CONTINUE"
|
|
457
|
+
KW_BREAK = "KW_BREAK"
|
|
458
|
+
KW_DISENGAGE = "KW_DISENGAGE"
|
|
459
|
+
KW_YIELD = "KW_YIELD"
|
|
460
|
+
KW_SKIP = "KW_SKIP"
|
|
461
|
+
KW_REPORT = "KW_REPORT"
|
|
462
|
+
KW_RETURN = "KW_RETURN"
|
|
463
|
+
KW_DELETE = "KW_DELETE"
|
|
464
|
+
KW_TRY = "KW_TRY"
|
|
465
|
+
KW_EXCEPT = "KW_EXCEPT"
|
|
466
|
+
KW_FINALLY = "KW_FINALLY"
|
|
467
|
+
KW_RAISE = "KW_RAISE"
|
|
468
|
+
DOT = "DOT"
|
|
469
|
+
NOT = "NOT"
|
|
470
|
+
EE = "EE"
|
|
471
|
+
LT = "LT"
|
|
472
|
+
GT = "GT"
|
|
473
|
+
LTE = "LTE"
|
|
474
|
+
GTE = "GTE"
|
|
475
|
+
NE = "NE"
|
|
476
|
+
KW_IN = "KW_IN"
|
|
477
|
+
KW_IS = "KW_IS"
|
|
478
|
+
KW_NIN = "KW_NIN"
|
|
479
|
+
KW_ISN = "KW_ISN"
|
|
480
|
+
KW_PRIV = "KW_PRIV"
|
|
481
|
+
KW_PUB = "KW_PUB"
|
|
482
|
+
KW_PROT = "KW_PROT"
|
|
483
|
+
KW_HAS = "KW_HAS"
|
|
484
|
+
KW_GLOBAL = "KW_GLOBAL"
|
|
485
|
+
COMMA = "COMMA"
|
|
486
|
+
KW_CAN = "KW_CAN"
|
|
487
|
+
KW_STATIC = "KW_STATIC"
|
|
488
|
+
PLUS = "PLUS"
|
|
489
|
+
MINUS = "MINUS"
|
|
490
|
+
STAR_MUL = "STAR_MUL"
|
|
491
|
+
FLOOR_DIV = "FLOOR_DIV"
|
|
492
|
+
DIV = "DIV"
|
|
493
|
+
MOD = "MOD"
|
|
494
|
+
BW_AND = "BW_AND"
|
|
495
|
+
BW_OR = "BW_OR"
|
|
496
|
+
BW_XOR = "BW_XOR"
|
|
497
|
+
BW_NOT = "BW_NOT"
|
|
498
|
+
LSHIFT = "LSHIFT"
|
|
499
|
+
RSHIFT = "RSHIFT"
|
|
500
|
+
STAR_POW = "STAR_POW"
|
|
501
|
+
LPAREN = "LPAREN"
|
|
502
|
+
RPAREN = "RPAREN"
|
|
503
|
+
LSQUARE = "LSQUARE"
|
|
504
|
+
RSQUARE = "RSQUARE"
|
|
505
|
+
ARROW_L = "ARROW_L"
|
|
506
|
+
ARROW_R = "ARROW_R"
|
|
507
|
+
ARROW_BI = "ARROW_BI"
|
|
508
|
+
ARROW_L_p1 = "ARROW_L_p1"
|
|
509
|
+
ARROW_L_p2 = "ARROW_L_p2"
|
|
510
|
+
ARROW_R_p1 = "ARROW_R_p1"
|
|
511
|
+
ARROW_R_p2 = "ARROW_R_p2"
|
|
512
|
+
CARROW_L = "CARROW_L"
|
|
513
|
+
CARROW_R = "CARROW_R"
|
|
514
|
+
CARROW_L_p1 = "CARROW_L_p1"
|
|
515
|
+
CARROW_L_p2 = "CARROW_L_p2"
|
|
516
|
+
CARROW_R_p1 = "CARROW_R_p1"
|
|
517
|
+
CARROW_R_p2 = "CARROW_R_p2"
|
|
518
|
+
GLOBAL_OP = "GLOBAL_OP"
|
|
519
|
+
HERE_OP = "HERE_OP"
|
|
520
|
+
SELF_OP = "SELF_OP"
|
|
521
|
+
SUPER_OP = "SUPER_OP"
|
|
522
|
+
ROOT_OP = "ROOT_OP"
|
|
523
|
+
WALKER_OP = "WALKER_OP"
|
|
524
|
+
NODE_OP = "NODE_OP"
|
|
525
|
+
EDGE_OP = "EDGE_OP"
|
|
526
|
+
OBJECT_OP = "OBJECT_OP"
|
|
527
|
+
ENUM_OP = "ENUM_OP"
|
|
528
|
+
ABILITY_OP = "ABILITY_OP"
|
|
529
|
+
A_PIPE_FWD = "A_PIPE_FWD"
|
|
530
|
+
A_PIPE_BKWD = "A_PIPE_BKWD"
|
|
531
|
+
ELVIS_OP = "ELVIS_OP"
|
|
532
|
+
RETURN_HINT = "RETURN_HINT"
|
|
533
|
+
NULL_OK = "NULL_OK"
|
|
534
|
+
DECOR_OP = "DECOR_OP"
|
|
535
|
+
|
|
536
|
+
def __str__(self) -> str:
|
|
537
|
+
"""Return the string representation of the token."""
|
|
538
|
+
return self.value
|