@rsconcept/domain 1.0.0 → 1.1.0
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.
- package/README.md +3 -3
- package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
- package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
- package/dist/ast-C8sIpKdL.d.ts +51 -0
- package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
- package/dist/branded-ZlzIcxzu.d.ts +9 -0
- package/dist/calculator-C9W2jkSx.d.ts +39 -0
- package/dist/cctext/index.d.ts +2 -1
- package/dist/cctext/index.js +2 -42
- package/dist/cctext/language-api.d.ts +10 -12
- package/dist/cctext/language-api.js +157 -227
- package/dist/cctext/language-api.js.map +1 -1
- package/dist/cctext/language.d.ts +24 -22
- package/dist/cctext/language.js +43 -39
- package/dist/cctext/language.js.map +1 -1
- package/dist/error-E1LVq_3w.d.ts +87 -0
- package/dist/graph/graph.d.ts +2 -62
- package/dist/graph/graph.js +339 -382
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +2 -1
- package/dist/graph/index.js +2 -384
- package/dist/graph-DR8rL2o3.d.ts +64 -0
- package/dist/hash-Y8I4c6Al.d.ts +8 -0
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-DmtQKWjk.d.ts +1 -0
- package/dist/index-_6s0AX1B.d.ts +1 -0
- package/dist/index.d.ts +27 -28
- package/dist/index.js +23 -5851
- package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
- package/dist/library/folder-tree.d.ts +22 -20
- package/dist/library/folder-tree.js +108 -130
- package/dist/library/folder-tree.js.map +1 -1
- package/dist/library/index.d.ts +8 -17
- package/dist/library/index.js +7 -2800
- package/dist/library/library-api.d.ts +3 -1
- package/dist/library/library-api.js +9 -8
- package/dist/library/library-api.js.map +1 -1
- package/dist/library/library.d.ts +2 -56
- package/dist/library/library.js +23 -19
- package/dist/library/library.js.map +1 -1
- package/dist/library/oss-api.d.ts +26 -37
- package/dist/library/oss-api.js +257 -1096
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss-layout-api.d.ts +28 -28
- package/dist/library/oss-layout-api.js +239 -316
- package/dist/library/oss-layout-api.js.map +1 -1
- package/dist/library/oss-layout.d.ts +2 -25
- package/dist/library/oss-layout.js +1 -1
- package/dist/library/oss.d.ts +87 -89
- package/dist/library/oss.js +27 -26
- package/dist/library/oss.js.map +1 -1
- package/dist/library/rsengine.d.ts +100 -106
- package/dist/library/rsengine.js +439 -2599
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api.d.ts +11 -16
- package/dist/library/rsform-api.js +313 -825
- package/dist/library/rsform-api.js.map +1 -1
- package/dist/library/rsform.d.ts +159 -167
- package/dist/library/rsform.js +29 -28
- package/dist/library/rsform.js.map +1 -1
- package/dist/library/rsmodel-api.d.ts +8 -15
- package/dist/library/rsmodel-api.js +172 -813
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/rsmodel.d.ts +27 -33
- package/dist/library/rsmodel.js +16 -23
- package/dist/library/rsmodel.js.map +1 -1
- package/dist/library/structure-planner.d.ts +20 -26
- package/dist/library/structure-planner.js +106 -474
- package/dist/library/structure-planner.js.map +1 -1
- package/dist/library-CYun28Xz.d.ts +58 -0
- package/dist/oss-layout-3glgAqfn.d.ts +27 -0
- package/dist/parser-Bwd8LxJ1.d.ts +7 -0
- package/dist/parsing/ast.d.ts +2 -49
- package/dist/parsing/ast.js +68 -76
- package/dist/parsing/ast.js.map +1 -1
- package/dist/parsing/index.d.ts +3 -3
- package/dist/parsing/index.js +3 -141
- package/dist/parsing/lezer-tree.d.ts +2 -13
- package/dist/parsing/lezer-tree.js +50 -43
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.d.ts +9 -14
- package/dist/rslang/api.js +114 -827
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/ast-annotations.d.ts +2 -18
- package/dist/rslang/ast-annotations.js +34 -45
- package/dist/rslang/ast-annotations.js.map +1 -1
- package/dist/rslang/error.d.ts +2 -85
- package/dist/rslang/error.js +88 -150
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +2 -43
- package/dist/rslang/eval/calculator.js +81 -1636
- package/dist/rslang/eval/calculator.js.map +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
- package/dist/rslang/eval/evaluation-cache.js +168 -287
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.d.ts +59 -63
- package/dist/rslang/eval/evaluator.js +602 -1509
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.d.ts +2 -48
- package/dist/rslang/eval/value-api.js +2 -490
- package/dist/rslang/eval/value.d.ts +2 -36
- package/dist/rslang/eval/value.js +2 -118
- package/dist/rslang/index.d.ts +14 -17
- package/dist/rslang/index.js +12 -4314
- package/dist/rslang/labels.d.ts +6 -6
- package/dist/rslang/labels.js +139 -305
- package/dist/rslang/labels.js.map +1 -1
- package/dist/rslang/parser/expression-generator.d.ts +5 -5
- package/dist/rslang/parser/expression-generator.js +248 -446
- package/dist/rslang/parser/expression-generator.js.map +1 -1
- package/dist/rslang/parser/normalize.d.ts +4 -8
- package/dist/rslang/parser/normalize.js +286 -481
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.d.ts +2 -5
- package/dist/rslang/parser/parser.js +30 -21
- package/dist/rslang/parser/parser.js.map +1 -1
- package/dist/rslang/parser/parser.terms.d.ts +43 -41
- package/dist/rslang/parser/parser.terms.js +44 -83
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/parser/syntax-errors.d.ts +5 -8
- package/dist/rslang/parser/syntax-errors.js +113 -382
- package/dist/rslang/parser/syntax-errors.js.map +1 -1
- package/dist/rslang/parser/token.d.ts +2 -79
- package/dist/rslang/parser/token.js +81 -93
- package/dist/rslang/parser/token.js.map +1 -1
- package/dist/rslang/semantic/analyzer.d.ts +2 -39
- package/dist/rslang/semantic/analyzer.js +186 -2600
- package/dist/rslang/semantic/analyzer.js.map +1 -1
- package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
- package/dist/rslang/semantic/arguments-extractor.js +202 -361
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +64 -68
- package/dist/rslang/semantic/type-auditor.js +594 -1564
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.d.ts +4 -7
- package/dist/rslang/semantic/typification-api.js +162 -303
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.d.ts +2 -12
- package/dist/rslang/semantic/typification-parser.js +165 -219
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/rslang/semantic/typification.d.ts +2 -119
- package/dist/rslang/semantic/typification.js +66 -52
- package/dist/rslang/semantic/typification.js.map +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +32 -38
- package/dist/rslang/semantic/value-auditor.js +206 -518
- package/dist/rslang/semantic/value-auditor.js.map +1 -1
- package/dist/rslang/semantic/value-class.d.ts +2 -10
- package/dist/rslang/semantic/value-class.js +8 -7
- package/dist/rslang/semantic/value-class.js.map +1 -1
- package/dist/rslang/typification-graph.d.ts +2 -33
- package/dist/rslang/typification-graph.js +94 -306
- package/dist/rslang/typification-graph.js.map +1 -1
- package/dist/shared/branded.d.ts +2 -7
- package/dist/shared/branded.js +1 -1
- package/dist/shared/hash.d.ts +2 -6
- package/dist/shared/hash.js +13 -13
- package/dist/shared/hash.js.map +1 -1
- package/dist/shared/index.d.ts +3 -2
- package/dist/shared/index.js +2 -18
- package/dist/token-DeXAmzwr.d.ts +81 -0
- package/dist/typification-Dk-fisgO.d.ts +120 -0
- package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
- package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
- package/dist/value-B8UtCqaK.js +366 -0
- package/dist/value-B8UtCqaK.js.map +1 -0
- package/dist/value-CTjX6825.d.ts +33 -0
- package/dist/value-api-Bw-SgaYY.d.ts +49 -0
- package/dist/value-class-CNI-lqXJ.d.ts +12 -0
- package/package.json +8 -8
- package/src/library/rsform-api.test.ts +24 -0
- package/src/library/rsform-api.ts +12 -4
- package/dist/cctext/index.js.map +0 -1
- package/dist/graph/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/library/index.js.map +0 -1
- package/dist/library/oss-layout.js.map +0 -1
- package/dist/parsing/index.js.map +0 -1
- package/dist/rslang/eval/value-api.js.map +0 -1
- package/dist/rslang/eval/value.js.map +0 -1
- package/dist/rslang/index.js.map +0 -1
- package/dist/shared/branded.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
|
@@ -1,451 +1,253 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
return `NO DATA NODE: ${node.typeID}`;
|
|
8
|
-
}
|
|
9
|
-
function getNodeIndices(node) {
|
|
10
|
-
if (node.data.dataType === "string[]" && Array.isArray(node.data.value)) {
|
|
11
|
-
return node.data.value.map((s) => parseInt(s, 10)).filter((n) => !isNaN(n));
|
|
12
|
-
}
|
|
13
|
-
return [];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// src/rslang/parser/token.ts
|
|
17
|
-
var TokenID = {
|
|
18
|
-
// Global, local IDs and literals
|
|
19
|
-
ERROR: TOKEN_ERROR,
|
|
20
|
-
ID_LOCAL: 258,
|
|
21
|
-
ID_GLOBAL: 259,
|
|
22
|
-
ID_FUNCTION: 260,
|
|
23
|
-
ID_PREDICATE: 261,
|
|
24
|
-
ID_RADICAL: 262,
|
|
25
|
-
LIT_INTEGER: 263,
|
|
26
|
-
LIT_WHOLE_NUMBERS: 264,
|
|
27
|
-
LIT_EMPTYSET: 265,
|
|
28
|
-
// Arithmetic
|
|
29
|
-
PLUS: 266,
|
|
30
|
-
MINUS: 267,
|
|
31
|
-
MULTIPLY: 268,
|
|
32
|
-
// Integer predicate symbols
|
|
33
|
-
GREATER: 269,
|
|
34
|
-
LESSER: 270,
|
|
35
|
-
GREATER_OR_EQ: 271,
|
|
36
|
-
LESSER_OR_EQ: 272,
|
|
37
|
-
// Equality comparison
|
|
38
|
-
EQUAL: 273,
|
|
39
|
-
NOTEQUAL: 274,
|
|
40
|
-
// Logic predicate symbols
|
|
41
|
-
QUANTOR_UNIVERSAL: 275,
|
|
42
|
-
QUANTOR_EXISTS: 276,
|
|
43
|
-
LOGIC_NOT: 277,
|
|
44
|
-
LOGIC_EQUIVALENT: 278,
|
|
45
|
-
LOGIC_IMPLICATION: 279,
|
|
46
|
-
LOGIC_OR: 280,
|
|
47
|
-
LOGIC_AND: 281,
|
|
48
|
-
// Set theory predicate symbols
|
|
49
|
-
SET_IN: 282,
|
|
50
|
-
SET_NOT_IN: 283,
|
|
51
|
-
SUBSET: 284,
|
|
52
|
-
SUBSET_OR_EQ: 285,
|
|
53
|
-
NOT_SUBSET: 286,
|
|
54
|
-
// Set theory operators
|
|
55
|
-
DECART: 287,
|
|
56
|
-
SET_UNION: 288,
|
|
57
|
-
SET_INTERSECTION: 289,
|
|
58
|
-
SET_MINUS: 290,
|
|
59
|
-
SET_SYMMETRIC_MINUS: 291,
|
|
60
|
-
BOOLEAN: 292,
|
|
61
|
-
// Structure operations
|
|
62
|
-
BIGPR: 293,
|
|
63
|
-
SMALLPR: 294,
|
|
64
|
-
FILTER: 295,
|
|
65
|
-
CARD: 296,
|
|
66
|
-
BOOL: 297,
|
|
67
|
-
DEBOOL: 298,
|
|
68
|
-
REDUCE: 299,
|
|
69
|
-
// Term constructions prefixes
|
|
70
|
-
DECLARATIVE: 300,
|
|
71
|
-
RECURSIVE: 301,
|
|
72
|
-
IMPERATIVE: 302,
|
|
73
|
-
ITERATE: 303,
|
|
74
|
-
ASSIGN: 304,
|
|
75
|
-
// Punctuation
|
|
76
|
-
PUNCTUATION_DEFINE: 305,
|
|
77
|
-
PUNCTUATION_STRUCT: 306,
|
|
78
|
-
PUNCTUATION_PL: 307,
|
|
79
|
-
PUNCTUATION_PR: 308,
|
|
80
|
-
PUNCTUATION_CL: 309,
|
|
81
|
-
PUNCTUATION_CR: 310,
|
|
82
|
-
PUNCTUATION_SL: 311,
|
|
83
|
-
PUNCTUATION_SR: 312,
|
|
84
|
-
PUNCTUATION_BAR: 313,
|
|
85
|
-
PUNCTUATION_COMMA: 314,
|
|
86
|
-
PUNCTUATION_SEMICOLON: 315,
|
|
87
|
-
// ======= Non-terminal tokens =========
|
|
88
|
-
NT_ENUM_DECL: 316,
|
|
89
|
-
NT_TUPLE: 317,
|
|
90
|
-
NT_ENUMERATION: 318,
|
|
91
|
-
NT_TUPLE_DECL: 319,
|
|
92
|
-
NT_ARG_DECL: 320,
|
|
93
|
-
NT_FUNC_DEFINITION: 321,
|
|
94
|
-
NT_ARGUMENTS: 322,
|
|
95
|
-
NT_FUNC_CALL: 323,
|
|
96
|
-
NT_DECLARATIVE_EXPR: 324,
|
|
97
|
-
NT_IMPERATIVE_EXPR: 325,
|
|
98
|
-
NT_RECURSIVE_FULL: 326,
|
|
99
|
-
NT_RECURSIVE_SHORT: 327,
|
|
100
|
-
// ======= Helper tokens ========
|
|
101
|
-
INTERRUPT: 328,
|
|
102
|
-
END: 329
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
// src/rslang/parser/expression-generator.ts
|
|
1
|
+
import { getNodeIndices, getNodeText } from "../../parsing/ast.js";
|
|
2
|
+
import "../../parsing/index.js";
|
|
3
|
+
import { TokenID } from "./token.js";
|
|
4
|
+
//#region src/rslang/parser/expression-generator.ts
|
|
5
|
+
/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */
|
|
106
6
|
function generateExpressionFromAst(ast, options = {}) {
|
|
107
|
-
|
|
7
|
+
return new ExpressionGenerator(options).run(ast);
|
|
108
8
|
}
|
|
9
|
+
/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */
|
|
109
10
|
var ExpressionGenerator = class {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
case TokenID.MINUS:
|
|
349
|
-
case TokenID.SET_UNION:
|
|
350
|
-
case TokenID.SET_SYMMETRIC_MINUS:
|
|
351
|
-
return 7;
|
|
352
|
-
case TokenID.MULTIPLY:
|
|
353
|
-
case TokenID.DECART:
|
|
354
|
-
case TokenID.SET_INTERSECTION:
|
|
355
|
-
case TokenID.SET_MINUS:
|
|
356
|
-
return 8;
|
|
357
|
-
default:
|
|
358
|
-
return null;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
isAssociative(typeID) {
|
|
362
|
-
return typeID === TokenID.PLUS || typeID === TokenID.MULTIPLY || typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_EQUIVALENT || typeID === TokenID.SET_UNION || typeID === TokenID.SET_INTERSECTION || typeID === TokenID.DECART;
|
|
363
|
-
}
|
|
364
|
-
isLeftAssociative(typeID) {
|
|
365
|
-
return typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.MINUS || typeID === TokenID.SET_MINUS || typeID === TokenID.SET_SYMMETRIC_MINUS;
|
|
366
|
-
}
|
|
367
|
-
renderBoolean(node, context) {
|
|
368
|
-
let current = node;
|
|
369
|
-
let depth = 0;
|
|
370
|
-
while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {
|
|
371
|
-
depth += 1;
|
|
372
|
-
current = current.children[0];
|
|
373
|
-
}
|
|
374
|
-
return `${"\u212C".repeat(depth)}(${this.visit(current, context)})`;
|
|
375
|
-
}
|
|
376
|
-
wrapIfNeeded(text, node) {
|
|
377
|
-
if (this.isAtomic(node.typeID)) {
|
|
378
|
-
return text;
|
|
379
|
-
}
|
|
380
|
-
return `(${text})`;
|
|
381
|
-
}
|
|
382
|
-
isAtomic(typeID) {
|
|
383
|
-
return typeID === TokenID.ID_LOCAL || typeID === TokenID.ID_GLOBAL || typeID === TokenID.ID_FUNCTION || typeID === TokenID.ID_PREDICATE || typeID === TokenID.ID_RADICAL || typeID === TokenID.LIT_INTEGER || typeID === TokenID.LIT_WHOLE_NUMBERS || typeID === TokenID.LIT_EMPTYSET || typeID === TokenID.NT_FUNC_CALL || typeID === TokenID.NT_TUPLE || typeID === TokenID.NT_ENUMERATION || typeID === TokenID.BIGPR || typeID === TokenID.SMALLPR || typeID === TokenID.FILTER || typeID === TokenID.REDUCE || typeID === TokenID.BOOL || typeID === TokenID.DEBOOL || typeID === TokenID.CARD || typeID === TokenID.BOOLEAN;
|
|
384
|
-
}
|
|
385
|
-
isLogicBinary(typeID) {
|
|
386
|
-
return typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.LOGIC_EQUIVALENT;
|
|
387
|
-
}
|
|
388
|
-
formatIndices(node) {
|
|
389
|
-
return getNodeIndices(node).join(",");
|
|
390
|
-
}
|
|
391
|
-
shouldStartScope(typeID) {
|
|
392
|
-
return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.NT_FUNC_DEFINITION || typeID === TokenID.NT_IMPERATIVE_EXPR || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL;
|
|
393
|
-
}
|
|
394
|
-
childContext(typeID, index, parent) {
|
|
395
|
-
if (!this.options.normalize) {
|
|
396
|
-
return parent;
|
|
397
|
-
}
|
|
398
|
-
const isDeclaration = (typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.ITERATE || typeID === TokenID.ASSIGN || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL) && index === 0 || typeID === TokenID.NT_FUNC_DEFINITION && index === 0 || typeID === TokenID.NT_ARG_DECL && index === 0 || typeID === TokenID.NT_TUPLE_DECL || typeID === TokenID.NT_ENUM_DECL;
|
|
399
|
-
return { localDeclaration: isDeclaration };
|
|
400
|
-
}
|
|
401
|
-
declareLocal(alias) {
|
|
402
|
-
const scope = this.currentScope();
|
|
403
|
-
const local = this.nextLocal();
|
|
404
|
-
scope.set(alias, local);
|
|
405
|
-
return local;
|
|
406
|
-
}
|
|
407
|
-
resolveLocal(alias) {
|
|
408
|
-
for (let index = this.scopes.length - 1; index >= 0; index -= 1) {
|
|
409
|
-
const local2 = this.scopes[index].get(alias);
|
|
410
|
-
if (local2) {
|
|
411
|
-
return local2;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
let local = this.freeLocals.get(alias);
|
|
415
|
-
if (!local) {
|
|
416
|
-
local = this.nextLocal();
|
|
417
|
-
this.freeLocals.set(alias, local);
|
|
418
|
-
}
|
|
419
|
-
return local;
|
|
420
|
-
}
|
|
421
|
-
resolveRadical(alias) {
|
|
422
|
-
let radical = this.radicals.get(alias);
|
|
423
|
-
if (!radical) {
|
|
424
|
-
this.radicalCounter += 1;
|
|
425
|
-
radical = `R${this.radicalCounter}`;
|
|
426
|
-
this.radicals.set(alias, radical);
|
|
427
|
-
}
|
|
428
|
-
return radical;
|
|
429
|
-
}
|
|
430
|
-
startScope() {
|
|
431
|
-
this.scopes.push(/* @__PURE__ */ new Map());
|
|
432
|
-
}
|
|
433
|
-
endScope() {
|
|
434
|
-
this.scopes.pop();
|
|
435
|
-
}
|
|
436
|
-
currentScope() {
|
|
437
|
-
const scope = this.scopes.at(-1);
|
|
438
|
-
if (!scope) {
|
|
439
|
-
throw new Error("Attempted to declare local outside of scope");
|
|
440
|
-
}
|
|
441
|
-
return scope;
|
|
442
|
-
}
|
|
443
|
-
nextLocal() {
|
|
444
|
-
this.localCounter += 1;
|
|
445
|
-
return `a${this.localCounter}`;
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
export {
|
|
449
|
-
generateExpressionFromAst
|
|
11
|
+
options;
|
|
12
|
+
freeLocals = /* @__PURE__ */ new Map();
|
|
13
|
+
radicals = /* @__PURE__ */ new Map();
|
|
14
|
+
scopes = [];
|
|
15
|
+
localCounter = 0;
|
|
16
|
+
radicalCounter = 0;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
/** Run generator. Requires that the AST has no syntax errors. */
|
|
21
|
+
run(ast) {
|
|
22
|
+
if (ast.hasError) throw new Error("Cannot generate expression: AST has error");
|
|
23
|
+
return this.visit(ast, { localDeclaration: false });
|
|
24
|
+
}
|
|
25
|
+
visit(node, context) {
|
|
26
|
+
const shouldScope = this.shouldStartScope(node.typeID);
|
|
27
|
+
if (shouldScope) this.startScope();
|
|
28
|
+
const result = this.renderNode(node, context);
|
|
29
|
+
if (shouldScope) this.endScope();
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
renderNode(node, context) {
|
|
33
|
+
switch (node.typeID) {
|
|
34
|
+
case TokenID.ID_LOCAL: {
|
|
35
|
+
const alias = getNodeText(node);
|
|
36
|
+
return this.options.normalize ? context.localDeclaration ? this.declareLocal(alias) : this.resolveLocal(alias) : alias;
|
|
37
|
+
}
|
|
38
|
+
case TokenID.ID_GLOBAL:
|
|
39
|
+
case TokenID.ID_FUNCTION:
|
|
40
|
+
case TokenID.ID_PREDICATE: return getNodeText(node);
|
|
41
|
+
case TokenID.ID_RADICAL: {
|
|
42
|
+
const alias = getNodeText(node);
|
|
43
|
+
return this.options.normalize ? this.resolveRadical(alias) : alias;
|
|
44
|
+
}
|
|
45
|
+
case TokenID.LIT_INTEGER: return String(node.data.value);
|
|
46
|
+
case TokenID.LIT_WHOLE_NUMBERS: return "Z";
|
|
47
|
+
case TokenID.LIT_EMPTYSET: return "∅";
|
|
48
|
+
case TokenID.BIGPR: return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
|
|
49
|
+
case TokenID.SMALLPR: return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
|
|
50
|
+
case TokenID.FILTER: {
|
|
51
|
+
const args = node.children.slice(0, -1).map((child) => this.visit(child, context)).join(", ");
|
|
52
|
+
const body = this.visitChild(node, node.children.length - 1, context);
|
|
53
|
+
return `Fi${this.formatIndices(node)}[${args}](${body})`;
|
|
54
|
+
}
|
|
55
|
+
case TokenID.CARD: return `card(${this.visitChild(node, 0, context)})`;
|
|
56
|
+
case TokenID.BOOL: return `bool(${this.visitChild(node, 0, context)})`;
|
|
57
|
+
case TokenID.DEBOOL: return `debool(${this.visitChild(node, 0, context)})`;
|
|
58
|
+
case TokenID.REDUCE: return `red(${this.visitChild(node, 0, context)})`;
|
|
59
|
+
case TokenID.BOOLEAN: return this.renderBoolean(node, context);
|
|
60
|
+
case TokenID.NT_FUNC_CALL: return `${this.visitChild(node, 0, context)}[${node.children.slice(1).map((child) => this.visit(child, context)).join(", ")}]`;
|
|
61
|
+
case TokenID.NT_TUPLE: return `(${node.children.map((child) => this.visit(child, context)).join(", ")})`;
|
|
62
|
+
case TokenID.NT_ENUMERATION: return `{${node.children.map((child) => this.visit(child, context)).join(", ")}}`;
|
|
63
|
+
case TokenID.NT_ARGUMENTS:
|
|
64
|
+
case TokenID.NT_ENUM_DECL: return node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ");
|
|
65
|
+
case TokenID.NT_TUPLE_DECL: return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ")})`;
|
|
66
|
+
case TokenID.NT_ARG_DECL: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)}`;
|
|
67
|
+
case TokenID.QUANTOR_UNIVERSAL: return this.renderQuantifier("∀", node, context);
|
|
68
|
+
case TokenID.QUANTOR_EXISTS: return this.renderQuantifier("∃", node, context);
|
|
69
|
+
case TokenID.NT_DECLARATIVE_EXPR: return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
|
|
70
|
+
case TokenID.NT_FUNC_DEFINITION: return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;
|
|
71
|
+
case TokenID.ITERATE: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:∈${this.visitChild(node, 1, context)}`;
|
|
72
|
+
case TokenID.ASSIGN: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;
|
|
73
|
+
case TokenID.NT_IMPERATIVE_EXPR: {
|
|
74
|
+
const statements = node.children.slice(1).map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));
|
|
75
|
+
return `I{${this.visitChild(node, 0, context)} | ${statements.join("; ")}}`;
|
|
76
|
+
}
|
|
77
|
+
case TokenID.NT_RECURSIVE_SHORT: return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
|
|
78
|
+
case TokenID.NT_RECURSIVE_FULL: return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)} | ${this.visitChild(node, 3, context)}}`;
|
|
79
|
+
case TokenID.PLUS: return this.renderInfix("+", node, context);
|
|
80
|
+
case TokenID.MINUS: return this.renderInfix("-", node, context);
|
|
81
|
+
case TokenID.MULTIPLY: return this.renderInfix("*", node, context);
|
|
82
|
+
case TokenID.GREATER: return this.renderInfix(">", node, context);
|
|
83
|
+
case TokenID.LESSER: return this.renderInfix("<", node, context);
|
|
84
|
+
case TokenID.GREATER_OR_EQ: return this.renderInfix("≥", node, context);
|
|
85
|
+
case TokenID.LESSER_OR_EQ: return this.renderInfix("≤", node, context);
|
|
86
|
+
case TokenID.EQUAL: return this.renderInfix("=", node, context);
|
|
87
|
+
case TokenID.NOTEQUAL: return this.renderInfix("≠", node, context);
|
|
88
|
+
case TokenID.LOGIC_AND: return this.renderInfix("&", node, context);
|
|
89
|
+
case TokenID.LOGIC_OR: return this.renderInfix("∨", node, context);
|
|
90
|
+
case TokenID.LOGIC_IMPLICATION: return this.renderInfix("⇒", node, context);
|
|
91
|
+
case TokenID.LOGIC_EQUIVALENT: return this.renderInfix("⇔", node, context);
|
|
92
|
+
case TokenID.SET_IN: return this.renderInfix("∈", node, context);
|
|
93
|
+
case TokenID.SET_NOT_IN: return this.renderInfix("∉", node, context);
|
|
94
|
+
case TokenID.SUBSET: return this.renderInfix("⊂", node, context);
|
|
95
|
+
case TokenID.SUBSET_OR_EQ: return this.renderInfix("⊆", node, context);
|
|
96
|
+
case TokenID.NOT_SUBSET: return this.renderInfix("⊄", node, context);
|
|
97
|
+
case TokenID.DECART: return this.renderInfix("×", node, context);
|
|
98
|
+
case TokenID.SET_UNION: return this.renderInfix("∪", node, context);
|
|
99
|
+
case TokenID.SET_INTERSECTION: return this.renderInfix("∩", node, context);
|
|
100
|
+
case TokenID.SET_MINUS: return this.renderInfix("\\", node, context);
|
|
101
|
+
case TokenID.SET_SYMMETRIC_MINUS: return this.renderInfix("∆", node, context);
|
|
102
|
+
case TokenID.LOGIC_NOT: return `¬${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;
|
|
103
|
+
default: return node.children.map((child) => this.visit(child, context)).join("");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
visitChild(node, index, context) {
|
|
107
|
+
const child = node.children[index];
|
|
108
|
+
if (!child) return "";
|
|
109
|
+
return this.visit(child, this.childContext(node.typeID, index, context));
|
|
110
|
+
}
|
|
111
|
+
renderQuantifier(symbol, node, context) {
|
|
112
|
+
const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));
|
|
113
|
+
const domain = this.visitChild(node, 1, context);
|
|
114
|
+
const bodyNode = node.children[2];
|
|
115
|
+
const bodyText = this.visitChild(node, 2, context);
|
|
116
|
+
return `${symbol}${declaration}∈${domain} ${bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText}`;
|
|
117
|
+
}
|
|
118
|
+
shouldWrapQuantifierBody(node) {
|
|
119
|
+
const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);
|
|
120
|
+
const bodyPrecedence = this.getPrecedence(node.typeID);
|
|
121
|
+
if (quantifierPrecedence === null || bodyPrecedence === null) return false;
|
|
122
|
+
return bodyPrecedence < quantifierPrecedence;
|
|
123
|
+
}
|
|
124
|
+
renderInfix(symbol, node, context) {
|
|
125
|
+
if (this.isLogicBinary(node.typeID)) return node.children.map((child, index) => {
|
|
126
|
+
const text = this.visit(child, context);
|
|
127
|
+
return this.needParen(node, child, index) ? `(${text})` : text;
|
|
128
|
+
}).join(` ${symbol} `);
|
|
129
|
+
return node.children.map((child) => this.wrapIfNeeded(this.visit(child, context), child)).join(symbol);
|
|
130
|
+
}
|
|
131
|
+
needParen(parent, child, childIndex) {
|
|
132
|
+
if (this.isAtomic(child.typeID)) return false;
|
|
133
|
+
const parentPrecedence = this.getPrecedence(parent.typeID);
|
|
134
|
+
const childPrecedence = this.getPrecedence(child.typeID);
|
|
135
|
+
if (parentPrecedence === null || childPrecedence === null) return true;
|
|
136
|
+
if (childPrecedence > parentPrecedence) return false;
|
|
137
|
+
if (childPrecedence < parentPrecedence) return true;
|
|
138
|
+
if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) return false;
|
|
139
|
+
if (this.isLeftAssociative(parent.typeID)) return childIndex > 0;
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
getPrecedence(typeID) {
|
|
143
|
+
switch (typeID) {
|
|
144
|
+
case TokenID.LOGIC_EQUIVALENT: return 1;
|
|
145
|
+
case TokenID.LOGIC_IMPLICATION: return 2;
|
|
146
|
+
case TokenID.LOGIC_OR: return 3;
|
|
147
|
+
case TokenID.LOGIC_AND: return 4;
|
|
148
|
+
case TokenID.QUANTOR_UNIVERSAL:
|
|
149
|
+
case TokenID.QUANTOR_EXISTS: return 5;
|
|
150
|
+
case TokenID.EQUAL:
|
|
151
|
+
case TokenID.NOTEQUAL:
|
|
152
|
+
case TokenID.GREATER:
|
|
153
|
+
case TokenID.LESSER:
|
|
154
|
+
case TokenID.GREATER_OR_EQ:
|
|
155
|
+
case TokenID.LESSER_OR_EQ:
|
|
156
|
+
case TokenID.SET_IN:
|
|
157
|
+
case TokenID.SET_NOT_IN:
|
|
158
|
+
case TokenID.SUBSET:
|
|
159
|
+
case TokenID.SUBSET_OR_EQ:
|
|
160
|
+
case TokenID.NOT_SUBSET: return 6;
|
|
161
|
+
case TokenID.PLUS:
|
|
162
|
+
case TokenID.MINUS:
|
|
163
|
+
case TokenID.SET_UNION:
|
|
164
|
+
case TokenID.SET_SYMMETRIC_MINUS: return 7;
|
|
165
|
+
case TokenID.MULTIPLY:
|
|
166
|
+
case TokenID.DECART:
|
|
167
|
+
case TokenID.SET_INTERSECTION:
|
|
168
|
+
case TokenID.SET_MINUS: return 8;
|
|
169
|
+
default: return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
isAssociative(typeID) {
|
|
173
|
+
return typeID === TokenID.PLUS || typeID === TokenID.MULTIPLY || typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_EQUIVALENT || typeID === TokenID.SET_UNION || typeID === TokenID.SET_INTERSECTION || typeID === TokenID.DECART;
|
|
174
|
+
}
|
|
175
|
+
isLeftAssociative(typeID) {
|
|
176
|
+
return typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.MINUS || typeID === TokenID.SET_MINUS || typeID === TokenID.SET_SYMMETRIC_MINUS;
|
|
177
|
+
}
|
|
178
|
+
renderBoolean(node, context) {
|
|
179
|
+
let current = node;
|
|
180
|
+
let depth = 0;
|
|
181
|
+
while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {
|
|
182
|
+
depth += 1;
|
|
183
|
+
current = current.children[0];
|
|
184
|
+
}
|
|
185
|
+
return `${"ℬ".repeat(depth)}(${this.visit(current, context)})`;
|
|
186
|
+
}
|
|
187
|
+
wrapIfNeeded(text, node) {
|
|
188
|
+
if (this.isAtomic(node.typeID)) return text;
|
|
189
|
+
return `(${text})`;
|
|
190
|
+
}
|
|
191
|
+
isAtomic(typeID) {
|
|
192
|
+
return typeID === TokenID.ID_LOCAL || typeID === TokenID.ID_GLOBAL || typeID === TokenID.ID_FUNCTION || typeID === TokenID.ID_PREDICATE || typeID === TokenID.ID_RADICAL || typeID === TokenID.LIT_INTEGER || typeID === TokenID.LIT_WHOLE_NUMBERS || typeID === TokenID.LIT_EMPTYSET || typeID === TokenID.NT_FUNC_CALL || typeID === TokenID.NT_TUPLE || typeID === TokenID.NT_ENUMERATION || typeID === TokenID.BIGPR || typeID === TokenID.SMALLPR || typeID === TokenID.FILTER || typeID === TokenID.REDUCE || typeID === TokenID.BOOL || typeID === TokenID.DEBOOL || typeID === TokenID.CARD || typeID === TokenID.BOOLEAN;
|
|
193
|
+
}
|
|
194
|
+
isLogicBinary(typeID) {
|
|
195
|
+
return typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.LOGIC_EQUIVALENT;
|
|
196
|
+
}
|
|
197
|
+
formatIndices(node) {
|
|
198
|
+
return getNodeIndices(node).join(",");
|
|
199
|
+
}
|
|
200
|
+
shouldStartScope(typeID) {
|
|
201
|
+
return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.NT_FUNC_DEFINITION || typeID === TokenID.NT_IMPERATIVE_EXPR || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL;
|
|
202
|
+
}
|
|
203
|
+
childContext(typeID, index, parent) {
|
|
204
|
+
if (!this.options.normalize) return parent;
|
|
205
|
+
return { localDeclaration: (typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.ITERATE || typeID === TokenID.ASSIGN || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL) && index === 0 || typeID === TokenID.NT_FUNC_DEFINITION && index === 0 || typeID === TokenID.NT_ARG_DECL && index === 0 || typeID === TokenID.NT_TUPLE_DECL || typeID === TokenID.NT_ENUM_DECL };
|
|
206
|
+
}
|
|
207
|
+
declareLocal(alias) {
|
|
208
|
+
const scope = this.currentScope();
|
|
209
|
+
const local = this.nextLocal();
|
|
210
|
+
scope.set(alias, local);
|
|
211
|
+
return local;
|
|
212
|
+
}
|
|
213
|
+
resolveLocal(alias) {
|
|
214
|
+
for (let index = this.scopes.length - 1; index >= 0; index -= 1) {
|
|
215
|
+
const local = this.scopes[index].get(alias);
|
|
216
|
+
if (local) return local;
|
|
217
|
+
}
|
|
218
|
+
let local = this.freeLocals.get(alias);
|
|
219
|
+
if (!local) {
|
|
220
|
+
local = this.nextLocal();
|
|
221
|
+
this.freeLocals.set(alias, local);
|
|
222
|
+
}
|
|
223
|
+
return local;
|
|
224
|
+
}
|
|
225
|
+
resolveRadical(alias) {
|
|
226
|
+
let radical = this.radicals.get(alias);
|
|
227
|
+
if (!radical) {
|
|
228
|
+
this.radicalCounter += 1;
|
|
229
|
+
radical = `R${this.radicalCounter}`;
|
|
230
|
+
this.radicals.set(alias, radical);
|
|
231
|
+
}
|
|
232
|
+
return radical;
|
|
233
|
+
}
|
|
234
|
+
startScope() {
|
|
235
|
+
this.scopes.push(/* @__PURE__ */ new Map());
|
|
236
|
+
}
|
|
237
|
+
endScope() {
|
|
238
|
+
this.scopes.pop();
|
|
239
|
+
}
|
|
240
|
+
currentScope() {
|
|
241
|
+
const scope = this.scopes.at(-1);
|
|
242
|
+
if (!scope) throw new Error("Attempted to declare local outside of scope");
|
|
243
|
+
return scope;
|
|
244
|
+
}
|
|
245
|
+
nextLocal() {
|
|
246
|
+
this.localCounter += 1;
|
|
247
|
+
return `a${this.localCounter}`;
|
|
248
|
+
}
|
|
450
249
|
};
|
|
250
|
+
//#endregion
|
|
251
|
+
export { generateExpressionFromAst };
|
|
252
|
+
|
|
451
253
|
//# sourceMappingURL=expression-generator.js.map
|