@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.
Files changed (183) hide show
  1. package/README.md +3 -3
  2. package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
  3. package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
  4. package/dist/ast-C8sIpKdL.d.ts +51 -0
  5. package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
  6. package/dist/branded-ZlzIcxzu.d.ts +9 -0
  7. package/dist/calculator-C9W2jkSx.d.ts +39 -0
  8. package/dist/cctext/index.d.ts +2 -1
  9. package/dist/cctext/index.js +2 -42
  10. package/dist/cctext/language-api.d.ts +10 -12
  11. package/dist/cctext/language-api.js +157 -227
  12. package/dist/cctext/language-api.js.map +1 -1
  13. package/dist/cctext/language.d.ts +24 -22
  14. package/dist/cctext/language.js +43 -39
  15. package/dist/cctext/language.js.map +1 -1
  16. package/dist/error-E1LVq_3w.d.ts +87 -0
  17. package/dist/graph/graph.d.ts +2 -62
  18. package/dist/graph/graph.js +339 -382
  19. package/dist/graph/graph.js.map +1 -1
  20. package/dist/graph/index.d.ts +2 -1
  21. package/dist/graph/index.js +2 -384
  22. package/dist/graph-DR8rL2o3.d.ts +64 -0
  23. package/dist/hash-Y8I4c6Al.d.ts +8 -0
  24. package/dist/index-BKZ67WMa.d.ts +1 -0
  25. package/dist/index-BVVgDSdq.d.ts +1 -0
  26. package/dist/index-DmtQKWjk.d.ts +1 -0
  27. package/dist/index-_6s0AX1B.d.ts +1 -0
  28. package/dist/index.d.ts +27 -28
  29. package/dist/index.js +23 -5851
  30. package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
  31. package/dist/library/folder-tree.d.ts +22 -20
  32. package/dist/library/folder-tree.js +108 -130
  33. package/dist/library/folder-tree.js.map +1 -1
  34. package/dist/library/index.d.ts +8 -17
  35. package/dist/library/index.js +7 -2800
  36. package/dist/library/library-api.d.ts +3 -1
  37. package/dist/library/library-api.js +9 -8
  38. package/dist/library/library-api.js.map +1 -1
  39. package/dist/library/library.d.ts +2 -56
  40. package/dist/library/library.js +23 -19
  41. package/dist/library/library.js.map +1 -1
  42. package/dist/library/oss-api.d.ts +26 -37
  43. package/dist/library/oss-api.js +257 -1096
  44. package/dist/library/oss-api.js.map +1 -1
  45. package/dist/library/oss-layout-api.d.ts +28 -28
  46. package/dist/library/oss-layout-api.js +239 -316
  47. package/dist/library/oss-layout-api.js.map +1 -1
  48. package/dist/library/oss-layout.d.ts +2 -25
  49. package/dist/library/oss-layout.js +1 -1
  50. package/dist/library/oss.d.ts +87 -89
  51. package/dist/library/oss.js +27 -26
  52. package/dist/library/oss.js.map +1 -1
  53. package/dist/library/rsengine.d.ts +100 -106
  54. package/dist/library/rsengine.js +439 -2599
  55. package/dist/library/rsengine.js.map +1 -1
  56. package/dist/library/rsform-api.d.ts +11 -16
  57. package/dist/library/rsform-api.js +313 -825
  58. package/dist/library/rsform-api.js.map +1 -1
  59. package/dist/library/rsform.d.ts +159 -167
  60. package/dist/library/rsform.js +29 -28
  61. package/dist/library/rsform.js.map +1 -1
  62. package/dist/library/rsmodel-api.d.ts +8 -15
  63. package/dist/library/rsmodel-api.js +172 -813
  64. package/dist/library/rsmodel-api.js.map +1 -1
  65. package/dist/library/rsmodel.d.ts +27 -33
  66. package/dist/library/rsmodel.js +16 -23
  67. package/dist/library/rsmodel.js.map +1 -1
  68. package/dist/library/structure-planner.d.ts +20 -26
  69. package/dist/library/structure-planner.js +106 -474
  70. package/dist/library/structure-planner.js.map +1 -1
  71. package/dist/library-CYun28Xz.d.ts +58 -0
  72. package/dist/oss-layout-3glgAqfn.d.ts +27 -0
  73. package/dist/parser-Bwd8LxJ1.d.ts +7 -0
  74. package/dist/parsing/ast.d.ts +2 -49
  75. package/dist/parsing/ast.js +68 -76
  76. package/dist/parsing/ast.js.map +1 -1
  77. package/dist/parsing/index.d.ts +3 -3
  78. package/dist/parsing/index.js +3 -141
  79. package/dist/parsing/lezer-tree.d.ts +2 -13
  80. package/dist/parsing/lezer-tree.js +50 -43
  81. package/dist/parsing/lezer-tree.js.map +1 -1
  82. package/dist/rslang/api.d.ts +9 -14
  83. package/dist/rslang/api.js +114 -827
  84. package/dist/rslang/api.js.map +1 -1
  85. package/dist/rslang/ast-annotations.d.ts +2 -18
  86. package/dist/rslang/ast-annotations.js +34 -45
  87. package/dist/rslang/ast-annotations.js.map +1 -1
  88. package/dist/rslang/error.d.ts +2 -85
  89. package/dist/rslang/error.js +88 -150
  90. package/dist/rslang/error.js.map +1 -1
  91. package/dist/rslang/eval/calculator.d.ts +2 -43
  92. package/dist/rslang/eval/calculator.js +81 -1636
  93. package/dist/rslang/eval/calculator.js.map +1 -1
  94. package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
  95. package/dist/rslang/eval/evaluation-cache.js +168 -287
  96. package/dist/rslang/eval/evaluation-cache.js.map +1 -1
  97. package/dist/rslang/eval/evaluator.d.ts +59 -63
  98. package/dist/rslang/eval/evaluator.js +602 -1509
  99. package/dist/rslang/eval/evaluator.js.map +1 -1
  100. package/dist/rslang/eval/value-api.d.ts +2 -48
  101. package/dist/rslang/eval/value-api.js +2 -490
  102. package/dist/rslang/eval/value.d.ts +2 -36
  103. package/dist/rslang/eval/value.js +2 -118
  104. package/dist/rslang/index.d.ts +14 -17
  105. package/dist/rslang/index.js +12 -4314
  106. package/dist/rslang/labels.d.ts +6 -6
  107. package/dist/rslang/labels.js +139 -305
  108. package/dist/rslang/labels.js.map +1 -1
  109. package/dist/rslang/parser/expression-generator.d.ts +5 -5
  110. package/dist/rslang/parser/expression-generator.js +248 -446
  111. package/dist/rslang/parser/expression-generator.js.map +1 -1
  112. package/dist/rslang/parser/normalize.d.ts +4 -8
  113. package/dist/rslang/parser/normalize.js +286 -481
  114. package/dist/rslang/parser/normalize.js.map +1 -1
  115. package/dist/rslang/parser/parser.d.ts +2 -5
  116. package/dist/rslang/parser/parser.js +30 -21
  117. package/dist/rslang/parser/parser.js.map +1 -1
  118. package/dist/rslang/parser/parser.terms.d.ts +43 -41
  119. package/dist/rslang/parser/parser.terms.js +44 -83
  120. package/dist/rslang/parser/parser.terms.js.map +1 -1
  121. package/dist/rslang/parser/syntax-errors.d.ts +5 -8
  122. package/dist/rslang/parser/syntax-errors.js +113 -382
  123. package/dist/rslang/parser/syntax-errors.js.map +1 -1
  124. package/dist/rslang/parser/token.d.ts +2 -79
  125. package/dist/rslang/parser/token.js +81 -93
  126. package/dist/rslang/parser/token.js.map +1 -1
  127. package/dist/rslang/semantic/analyzer.d.ts +2 -39
  128. package/dist/rslang/semantic/analyzer.js +186 -2600
  129. package/dist/rslang/semantic/analyzer.js.map +1 -1
  130. package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
  131. package/dist/rslang/semantic/arguments-extractor.js +202 -361
  132. package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
  133. package/dist/rslang/semantic/type-auditor.d.ts +64 -68
  134. package/dist/rslang/semantic/type-auditor.js +594 -1564
  135. package/dist/rslang/semantic/type-auditor.js.map +1 -1
  136. package/dist/rslang/semantic/typification-api.d.ts +4 -7
  137. package/dist/rslang/semantic/typification-api.js +162 -303
  138. package/dist/rslang/semantic/typification-api.js.map +1 -1
  139. package/dist/rslang/semantic/typification-parser.d.ts +2 -12
  140. package/dist/rslang/semantic/typification-parser.js +165 -219
  141. package/dist/rslang/semantic/typification-parser.js.map +1 -1
  142. package/dist/rslang/semantic/typification.d.ts +2 -119
  143. package/dist/rslang/semantic/typification.js +66 -52
  144. package/dist/rslang/semantic/typification.js.map +1 -1
  145. package/dist/rslang/semantic/value-auditor.d.ts +32 -38
  146. package/dist/rslang/semantic/value-auditor.js +206 -518
  147. package/dist/rslang/semantic/value-auditor.js.map +1 -1
  148. package/dist/rslang/semantic/value-class.d.ts +2 -10
  149. package/dist/rslang/semantic/value-class.js +8 -7
  150. package/dist/rslang/semantic/value-class.js.map +1 -1
  151. package/dist/rslang/typification-graph.d.ts +2 -33
  152. package/dist/rslang/typification-graph.js +94 -306
  153. package/dist/rslang/typification-graph.js.map +1 -1
  154. package/dist/shared/branded.d.ts +2 -7
  155. package/dist/shared/branded.js +1 -1
  156. package/dist/shared/hash.d.ts +2 -6
  157. package/dist/shared/hash.js +13 -13
  158. package/dist/shared/hash.js.map +1 -1
  159. package/dist/shared/index.d.ts +3 -2
  160. package/dist/shared/index.js +2 -18
  161. package/dist/token-DeXAmzwr.d.ts +81 -0
  162. package/dist/typification-Dk-fisgO.d.ts +120 -0
  163. package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
  164. package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
  165. package/dist/value-B8UtCqaK.js +366 -0
  166. package/dist/value-B8UtCqaK.js.map +1 -0
  167. package/dist/value-CTjX6825.d.ts +33 -0
  168. package/dist/value-api-Bw-SgaYY.d.ts +49 -0
  169. package/dist/value-class-CNI-lqXJ.d.ts +12 -0
  170. package/package.json +8 -8
  171. package/src/library/rsform-api.test.ts +24 -0
  172. package/src/library/rsform-api.ts +12 -4
  173. package/dist/cctext/index.js.map +0 -1
  174. package/dist/graph/index.js.map +0 -1
  175. package/dist/index.js.map +0 -1
  176. package/dist/library/index.js.map +0 -1
  177. package/dist/library/oss-layout.js.map +0 -1
  178. package/dist/parsing/index.js.map +0 -1
  179. package/dist/rslang/eval/value-api.js.map +0 -1
  180. package/dist/rslang/eval/value.js.map +0 -1
  181. package/dist/rslang/index.js.map +0 -1
  182. package/dist/shared/branded.js.map +0 -1
  183. package/dist/shared/index.js.map +0 -1
@@ -1,4314 +1,12 @@
1
- // src/rslang/ast-annotations.ts
2
- var AST_ERRORS_KEY = "rsErrors";
3
- var AST_TYPE_KEY = "rsType";
4
- function annotateType(node, type) {
5
- node.annotation = {
6
- ...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
7
- [AST_TYPE_KEY]: type
8
- };
9
- }
10
- function readTypeAnnotation(node) {
11
- if (node.annotation && AST_TYPE_KEY in node.annotation) {
12
- return node.annotation[AST_TYPE_KEY];
13
- }
14
- return null;
15
- }
16
- function annotateError(node, code, params) {
17
- if (typeof node.annotation === "object" && node.annotation !== null && AST_ERRORS_KEY in node.annotation && isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])) {
18
- return;
19
- }
20
- const entry = params !== void 0 && params.length > 0 ? { code, params: [...params] } : { code };
21
- node.annotation = {
22
- ...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
23
- [AST_ERRORS_KEY]: entry
24
- };
25
- }
26
- function readErrorAnnotation(node) {
27
- const raw = node.annotation?.[AST_ERRORS_KEY];
28
- if (isAstNodeErrorRef(raw)) {
29
- return raw;
30
- }
31
- return null;
32
- }
33
- function isAstNodeErrorRef(x) {
34
- if (typeof x !== "object" || x === null || !("code" in x)) {
35
- return false;
36
- }
37
- const code = x.code;
38
- if (typeof code !== "number") {
39
- return false;
40
- }
41
- if (!("params" in x)) {
42
- return true;
43
- }
44
- const p = x.params;
45
- if (p === void 0) {
46
- return true;
47
- }
48
- return Array.isArray(p) && p.every((item) => typeof item === "string");
49
- }
50
-
51
- // src/rslang/error.ts
52
- var RSErrorCode = {
53
- unknownSyntax: 33792,
54
- // 33792
55
- missingParenthesis: 33798,
56
- // 33798
57
- missingCurlyBrace: 33799,
58
- // 33799
59
- missingSquareBracket: 33800,
60
- // 33800
61
- bracketMismatch: 33801,
62
- // 33801
63
- doubleParenthesis: 33802,
64
- // 33802
65
- missingOpenBracket: 33803,
66
- // 33803
67
- expectedLocal: 33813,
68
- // 33813
69
- expectedType: 33814,
70
- // 33814
71
- localDoubleDeclare: 10241,
72
- // 10241
73
- localNotUsed: 10242,
74
- // 10242
75
- localUndeclared: 34817,
76
- // 34817
77
- localShadowing: 34818,
78
- // 34818
79
- typesNotEqual: 34819,
80
- // 34819
81
- globalNotTyped: 34820,
82
- // 34820
83
- invalidDecart: 34821,
84
- // 34821
85
- invalidBoolean: 34822,
86
- // 34822
87
- invalidTypeOperation: 34823,
88
- // 34823
89
- invalidCard: 34824,
90
- // 34824
91
- invalidDebool: 34825,
92
- // 34825
93
- globalFuncWithoutArgs: 34827,
94
- // 34827
95
- invalidReduce: 34832,
96
- // 34832
97
- invalidProjectionTuple: 34833,
98
- // 34833
99
- invalidProjectionSet: 34834,
100
- // 34834
101
- invalidEnumeration: 34835,
102
- // 34835
103
- invalidCortegeDeclare: 34836,
104
- // 34836
105
- localOutOfScope: 34837,
106
- // 34837
107
- invalidElementPredicate: 34838,
108
- // 34838
109
- invalidEmptySetUsage: 34839,
110
- // 34839
111
- invalidArgsArity: 34840,
112
- // 34840
113
- invalidArgumentType: 34841,
114
- // 34841
115
- globalStructure: 34844,
116
- // 34844
117
- radicalUsage: 34849,
118
- // 34849
119
- invalidFilterArgumentType: 34850,
120
- // 34850
121
- invalidFilterArity: 34851,
122
- // 34851
123
- arithmeticNotSupported: 34852,
124
- // 34852
125
- typesNotCompatible: 34853,
126
- // 34853
127
- orderingNotSupported: 34854,
128
- // 34854
129
- expectedLogic: 34855,
130
- // 34855
131
- expectedSetexpr: 34856,
132
- // 34856
133
- invalidArgumentCortegeDeclare: 34857,
134
- // 34857
135
- globalNoValue: 34880,
136
- // 34880
137
- invalidPropertyUsage: 34881,
138
- // 34881
139
- // Value evaluation (runtime)
140
- calcUnknownError: 33024,
141
- // 35328
142
- setOverflow: 33025,
143
- // 35329
144
- booleanBaseLimit: 33026,
145
- // 35330
146
- calcGlobalMissing: 33027,
147
- // 35331
148
- iterationsLimit: 33028,
149
- // 35332
150
- calcInvalidDebool: 33029,
151
- // 35333
152
- iterateInfinity: 33030,
153
- // 35334
154
- calculationNotSupported: 33031,
155
- // 35335
156
- cstEmptyDerived: 34913,
157
- // 34913
158
- definitionNotAllowed: 34914
159
- // 34914
160
- };
161
-
162
- // src/parsing/ast.ts
163
- var TOKEN_ERROR = 0;
164
- function buildTree(cursor) {
165
- let nextUid = 1;
166
- function genUid() {
167
- return nextUid++;
168
- }
169
- return buildTreeInternal(cursor, null, genUid);
170
- }
171
- function visitAstDFS(node, callback) {
172
- for (const child of node.children) {
173
- visitAstDFS(child, callback);
174
- }
175
- callback(node);
176
- }
177
- function getNodeText(node) {
178
- if (node.data.dataType === "string" && typeof node.data.value === "string") {
179
- return node.data.value;
180
- }
181
- return `NO DATA NODE: ${node.typeID}`;
182
- }
183
- function getNodeIndices(node) {
184
- if (node.data.dataType === "string[]" && Array.isArray(node.data.value)) {
185
- return node.data.value.map((s) => parseInt(s, 10)).filter((n) => !isNaN(n));
186
- }
187
- return [];
188
- }
189
- function buildTreeInternal(cursor, parent = null, genUid) {
190
- const node = cursor.node;
191
- const result = {
192
- uid: genUid(),
193
- typeID: node.type.isError ? 0 : node.type.id,
194
- from: node.from,
195
- to: node.to,
196
- hasError: node.type.isError,
197
- data: node.type.isError ? { dataType: "null", value: null } : { dataType: "string", value: node.type.name },
198
- parent,
199
- children: []
200
- };
201
- if (cursor.firstChild()) {
202
- do {
203
- const child = buildTreeInternal(cursor, result, genUid);
204
- if (child.hasError) {
205
- result.hasError = true;
206
- }
207
- result.children.push(child);
208
- } while (cursor.nextSibling());
209
- cursor.parent();
210
- }
211
- return result;
212
- }
213
-
214
- // src/rslang/parser/token.ts
215
- var TokenID = {
216
- // Global, local IDs and literals
217
- ERROR: TOKEN_ERROR,
218
- ID_LOCAL: 258,
219
- ID_GLOBAL: 259,
220
- ID_FUNCTION: 260,
221
- ID_PREDICATE: 261,
222
- ID_RADICAL: 262,
223
- LIT_INTEGER: 263,
224
- LIT_WHOLE_NUMBERS: 264,
225
- LIT_EMPTYSET: 265,
226
- // Arithmetic
227
- PLUS: 266,
228
- MINUS: 267,
229
- MULTIPLY: 268,
230
- // Integer predicate symbols
231
- GREATER: 269,
232
- LESSER: 270,
233
- GREATER_OR_EQ: 271,
234
- LESSER_OR_EQ: 272,
235
- // Equality comparison
236
- EQUAL: 273,
237
- NOTEQUAL: 274,
238
- // Logic predicate symbols
239
- QUANTOR_UNIVERSAL: 275,
240
- QUANTOR_EXISTS: 276,
241
- LOGIC_NOT: 277,
242
- LOGIC_EQUIVALENT: 278,
243
- LOGIC_IMPLICATION: 279,
244
- LOGIC_OR: 280,
245
- LOGIC_AND: 281,
246
- // Set theory predicate symbols
247
- SET_IN: 282,
248
- SET_NOT_IN: 283,
249
- SUBSET: 284,
250
- SUBSET_OR_EQ: 285,
251
- NOT_SUBSET: 286,
252
- // Set theory operators
253
- DECART: 287,
254
- SET_UNION: 288,
255
- SET_INTERSECTION: 289,
256
- SET_MINUS: 290,
257
- SET_SYMMETRIC_MINUS: 291,
258
- BOOLEAN: 292,
259
- // Structure operations
260
- BIGPR: 293,
261
- SMALLPR: 294,
262
- FILTER: 295,
263
- CARD: 296,
264
- BOOL: 297,
265
- DEBOOL: 298,
266
- REDUCE: 299,
267
- // Term constructions prefixes
268
- DECLARATIVE: 300,
269
- RECURSIVE: 301,
270
- IMPERATIVE: 302,
271
- ITERATE: 303,
272
- ASSIGN: 304,
273
- // Punctuation
274
- PUNCTUATION_DEFINE: 305,
275
- PUNCTUATION_STRUCT: 306,
276
- PUNCTUATION_PL: 307,
277
- PUNCTUATION_PR: 308,
278
- PUNCTUATION_CL: 309,
279
- PUNCTUATION_CR: 310,
280
- PUNCTUATION_SL: 311,
281
- PUNCTUATION_SR: 312,
282
- PUNCTUATION_BAR: 313,
283
- PUNCTUATION_COMMA: 314,
284
- PUNCTUATION_SEMICOLON: 315,
285
- // ======= Non-terminal tokens =========
286
- NT_ENUM_DECL: 316,
287
- NT_TUPLE: 317,
288
- NT_ENUMERATION: 318,
289
- NT_TUPLE_DECL: 319,
290
- NT_ARG_DECL: 320,
291
- NT_FUNC_DEFINITION: 321,
292
- NT_ARGUMENTS: 322,
293
- NT_FUNC_CALL: 323,
294
- NT_DECLARATIVE_EXPR: 324,
295
- NT_IMPERATIVE_EXPR: 325,
296
- NT_RECURSIVE_FULL: 326,
297
- NT_RECURSIVE_SHORT: 327,
298
- // ======= Helper tokens ========
299
- INTERRUPT: 328,
300
- END: 329
301
- };
302
-
303
- // src/rslang/eval/evaluation-cache.ts
304
- var EvaluationMetadata = class {
305
- byNode = /* @__PURE__ */ new WeakMap();
306
- get(node) {
307
- let info = this.byNode.get(node);
308
- if (!info) {
309
- info = analyzeNode(node, /* @__PURE__ */ new Set());
310
- this.byNode.set(node, info);
311
- }
312
- return info;
313
- }
314
- };
315
- var EvaluationCache = class {
316
- entries = /* @__PURE__ */ new Map();
317
- /** Cache hits in the current evaluation run (for tests/diagnostics). */
318
- hits = 0;
319
- /** Returns cached value, or `undefined` on miss or stamp mismatch. */
320
- lookup(structuralKey, stamp) {
321
- const entry = this.entries.get(structuralKey);
322
- if (entry?.stamp !== stamp) {
323
- return void 0;
324
- }
325
- this.hits++;
326
- return entry.value;
327
- }
328
- /** Stores one value per structural key (replaces previous stamp). */
329
- store(structuralKey, stamp, value) {
330
- this.entries.set(structuralKey, { stamp, value });
331
- }
332
- clear() {
333
- this.entries.clear();
334
- this.hits = 0;
335
- }
336
- };
337
- function analyzeNode(node, bound) {
338
- const reads = collectReads(node, bound);
339
- const structuralKey = buildStructuralKey(node);
340
- const cacheable = isCacheableNode(node);
341
- return { reads, structuralKey, cacheable };
342
- }
343
- function isCacheableNode(node) {
344
- switch (node.typeID) {
345
- case TokenID.ASSIGN:
346
- case TokenID.ITERATE:
347
- case TokenID.NT_IMPERATIVE_EXPR:
348
- case TokenID.NT_DECLARATIVE_EXPR:
349
- case TokenID.NT_RECURSIVE_FULL:
350
- case TokenID.NT_RECURSIVE_SHORT:
351
- case TokenID.QUANTOR_UNIVERSAL:
352
- case TokenID.QUANTOR_EXISTS:
353
- case TokenID.LOGIC_AND:
354
- case TokenID.LOGIC_OR:
355
- case TokenID.LOGIC_IMPLICATION:
356
- case TokenID.NT_FUNC_DEFINITION:
357
- case TokenID.LIT_INTEGER:
358
- case TokenID.LIT_EMPTYSET:
359
- case TokenID.LIT_WHOLE_NUMBERS:
360
- case TokenID.ID_LOCAL:
361
- case TokenID.ID_RADICAL:
362
- case TokenID.ID_GLOBAL:
363
- return false;
364
- default:
365
- return !node.hasError;
366
- }
367
- }
368
- function buildStructuralKey(node) {
369
- switch (node.typeID) {
370
- case TokenID.ID_GLOBAL:
371
- case TokenID.ID_LOCAL:
372
- case TokenID.ID_RADICAL:
373
- case TokenID.LIT_INTEGER:
374
- case TokenID.LIT_EMPTYSET:
375
- case TokenID.LIT_WHOLE_NUMBERS:
376
- return `${node.typeID}:${nodeTextKey(node)}`;
377
- case TokenID.NT_FUNC_CALL:
378
- return `${node.typeID}:${nodeTextKey(node.children[0])}(${node.children.slice(1).map(buildStructuralKey).join(",")})`;
379
- case TokenID.BIGPR:
380
- case TokenID.SMALLPR:
381
- case TokenID.FILTER:
382
- return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(",")})`;
383
- default:
384
- return `${node.typeID}(${node.children.map(buildStructuralKey).join(",")})`;
385
- }
386
- }
387
- function nodeTextKey(node) {
388
- if (node.data.dataType === "number") {
389
- return String(node.data.value);
390
- }
391
- return getNodeText(node);
392
- }
393
- function indicesKey(node) {
394
- return getNodeIndices(node).join(".");
395
- }
396
- function collectReads(node, bound) {
397
- const reads = /* @__PURE__ */ new Set();
398
- collectReadsImpl(node, bound, reads);
399
- return reads;
400
- }
401
- function collectReadsImpl(node, bound, reads) {
402
- switch (node.typeID) {
403
- case TokenID.ID_LOCAL:
404
- case TokenID.ID_RADICAL: {
405
- reads.add(getNodeText(node));
406
- return;
407
- }
408
- case TokenID.QUANTOR_UNIVERSAL:
409
- case TokenID.QUANTOR_EXISTS: {
410
- collectReadsImpl(node.children[1], bound, reads);
411
- const innerBound = extendBound(bound, node.children[0]);
412
- collectReadsImpl(node.children[2], innerBound, reads);
413
- return;
414
- }
415
- case TokenID.NT_DECLARATIVE_EXPR: {
416
- collectReadsImpl(node.children[1], bound, reads);
417
- const innerBound = extendBound(bound, node.children[0]);
418
- collectReadsImpl(node.children[2], innerBound, reads);
419
- return;
420
- }
421
- case TokenID.ITERATE: {
422
- collectReadsImpl(node.children[1], bound, reads);
423
- return;
424
- }
425
- case TokenID.ASSIGN: {
426
- collectReadsImpl(node.children[1], bound, reads);
427
- return;
428
- }
429
- case TokenID.NT_IMPERATIVE_EXPR: {
430
- const innerBound = new Set(bound);
431
- collectReadsImpl(node.children[0], innerBound, reads);
432
- for (let i = 1; i < node.children.length; i++) {
433
- const child = node.children[i];
434
- if (child.typeID === TokenID.ITERATE) {
435
- extendBoundInPlace(innerBound, child.children[0]);
436
- collectReadsImpl(child.children[1], innerBound, reads);
437
- } else if (child.typeID === TokenID.ASSIGN) {
438
- collectReadsImpl(child.children[1], innerBound, reads);
439
- extendBoundInPlace(innerBound, child.children[0]);
440
- } else {
441
- collectReadsImpl(child, innerBound, reads);
442
- }
443
- }
444
- return;
445
- }
446
- case TokenID.NT_RECURSIVE_FULL:
447
- case TokenID.NT_RECURSIVE_SHORT: {
448
- collectReadsImpl(node.children[1], bound, reads);
449
- const innerBound = extendBound(bound, node.children[0]);
450
- if (node.typeID === TokenID.NT_RECURSIVE_FULL) {
451
- collectReadsImpl(node.children[2], innerBound, reads);
452
- collectReadsImpl(node.children[3], innerBound, reads);
453
- } else {
454
- collectReadsImpl(node.children[2], innerBound, reads);
455
- }
456
- return;
457
- }
458
- case TokenID.NT_FUNC_DEFINITION: {
459
- const innerBound = extendBound(bound, node.children[0]);
460
- collectReadsImpl(node.children[1], innerBound, reads);
461
- return;
462
- }
463
- case TokenID.NT_FUNC_CALL: {
464
- for (let i = 1; i < node.children.length; i++) {
465
- collectReadsImpl(node.children[i], bound, reads);
466
- }
467
- return;
468
- }
469
- case TokenID.LOGIC_AND:
470
- case TokenID.LOGIC_OR:
471
- case TokenID.LOGIC_IMPLICATION: {
472
- collectReadsImpl(node.children[0], bound, reads);
473
- collectReadsImpl(node.children[1], bound, reads);
474
- return;
475
- }
476
- default:
477
- for (const child of node.children) {
478
- collectReadsImpl(child, bound, reads);
479
- }
480
- }
481
- }
482
- function extendBound(bound, declNode) {
483
- const next = new Set(bound);
484
- extendBoundInPlace(next, declNode);
485
- return next;
486
- }
487
- function extendBoundInPlace(bound, declNode) {
488
- switch (declNode.typeID) {
489
- case TokenID.ID_LOCAL:
490
- case TokenID.ID_RADICAL:
491
- bound.add(getNodeText(declNode));
492
- break;
493
- case TokenID.NT_TUPLE_DECL:
494
- case TokenID.NT_ENUM_DECL:
495
- for (const child of declNode.children) {
496
- extendBoundInPlace(bound, child);
497
- }
498
- break;
499
- case TokenID.NT_ARG_DECL:
500
- extendBoundInPlace(bound, declNode.children[0]);
501
- break;
502
- }
503
- }
504
-
505
- // src/rslang/semantic/typification.ts
506
- var TypeID = {
507
- anyTypification: 1,
508
- integer: 2,
509
- basic: 3,
510
- tuple: 4,
511
- collection: 5,
512
- logic: 6,
513
- function: 7,
514
- predicate: 8
515
- };
516
- var TypeClass = {
517
- logic: 1,
518
- typification: 2,
519
- function: 3,
520
- predicate: 4
521
- };
522
- var LogicT = { typeID: TypeID.logic };
523
- var IntegerT = {
524
- typeID: TypeID.integer,
525
- isOrdered: true,
526
- isArithmetic: true,
527
- isIntegerCompatible: true
528
- };
529
- function makeTypePath(path) {
530
- return path;
531
- }
532
- var AnyTypificationT = { typeID: TypeID.anyTypification };
533
- var EmptySetT = bool(AnyTypificationT);
534
- function basic(alias) {
535
- return { typeID: TypeID.basic, baseID: alias };
536
- }
537
- function constant(alias) {
538
- return { typeID: TypeID.basic, baseID: alias, isOrdered: true, isArithmetic: true, isIntegerCompatible: true };
539
- }
540
- function bool(base) {
541
- return { typeID: TypeID.collection, base };
542
- }
543
- function tuple(factors) {
544
- if (factors.length < 2) {
545
- throw new Error("Tuple with less than two factors is not allowed");
546
- }
547
- return { typeID: TypeID.tuple, factors };
548
- }
549
- function debool(target) {
550
- return target.base;
551
- }
552
- function component(target, index) {
553
- return target.factors[index - 1] ?? null;
554
- }
555
- function isTypification(type) {
556
- return type?.typeID === TypeID.basic || type?.typeID === TypeID.anyTypification || type?.typeID === TypeID.integer || type?.typeID === TypeID.collection || type?.typeID === TypeID.tuple;
557
- }
558
- function isRadical(alias) {
559
- return alias.length > 0 && alias.startsWith("R") && alias[1] !== "0";
560
- }
561
-
562
- // src/rslang/eval/value-api.ts
563
- function cartesianProduct(factors) {
564
- const cardinality = factors.reduce((acc, f) => acc * f.length, 1);
565
- if (cardinality > SET_INFINITY) {
566
- return null;
567
- }
568
- if (cardinality === 0 || factors.length === 0) {
569
- return EmptySetV;
570
- }
571
- let accumulator = [[]];
572
- for (const factor of factors) {
573
- const next = [];
574
- for (const prefix of accumulator) {
575
- for (const value of factor) {
576
- next.push([...prefix, value]);
577
- }
578
- }
579
- accumulator = next;
580
- }
581
- return accumulator.map(tuple2);
582
- }
583
- function boolean(base) {
584
- if (base.length > BOOL_INFINITY) {
585
- return null;
586
- }
587
- return powerset(base);
588
- }
589
- function powerset(arr) {
590
- const result = [[]];
591
- if (arr.length === 0) {
592
- return result;
593
- }
594
- let current = [[]];
595
- let maxIndex = [-1];
596
- while (current.length > 0) {
597
- const next = [];
598
- const nextMaxIndex = [];
599
- for (let i = 0; i < current.length; i++) {
600
- for (let j = maxIndex[i] + 1; j < arr.length; j++) {
601
- const subset = [...current[i], arr[j]];
602
- result.push(subset);
603
- if (j < arr.length - 1) {
604
- next.push(subset);
605
- nextMaxIndex.push(j);
606
- }
607
- }
608
- }
609
- current = next;
610
- maxIndex = nextMaxIndex;
611
- }
612
- return result;
613
- }
614
- function contains(setData, element) {
615
- let left = 0;
616
- let right = setData.length - 1;
617
- while (left <= right) {
618
- const mid = Math.floor((left + right) / 2);
619
- const cmp = compare(setData[mid], element);
620
- if (cmp === 0) {
621
- return true;
622
- } else if (cmp < 0) {
623
- left = mid + 1;
624
- } else {
625
- right = mid - 1;
626
- }
627
- }
628
- return false;
629
- }
630
- function isSubsetOrEq(a, b) {
631
- let i = 0, j = 0;
632
- while (i < a.length && j < b.length) {
633
- const cmp = compare(a[i], b[j]);
634
- if (cmp === 0) {
635
- i++;
636
- j++;
637
- } else if (cmp > 0) {
638
- j++;
639
- } else {
640
- return false;
641
- }
642
- }
643
- return i === a.length;
644
- }
645
- function reduce(target) {
646
- const result = [];
647
- for (const element of target) {
648
- result.push(...element);
649
- }
650
- return set(result);
651
- }
652
- function setUnion(set1, set2) {
653
- const result = [];
654
- let i = 0, j = 0;
655
- while (i < set1.length && j < set2.length) {
656
- const cmp = compare(set1[i], set2[j]);
657
- if (cmp < 0) {
658
- result.push(set1[i]);
659
- i++;
660
- } else if (cmp > 0) {
661
- result.push(set2[j]);
662
- j++;
663
- } else {
664
- result.push(set1[i]);
665
- i++;
666
- j++;
667
- }
668
- }
669
- while (i < set1.length) {
670
- result.push(set1[i]);
671
- i++;
672
- }
673
- while (j < set2.length) {
674
- result.push(set2[j]);
675
- j++;
676
- }
677
- return result;
678
- }
679
- function setIntersection(set1, set2) {
680
- const result = [];
681
- for (let i = 0, j = 0; i < set1.length && j < set2.length; ) {
682
- const cmp = compare(set1[i], set2[j]);
683
- if (cmp < 0) {
684
- i++;
685
- } else if (cmp > 0) {
686
- j++;
687
- } else {
688
- result.push(set1[i]);
689
- i++;
690
- j++;
691
- }
692
- }
693
- return result;
694
- }
695
- function setDiff(set1, set2) {
696
- const result = [];
697
- let i = 0, j = 0;
698
- while (i < set1.length && j < set2.length) {
699
- const cmp = compare(set1[i], set2[j]);
700
- if (cmp < 0) {
701
- result.push(set1[i]);
702
- i++;
703
- } else if (cmp > 0) {
704
- j++;
705
- } else {
706
- i++;
707
- j++;
708
- }
709
- }
710
- while (i < set1.length) {
711
- result.push(set1[i]);
712
- i++;
713
- }
714
- return result;
715
- }
716
- function setSymDiff(set1, set2) {
717
- const result = [];
718
- let i = 0, j = 0;
719
- while (i < set1.length && j < set2.length) {
720
- const cmp = compare(set1[i], set2[j]);
721
- if (cmp < 0) {
722
- result.push(set1[i]);
723
- i++;
724
- } else if (cmp > 0) {
725
- result.push(set2[j]);
726
- j++;
727
- } else {
728
- i++;
729
- j++;
730
- }
731
- }
732
- while (i < set1.length) {
733
- result.push(set1[i]);
734
- i++;
735
- }
736
- while (j < set2.length) {
737
- result.push(set2[j]);
738
- j++;
739
- }
740
- return result;
741
- }
742
- function projection(target, indices) {
743
- const projectedElements = target.map((element) => {
744
- const newComponents = indices.map((idx) => element[idx]);
745
- return indices.length === 1 ? newComponents[0] : tuple2(newComponents);
746
- });
747
- return set(projectedElements);
748
- }
749
- function printValue(data) {
750
- if (!Array.isArray(data)) {
751
- return String(data);
752
- }
753
- const len = data.length;
754
- if (data.length === 0) {
755
- return "{}";
756
- }
757
- const isTuple = data[0] === TUPLE_ID;
758
- const start = isTuple ? 1 : 0;
759
- let result = isTuple ? "(" : "{";
760
- for (let i = start; i < len; i++) {
761
- if (i > start) result += ", ";
762
- result += printValue(data[i]);
763
- }
764
- result += isTuple ? ")" : "}";
765
- return result;
766
- }
767
- function isSetValue(data) {
768
- return Array.isArray(data) && (data.length === 0 || data[0] !== TUPLE_ID);
769
- }
770
- function validateValue(value, type, basics) {
771
- switch (type.typeID) {
772
- case TypeID.integer:
773
- return typeof value === "number";
774
- case TypeID.logic: {
775
- if (typeof value !== "number") {
776
- return false;
777
- }
778
- return value === VALUE_TRUE || value === VALUE_FALSE;
779
- }
780
- case TypeID.basic: {
781
- if (typeof value !== "number") {
782
- return false;
783
- }
784
- const domain = basics.get(type.baseID);
785
- return !!domain && Array.isArray(domain) && domain.includes(value);
786
- }
787
- case TypeID.tuple: {
788
- if (!Array.isArray(value) || value.length !== type.factors.length + 1 || value[0] !== TUPLE_ID) {
789
- return false;
790
- }
791
- for (let i = 0; i < type.factors.length; i++) {
792
- if (!validateValue(value[i + 1], type.factors[i], basics)) {
793
- return false;
794
- }
795
- }
796
- return true;
797
- }
798
- case TypeID.collection: {
799
- if (!isSetValue(value)) {
800
- return false;
801
- }
802
- for (const item of value) {
803
- if (!validateValue(item, type.base, basics)) {
804
- return false;
805
- }
806
- }
807
- return true;
808
- }
809
- case TypeID.anyTypification:
810
- case TypeID.predicate:
811
- case TypeID.function:
812
- return false;
813
- }
814
- }
815
-
816
- // src/rslang/eval/value.ts
817
- var TUPLE_ID = -111;
818
- var VALUE_TRUE = 1;
819
- var VALUE_FALSE = 0;
820
- var SET_INFINITY = 1e7;
821
- var BOOL_INFINITY = 18;
822
- function makeValuePath(path) {
823
- return path;
824
- }
825
- var EmptySetV = [];
826
- function compare(v1, v2) {
827
- const stack1 = [v1];
828
- const stack2 = [v2];
829
- while (stack1.length > 0 && stack2.length > 0) {
830
- const el1 = stack1.pop();
831
- const el2 = stack2.pop();
832
- if (el1 === el2) {
833
- continue;
834
- }
835
- const type1 = typeof el1;
836
- const type2 = typeof el2;
837
- if (type1 === "number" && type2 === "number") {
838
- const numDiff = el1 - el2;
839
- if (numDiff !== 0) return numDiff;
840
- continue;
841
- }
842
- const isArray1 = Array.isArray(el1);
843
- const isArray2 = Array.isArray(el2);
844
- if (!isArray1 || !isArray2) {
845
- throw new Error(`Cannot compare different types ${printValue(el1)} and ${printValue(el2)}`);
846
- }
847
- const arr1 = el1;
848
- const arr2 = el2;
849
- const len1 = arr1.length;
850
- const len2 = arr2.length;
851
- if (len1 !== len2) {
852
- return len1 - len2;
853
- }
854
- for (let i = len1 - 1; i >= 0; i--) {
855
- stack1.push(arr1[i]);
856
- stack2.push(arr2[i]);
857
- }
858
- }
859
- return 0;
860
- }
861
- function tuple2(components) {
862
- return [TUPLE_ID, ...components];
863
- }
864
- function set(elements) {
865
- const sorted = [...elements].sort(compare);
866
- for (let i = 1; i < sorted.length; ) {
867
- if (compare(sorted[i - 1], sorted[i]) === 0) {
868
- sorted.splice(i, 1);
869
- } else {
870
- i++;
871
- }
872
- }
873
- return sorted;
874
- }
875
-
876
- // src/rslang/eval/evaluator.ts
877
- var MAX_ITERATIONS = 1e6;
878
- var TICK_PER_FUNCTION = 3;
879
- var TICK_PER_RECURSION = 3;
880
- var TICK_PER_IMPERATIVE = 1;
881
- var TICK_PER_DECLARATIVE = 1;
882
- var TICK_PER_QUANTIFIER = 1;
883
- var Evaluator = class {
884
- reporter;
885
- annotateErrors = false;
886
- disableCache = false;
887
- locals = new LocalContext();
888
- nodeMetadata = new EvaluationMetadata();
889
- evalCache = new EvaluationCache();
890
- callSiteStack = [];
891
- context;
892
- treeContext;
893
- iterationCounter = 0;
894
- /** Cache hits in the current evaluation run (for tests/diagnostics). */
895
- get cacheHits() {
896
- return this.evalCache.hits;
897
- }
898
- constructor(context, astContext) {
899
- this.treeContext = astContext;
900
- this.context = context;
901
- }
902
- run(ast, reporter, annotateErrors = false, disableCache = false) {
903
- if (ast.hasError) {
904
- return null;
905
- }
906
- this.reporter = reporter;
907
- this.annotateErrors = annotateErrors;
908
- this.disableCache = disableCache;
909
- this.clear();
910
- return this.dispatchVisit(ast);
911
- }
912
- clear() {
913
- this.locals = new LocalContext();
914
- this.evalCache.clear();
915
- this.callSiteStack = [];
916
- this.iterationCounter = 0;
917
- }
918
- errorNode(node) {
919
- if (this.callSiteStack.length > 0) {
920
- return this.callSiteStack[this.callSiteStack.length - 1];
921
- }
922
- return node;
923
- }
924
- onError(code, node, params) {
925
- const target = this.errorNode(node);
926
- this.reporter?.({ code, from: target.from, to: target.to, params });
927
- if (this.annotateErrors) {
928
- annotateError(target, code, params);
929
- }
930
- return null;
931
- }
932
- tick(node, counter = 1) {
933
- this.iterationCounter += counter;
934
- if (this.iterationCounter > MAX_ITERATIONS) {
935
- this.onError(RSErrorCode.iterationsLimit, node, [String(MAX_ITERATIONS)]);
936
- return false;
937
- }
938
- return true;
939
- }
940
- dispatchDeclare(node, value) {
941
- switch (node.typeID) {
942
- case TokenID.ID_LOCAL:
943
- return this.declareLocal(node, value);
944
- case TokenID.NT_TUPLE_DECL:
945
- return this.declareTuple(node, value);
946
- case TokenID.NT_ARG_DECL:
947
- return this.dispatchDeclare(node.children[0], value);
948
- }
949
- }
950
- declareLocal(node, value) {
951
- const alias = getNodeText(node);
952
- this.locals.setLocal(alias, value);
953
- }
954
- declareTuple(node, value) {
955
- for (let child = 0; child < node.children.length; child++) {
956
- this.dispatchDeclare(node.children[child], value[child + 1]);
957
- }
958
- }
959
- dispatchVisit(node) {
960
- const info = this.nodeMetadata.get(node);
961
- let stamp = null;
962
- if (info.cacheable && !this.disableCache) {
963
- stamp = this.locals.buildDependencyStamp(info.reads);
964
- if (stamp !== null) {
965
- const cached = this.evalCache.lookup(info.structuralKey, stamp);
966
- if (cached !== void 0) {
967
- return cached;
968
- }
969
- }
970
- }
971
- const result = this.dispatchVisitImpl(node);
972
- if (!this.disableCache && result !== null && info.cacheable && stamp !== null) {
973
- this.evalCache.store(info.structuralKey, stamp, result);
974
- }
975
- return result;
976
- }
977
- dispatchVisitImpl(node) {
978
- switch (node.typeID) {
979
- case TokenID.ID_GLOBAL:
980
- return this.visitGlobal(node);
981
- case TokenID.NT_FUNC_CALL:
982
- return this.visitFunctionCall(node);
983
- case TokenID.ID_LOCAL:
984
- case TokenID.ID_RADICAL:
985
- return this.visitLocal(node);
986
- case TokenID.LIT_INTEGER:
987
- return this.visitInteger(node);
988
- case TokenID.LIT_WHOLE_NUMBERS:
989
- return this.onError(RSErrorCode.iterateInfinity, node);
990
- case TokenID.LIT_EMPTYSET:
991
- return EmptySetV;
992
- case TokenID.PLUS:
993
- case TokenID.MINUS:
994
- case TokenID.MULTIPLY:
995
- return this.visitArithmetic(node);
996
- case TokenID.CARD:
997
- return this.visitCard(node);
998
- case TokenID.QUANTOR_UNIVERSAL:
999
- case TokenID.QUANTOR_EXISTS:
1000
- return this.visitQuantifier(node);
1001
- case TokenID.LOGIC_NOT:
1002
- return this.visitNegation(node);
1003
- case TokenID.LOGIC_AND:
1004
- case TokenID.LOGIC_OR:
1005
- case TokenID.LOGIC_IMPLICATION:
1006
- case TokenID.LOGIC_EQUIVALENT:
1007
- return this.visitLogicBinary(node);
1008
- case TokenID.EQUAL:
1009
- case TokenID.NOTEQUAL:
1010
- return this.visitEquals(node);
1011
- case TokenID.GREATER:
1012
- case TokenID.LESSER:
1013
- case TokenID.GREATER_OR_EQ:
1014
- case TokenID.LESSER_OR_EQ:
1015
- return this.visitIntegerPredicate(node);
1016
- case TokenID.SET_IN:
1017
- case TokenID.SET_NOT_IN:
1018
- case TokenID.SUBSET:
1019
- case TokenID.SUBSET_OR_EQ:
1020
- case TokenID.NOT_SUBSET:
1021
- return this.visitSetexprPredicate(node);
1022
- case TokenID.DECART:
1023
- return this.visitDecart(node);
1024
- case TokenID.BOOLEAN:
1025
- return this.visitBoolean(node);
1026
- case TokenID.NT_TUPLE:
1027
- return this.visitTuple(node);
1028
- case TokenID.NT_ENUMERATION:
1029
- return this.visitEnumeration(node);
1030
- case TokenID.BOOL:
1031
- return this.visitBool(node);
1032
- case TokenID.DEBOOL:
1033
- return this.visitDebool(node);
1034
- case TokenID.SET_UNION:
1035
- case TokenID.SET_INTERSECTION:
1036
- case TokenID.SET_MINUS:
1037
- case TokenID.SET_SYMMETRIC_MINUS:
1038
- return this.visitSetexprBinary(node);
1039
- case TokenID.BIGPR:
1040
- return this.visitProjectSet(node);
1041
- case TokenID.SMALLPR:
1042
- return this.visitProjectTuple(node);
1043
- case TokenID.FILTER:
1044
- return this.visitFilter(node);
1045
- case TokenID.REDUCE:
1046
- return this.visitReduce(node);
1047
- case TokenID.NT_DECLARATIVE_EXPR:
1048
- return this.visitDeclarative(node);
1049
- case TokenID.NT_IMPERATIVE_EXPR:
1050
- return this.visitImperative(node);
1051
- case TokenID.ASSIGN:
1052
- return this.visitAssign(node);
1053
- case TokenID.NT_RECURSIVE_FULL:
1054
- case TokenID.NT_RECURSIVE_SHORT:
1055
- return this.visitRecursion(node);
1056
- case TokenID.NT_FUNC_DEFINITION:
1057
- return this.onError(RSErrorCode.calculationNotSupported, node);
1058
- }
1059
- return null;
1060
- }
1061
- visitChild(node, index) {
1062
- return this.dispatchVisit(node.children[index]);
1063
- }
1064
- visitGlobal(node) {
1065
- const alias = getNodeText(node);
1066
- const value = this.context.get(alias);
1067
- if (value === void 0) {
1068
- return this.onError(RSErrorCode.calcGlobalMissing, node, [alias]);
1069
- }
1070
- return value;
1071
- }
1072
- visitLocal(node) {
1073
- const alias = getNodeText(node);
1074
- return this.locals.getLocal(alias);
1075
- }
1076
- visitFunctionCall(node) {
1077
- const funcName = getNodeText(node.children[0]);
1078
- const ast = this.treeContext.get(funcName);
1079
- if (!ast) {
1080
- return this.onError(RSErrorCode.calcGlobalMissing, node.children[0], [funcName]);
1081
- }
1082
- if (!this.tick(node, TICK_PER_FUNCTION)) {
1083
- return null;
1084
- }
1085
- const args = [];
1086
- for (let i = 1; i < node.children.length; i++) {
1087
- const arg = this.visitChild(node, i);
1088
- if (arg === null) {
1089
- return null;
1090
- }
1091
- args.push(arg);
1092
- }
1093
- this.locals.startScope();
1094
- for (let i = 0; i < args.length; i++) {
1095
- this.dispatchDeclare(ast.children[0].children[i], args[i]);
1096
- }
1097
- this.callSiteStack.push(node);
1098
- let result;
1099
- try {
1100
- result = this.visitChild(ast, 1);
1101
- } finally {
1102
- this.callSiteStack.pop();
1103
- }
1104
- this.locals.endScope();
1105
- return result;
1106
- }
1107
- visitInteger(node) {
1108
- const value = node.data.dataType === "number" ? node.data.value : Number(node.data.value);
1109
- return Math.floor(value);
1110
- }
1111
- visitArithmetic(node) {
1112
- const v1 = this.visitChild(node, 0);
1113
- const v2 = this.visitChild(node, 1);
1114
- if (v1 === null || v2 === null) {
1115
- return null;
1116
- }
1117
- const a = v1;
1118
- const b = v2;
1119
- switch (node.typeID) {
1120
- case TokenID.PLUS:
1121
- return a + b;
1122
- case TokenID.MINUS:
1123
- return a - b;
1124
- case TokenID.MULTIPLY:
1125
- return a * b;
1126
- }
1127
- return null;
1128
- }
1129
- visitCard(node) {
1130
- const base = this.visitChild(node, 0);
1131
- if (base === null || !Array.isArray(base)) {
1132
- return null;
1133
- }
1134
- return base.length;
1135
- }
1136
- visitQuantifier(node) {
1137
- const domain = this.visitChild(node, 1);
1138
- if (domain === null) {
1139
- return null;
1140
- }
1141
- const isUniversal = node.typeID === TokenID.QUANTOR_UNIVERSAL;
1142
- if (domain.length === 0) {
1143
- return isUniversal ? VALUE_TRUE : VALUE_FALSE;
1144
- }
1145
- const varNodes = node.children[0].typeID === TokenID.NT_ENUM_DECL ? node.children[0].children : [node.children[0]];
1146
- const count = domain.length;
1147
- const iterators = [];
1148
- for (const declaration of varNodes) {
1149
- iterators.push(0);
1150
- this.dispatchDeclare(declaration, domain[0]);
1151
- }
1152
- let finishIteration = false;
1153
- while (!finishIteration) {
1154
- const iterationValue = this.visitChild(node, 2);
1155
- if (iterationValue === null) {
1156
- return null;
1157
- }
1158
- if (iterationValue === VALUE_TRUE !== isUniversal) {
1159
- return !isUniversal ? VALUE_TRUE : VALUE_FALSE;
1160
- }
1161
- let incrementIndex = iterators.length - 1;
1162
- while (true) {
1163
- if (iterators[incrementIndex] < count - 1) {
1164
- iterators[incrementIndex]++;
1165
- if (!this.tick(node, TICK_PER_QUANTIFIER)) {
1166
- return null;
1167
- }
1168
- this.dispatchDeclare(varNodes[incrementIndex], domain[iterators[incrementIndex]]);
1169
- incrementIndex = iterators.length - 1;
1170
- break;
1171
- } else if (incrementIndex === 0) {
1172
- finishIteration = true;
1173
- break;
1174
- } else {
1175
- iterators[incrementIndex] = 0;
1176
- this.dispatchDeclare(varNodes[incrementIndex], domain[0]);
1177
- incrementIndex--;
1178
- }
1179
- }
1180
- }
1181
- return isUniversal ? VALUE_TRUE : VALUE_FALSE;
1182
- }
1183
- visitNegation(node) {
1184
- const value = this.visitChild(node, 0);
1185
- if (value === null) {
1186
- return null;
1187
- }
1188
- return value === VALUE_TRUE ? VALUE_FALSE : VALUE_TRUE;
1189
- }
1190
- tryEvaluateFromFirstArg(op, first) {
1191
- if (op === TokenID.LOGIC_AND && !first || op === TokenID.LOGIC_OR && first) {
1192
- return first ? VALUE_TRUE : VALUE_FALSE;
1193
- }
1194
- if (op === TokenID.LOGIC_IMPLICATION && !first) {
1195
- return VALUE_TRUE;
1196
- }
1197
- return null;
1198
- }
1199
- visitLogicBinary(node) {
1200
- const v1 = this.visitChild(node, 0);
1201
- if (v1 === null) {
1202
- return null;
1203
- }
1204
- const b1 = v1 === VALUE_TRUE;
1205
- const attempt = this.tryEvaluateFromFirstArg(node.typeID, b1);
1206
- if (attempt !== null) {
1207
- return attempt;
1208
- }
1209
- const v2 = this.visitChild(node, 1);
1210
- if (v2 === null) {
1211
- return null;
1212
- }
1213
- const b2 = v2 === VALUE_TRUE;
1214
- let result;
1215
- switch (node.typeID) {
1216
- case TokenID.LOGIC_AND:
1217
- result = b1 && b2;
1218
- break;
1219
- case TokenID.LOGIC_OR:
1220
- result = b1 || b2;
1221
- break;
1222
- case TokenID.LOGIC_IMPLICATION:
1223
- result = !b1 || b2;
1224
- break;
1225
- case TokenID.LOGIC_EQUIVALENT:
1226
- result = b1 === b2;
1227
- break;
1228
- default:
1229
- return null;
1230
- }
1231
- return result ? VALUE_TRUE : VALUE_FALSE;
1232
- }
1233
- visitEquals(node) {
1234
- const v1 = this.visitChild(node, 0);
1235
- if (v1 === null) {
1236
- return null;
1237
- }
1238
- const v2 = this.visitChild(node, 1);
1239
- if (v2 === null) {
1240
- return null;
1241
- }
1242
- const areEqual = compare(v1, v2) === 0;
1243
- return areEqual === (node.typeID !== TokenID.NOTEQUAL) ? VALUE_TRUE : VALUE_FALSE;
1244
- }
1245
- visitIntegerPredicate(node) {
1246
- const v1 = this.visitChild(node, 0);
1247
- if (v1 === null) {
1248
- return null;
1249
- }
1250
- const v2 = this.visitChild(node, 1);
1251
- if (v2 === null) {
1252
- return null;
1253
- }
1254
- const a = v1;
1255
- const b = v2;
1256
- let result;
1257
- switch (node.typeID) {
1258
- case TokenID.GREATER:
1259
- result = a > b;
1260
- break;
1261
- case TokenID.LESSER:
1262
- result = a < b;
1263
- break;
1264
- case TokenID.GREATER_OR_EQ:
1265
- result = a >= b;
1266
- break;
1267
- case TokenID.LESSER_OR_EQ:
1268
- result = a <= b;
1269
- break;
1270
- default:
1271
- return null;
1272
- }
1273
- return result ? VALUE_TRUE : VALUE_FALSE;
1274
- }
1275
- visitSetexprPredicate(node) {
1276
- const v1 = this.visitChild(node, 0);
1277
- if (v1 === null) {
1278
- return null;
1279
- }
1280
- const v2 = this.visitChild(node, 1);
1281
- if (v2 === null) {
1282
- return null;
1283
- }
1284
- let result;
1285
- switch (node.typeID) {
1286
- case TokenID.SET_IN:
1287
- result = contains(v2, v1);
1288
- break;
1289
- case TokenID.SET_NOT_IN:
1290
- result = !contains(v2, v1);
1291
- break;
1292
- case TokenID.SUBSET:
1293
- result = compare(v1, v2) !== 0 && isSubsetOrEq(v1, v2);
1294
- break;
1295
- case TokenID.NOT_SUBSET:
1296
- result = compare(v1, v2) === 0 || !isSubsetOrEq(v1, v2);
1297
- break;
1298
- case TokenID.SUBSET_OR_EQ:
1299
- result = isSubsetOrEq(v1, v2);
1300
- break;
1301
- default:
1302
- return null;
1303
- }
1304
- return result ? VALUE_TRUE : VALUE_FALSE;
1305
- }
1306
- visitDecart(node) {
1307
- const args = [];
1308
- for (let i = 0; i < node.children.length; i++) {
1309
- const component2 = this.visitChild(node, i);
1310
- if (component2 === null) {
1311
- return null;
1312
- }
1313
- if (component2.length === 0) {
1314
- return EmptySetV;
1315
- }
1316
- args.push(component2);
1317
- }
1318
- const result = cartesianProduct(args);
1319
- if (result === null) {
1320
- this.onError(RSErrorCode.setOverflow, node, [String(SET_INFINITY)]);
1321
- return null;
1322
- }
1323
- return result;
1324
- }
1325
- visitBoolean(node) {
1326
- const base = this.visitChild(node, 0);
1327
- if (base === null) {
1328
- return null;
1329
- }
1330
- const result = boolean(base);
1331
- if (result === null) {
1332
- this.onError(RSErrorCode.booleanBaseLimit, node.children[0], [String(BOOL_INFINITY)]);
1333
- return null;
1334
- }
1335
- return result;
1336
- }
1337
- visitTuple(node) {
1338
- const args = [];
1339
- for (let i = 0; i < node.children.length; i++) {
1340
- const component2 = this.visitChild(node, i);
1341
- if (component2 === null) {
1342
- return null;
1343
- }
1344
- args.push(component2);
1345
- }
1346
- return tuple2(args);
1347
- }
1348
- visitEnumeration(node) {
1349
- const args = [];
1350
- for (let i = 0; i < node.children.length; i++) {
1351
- const element = this.visitChild(node, i);
1352
- if (element === null) {
1353
- return null;
1354
- }
1355
- args.push(element);
1356
- }
1357
- return set(args);
1358
- }
1359
- visitBool(node) {
1360
- const element = this.visitChild(node, 0);
1361
- if (element === null) {
1362
- return null;
1363
- }
1364
- return [element];
1365
- }
1366
- visitDebool(node) {
1367
- const target = this.visitChild(node, 0);
1368
- if (target === null) {
1369
- return null;
1370
- }
1371
- if (target.length !== 1) {
1372
- return this.onError(RSErrorCode.calcInvalidDebool, node.children[0]);
1373
- }
1374
- return target[0];
1375
- }
1376
- visitSetexprBinary(node) {
1377
- const v1 = this.visitChild(node, 0);
1378
- if (v1 === null) {
1379
- return null;
1380
- }
1381
- const v2 = this.visitChild(node, 1);
1382
- if (v2 === null) {
1383
- return null;
1384
- }
1385
- switch (node.typeID) {
1386
- case TokenID.SET_UNION:
1387
- return setUnion(v1, v2);
1388
- case TokenID.SET_INTERSECTION:
1389
- return setIntersection(v1, v2);
1390
- case TokenID.SET_MINUS:
1391
- return setDiff(v1, v2);
1392
- case TokenID.SET_SYMMETRIC_MINUS:
1393
- return setSymDiff(v1, v2);
1394
- }
1395
- return null;
1396
- }
1397
- visitProjectSet(node) {
1398
- const target = this.visitChild(node, 0);
1399
- if (target === null) {
1400
- return null;
1401
- }
1402
- const indices = getNodeIndices(node);
1403
- return projection(target, indices);
1404
- }
1405
- visitProjectTuple(node) {
1406
- const target = this.visitChild(node, 0);
1407
- if (target === null) {
1408
- return null;
1409
- }
1410
- const indices = getNodeIndices(node);
1411
- const components = indices.map((i) => target[i]);
1412
- return components.length === 1 ? components[0] : tuple2(components);
1413
- }
1414
- visitFilter(node) {
1415
- const lastIdx = node.children.length - 1;
1416
- const argVal = this.visitChild(node, lastIdx);
1417
- if (argVal === null) {
1418
- return null;
1419
- }
1420
- if (argVal.length === 0) {
1421
- return EmptySetV;
1422
- }
1423
- const indices = getNodeIndices(node);
1424
- const tupleParam = indices.length === lastIdx;
1425
- if (tupleParam) {
1426
- const params = [];
1427
- for (let i = 0; i < lastIdx; i++) {
1428
- const param = this.visitChild(node, i);
1429
- if (param === null) {
1430
- return null;
1431
- }
1432
- if (param.length === 0) {
1433
- return EmptySetV;
1434
- }
1435
- params.push(param);
1436
- }
1437
- const result = [];
1438
- for (const element of argVal) {
1439
- let valid = true;
1440
- for (let j = 0; j < indices.length; j++) {
1441
- const comp = element[indices[j]];
1442
- const paramSet = params[j];
1443
- if (!contains(paramSet, comp)) {
1444
- valid = false;
1445
- break;
1446
- }
1447
- }
1448
- if (valid) {
1449
- result.push(element);
1450
- }
1451
- }
1452
- return result;
1453
- } else {
1454
- const paramVal = this.visitChild(node, 0);
1455
- if (paramVal === null) {
1456
- return null;
1457
- }
1458
- if (paramVal.length === 0) {
1459
- return EmptySetV;
1460
- }
1461
- const result = [];
1462
- for (const element of argVal) {
1463
- const comps = indices.map((i) => element[i]);
1464
- const testElement = comps.length === 1 ? comps[0] : tuple2(comps);
1465
- if (contains(paramVal, testElement)) result.push(element);
1466
- }
1467
- return result;
1468
- }
1469
- }
1470
- visitReduce(node) {
1471
- const target = this.visitChild(node, 0);
1472
- if (target === null) {
1473
- return null;
1474
- }
1475
- return reduce(target);
1476
- }
1477
- visitDeclarative(node) {
1478
- const domain = this.visitChild(node, 1);
1479
- if (domain === null) {
1480
- return null;
1481
- }
1482
- const elements = [];
1483
- for (const element of domain) {
1484
- if (!this.tick(node, TICK_PER_DECLARATIVE)) {
1485
- return null;
1486
- }
1487
- this.dispatchDeclare(node.children[0], element);
1488
- const value = this.visitChild(node, 2);
1489
- if (value === null) {
1490
- return null;
1491
- }
1492
- if (value === VALUE_TRUE) {
1493
- elements.push(element);
1494
- }
1495
- }
1496
- return elements.length === 0 ? EmptySetV : elements;
1497
- }
1498
- visitImperative(node) {
1499
- const result = [];
1500
- const frames = [];
1501
- let currentChild = 1;
1502
- const advanceIterator = () => {
1503
- while (frames.length > 0) {
1504
- const top = frames[frames.length - 1];
1505
- if (top.valueID < top.domain.length - 1) {
1506
- top.valueID++;
1507
- const nextValue = top.domain[top.valueID];
1508
- if (!this.tick(node.children[top.childID], TICK_PER_IMPERATIVE)) {
1509
- return false;
1510
- }
1511
- this.dispatchDeclare(node.children[top.childID].children[0], nextValue);
1512
- currentChild = top.childID + 1;
1513
- return true;
1514
- }
1515
- frames.pop();
1516
- }
1517
- return false;
1518
- };
1519
- while (true) {
1520
- if (currentChild >= node.children.length) {
1521
- const element = this.visitChild(node, 0);
1522
- if (element === null) {
1523
- return null;
1524
- }
1525
- result.push(element);
1526
- if (!advanceIterator()) {
1527
- break;
1528
- }
1529
- continue;
1530
- }
1531
- const child = node.children[currentChild];
1532
- if (child.typeID === TokenID.ITERATE) {
1533
- const domain = this.visitChild(child, 1);
1534
- if (domain === null) {
1535
- return null;
1536
- }
1537
- if (domain.length === 0) {
1538
- if (!advanceIterator()) {
1539
- break;
1540
- }
1541
- continue;
1542
- }
1543
- if (!this.tick(child, TICK_PER_IMPERATIVE)) {
1544
- return null;
1545
- }
1546
- frames.push({
1547
- childID: currentChild,
1548
- domain,
1549
- valueID: 0
1550
- });
1551
- this.dispatchDeclare(child.children[0], domain[0]);
1552
- currentChild++;
1553
- continue;
1554
- }
1555
- const value = this.dispatchVisit(child);
1556
- if (value === null) {
1557
- return null;
1558
- }
1559
- if (value === VALUE_FALSE) {
1560
- if (!advanceIterator()) {
1561
- break;
1562
- }
1563
- continue;
1564
- }
1565
- currentChild++;
1566
- }
1567
- return set(result);
1568
- }
1569
- visitAssign(node) {
1570
- const value = this.visitChild(node, 1);
1571
- if (value === null) {
1572
- return null;
1573
- }
1574
- this.dispatchDeclare(node.children[0], value);
1575
- return VALUE_TRUE;
1576
- }
1577
- visitRecursion(node) {
1578
- const initialValue = this.visitChild(node, 1);
1579
- if (initialValue === null) {
1580
- return null;
1581
- }
1582
- const bodyIndex = node.typeID === TokenID.NT_RECURSIVE_FULL ? 3 : 2;
1583
- let current = initialValue;
1584
- while (true) {
1585
- if (!this.tick(node, TICK_PER_RECURSION)) {
1586
- return null;
1587
- }
1588
- this.dispatchDeclare(node.children[0], current);
1589
- if (node.typeID === TokenID.NT_RECURSIVE_FULL) {
1590
- const pred = this.visitChild(node, 2);
1591
- if (pred === null) {
1592
- return null;
1593
- }
1594
- if (pred !== VALUE_TRUE) {
1595
- break;
1596
- }
1597
- }
1598
- const next = this.visitChild(node, bodyIndex);
1599
- if (next === null) {
1600
- return null;
1601
- }
1602
- if (compare(current, next) === 0) {
1603
- break;
1604
- }
1605
- current = next;
1606
- }
1607
- return current;
1608
- }
1609
- };
1610
- var LocalContext = class {
1611
- nextBindingId = 1;
1612
- data = /* @__PURE__ */ new Map();
1613
- callStack = [];
1614
- startScope() {
1615
- this.callStack.push(this.data);
1616
- this.data = /* @__PURE__ */ new Map();
1617
- }
1618
- endScope() {
1619
- this.data = this.callStack.pop();
1620
- }
1621
- setLocal(alias, value) {
1622
- const existing = this.data.get(alias);
1623
- if (existing) {
1624
- existing.value = value;
1625
- existing.version++;
1626
- } else {
1627
- this.data.set(alias, { id: this.nextBindingId++, version: 0, value });
1628
- }
1629
- }
1630
- getLocal(alias) {
1631
- const binding = this.data.get(alias);
1632
- if (binding === void 0) {
1633
- throw new Error(`Local variable "${alias}" not found`);
1634
- }
1635
- return binding.value;
1636
- }
1637
- buildDependencyStamp(reads) {
1638
- if (reads.size === 0) {
1639
- return "";
1640
- }
1641
- const parts = [];
1642
- for (const alias of [...reads].sort()) {
1643
- const binding = this.data.get(alias);
1644
- if (binding === void 0) {
1645
- return null;
1646
- }
1647
- parts.push(`${binding.id}:${binding.version}`);
1648
- }
1649
- return parts.join("|");
1650
- }
1651
- };
1652
-
1653
- // src/rslang/eval/calculator.ts
1654
- var RSCalculator = class {
1655
- context = /* @__PURE__ */ new Map();
1656
- treeContext = /* @__PURE__ */ new Map();
1657
- evaluator = new Evaluator(this.context, this.treeContext);
1658
- listeners = /* @__PURE__ */ new Map();
1659
- subscribe = (alias, listener) => {
1660
- let notifyList = this.listeners.get(alias);
1661
- if (!notifyList) {
1662
- notifyList = /* @__PURE__ */ new Set();
1663
- this.listeners.set(alias, notifyList);
1664
- }
1665
- notifyList.add(listener);
1666
- return () => {
1667
- notifyList.delete(listener);
1668
- if (notifyList.size === 0) {
1669
- this.listeners.delete(alias);
1670
- }
1671
- };
1672
- };
1673
- setValue(alias, value) {
1674
- this.context.set(alias, value);
1675
- this.notify(alias);
1676
- }
1677
- resetValue(alias) {
1678
- this.context.delete(alias);
1679
- this.notify(alias);
1680
- }
1681
- clearAllAst() {
1682
- this.treeContext.clear();
1683
- }
1684
- getValue(alias) {
1685
- return this.context.get(alias) ?? null;
1686
- }
1687
- setAST(alias, ast) {
1688
- this.treeContext.set(alias, ast);
1689
- }
1690
- validate(value, type) {
1691
- return validateValue(value, type, this.context);
1692
- }
1693
- evaluateFast(ast) {
1694
- if (ast.hasError) {
1695
- return null;
1696
- }
1697
- return this.evaluator.run(ast);
1698
- }
1699
- evaluateFull(ast, options) {
1700
- const errors = [];
1701
- const reporter = (error) => {
1702
- errors.push(error);
1703
- };
1704
- if (ast.hasError) {
1705
- return { value: null, iterations: 0, cacheHits: 0, errors };
1706
- }
1707
- const value = this.evaluator.run(ast, reporter, options?.annotateErrors ?? false, options?.disableCache ?? false);
1708
- if (value === null && errors.length === 0) {
1709
- errors.push({ code: RSErrorCode.calcUnknownError, from: 0, to: 0 });
1710
- if (options?.annotateErrors) {
1711
- annotateError(ast, RSErrorCode.calcUnknownError);
1712
- }
1713
- }
1714
- return {
1715
- value,
1716
- iterations: this.evaluator.iterationCounter,
1717
- cacheHits: this.evaluator.cacheHits,
1718
- errors
1719
- };
1720
- }
1721
- notify(alias) {
1722
- const set2 = this.listeners.get(alias);
1723
- if (!set2) return;
1724
- for (const l of set2) {
1725
- l();
1726
- }
1727
- }
1728
- };
1729
-
1730
- // src/rslang/parser/parser.ts
1731
- import { LRParser } from "@lezer/lr";
1732
- var parser = LRParser.deserialize({
1733
- version: 14,
1734
- states: "2lO!sQPOOOVQPO'#CdO$qQPO'#C`O&pQPO'#C`O*bQPO'#C_Q*jQPOOO,TQPO'#CyOVQPO'#CtO,]QPO'#CtOOQO'#Ct'#CtOOQO'#C^'#C^OOQO'#ES'#ESOOQO'#ET'#ETO,bQPO'#DeO,iQPO'#DfO,qQPO'#DhO,vQPO'#DjO,{QPO'#DnO-QQPO'#DrOOQO'#EU'#EUOOQO'#EV'#EVOOQO'#DS'#DSO-VQPO'#DSO-[QPO'#DSOOQO'#EQ'#EQO,TQPO'#DzQOQPOOO-aQPO'#ERO-nQPO,59OO-vQPO'#CeO-{QPO,58xO/lQPO,59tOVQPO,58yOVQPO,58yOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO'#CdOOQO'#C`'#C`OOQO'#C{'#C{O1]QPO,59eO2rQPO,59`OVQPO,59`OOQO'#ER'#ERO5TQPO,5:PO5]QPO,5:UOVQPO,5:QOOQO,5:Q,5:QOVQPO,5:SO,TQPO,5:UOVQPO,5:YO,TQPO,5:^OVQPO,59nOVQPO,59nO5dQPO'#D|OOQO'#D{'#D{O5iQPO,5:fOOQO1G.j1G.jOVQPO,59POOQO1G.d1G.dOOQO1G/`1G/`O5qQPO1G.eO7vQPO1G.eO:zQPO1G/TO=]QPO1G/TO?nQPO1G/TOBPQPO1G/TOGyQPO1G/`OHQQPO1G/`OKpQPO1G/`O! `QPO1G/`O! gQPO1G/`O! nQPO1G/`O! uQPO1G/`O,TQPO,59gOVQPO1G/PO!%aQPO1G.zOOQO1G/k1G/kOVQPO1G/pO!%iQPO1G/lO!%pQPO1G/nO!%xQPO1G/pO!%}QPO1G/tO!&UQPO1G/xO!&ZQPO1G/YO!&cQPO1G/YOVQPO,5:hO,TQPO,5:gOVQPO1G0QO!&jQPO1G.kOOQO1G/R1G/RO!&zQPO7+$kOOQO7+$f7+$fO!(gQPO7+%[OOQO7+%W7+%WO!(nQPO7+%YOVQPO7+%[OVQPO7+%`OVQPO7+%dOOQO7+$t7+$tO!(sQPO1G0SOOQO1G0R1G0RO!(}QPO7+%lO!)UQPO<<HVOVQPO<<HvOVQPO<<HtO!+gQPO<<HvO!+nQPO'#DoO!+xQPO<<HzO!,QQPO<<IOO!,XQPOAN>bO!,`QPOAN>`OVQPOAN>bOVQPO,5:ZOOQOAN>fAN>fOVQPOAN>jOOQOG23|G23|OOQOG23zG23zO!,gQPOG23|O!,nQPO1G/uO!,xQPOG24UOOQOLD)hLD)hOOQOLD)pLD)pOVQPOLD)pO!-SQPO!$'M[OOQO!)9Bv!)9Bv",
1735
- stateData: "!-l~O!sOS~OTQOVPOiVOjWOnUOpUOwZOxZOyZOz[O{[O!W]O!Z^O!]_O!``O!aaO!ebO!gfO!hdO!idO!jdO!kdO!ldO!mdO~OkiO~PVOZSX[SX]!wX^!wX_!wX`!wXa!wXb!wXc!wXd!wXe!wXf!wXg!wXr!wXs!wXt!wXu!wX}!wX!O!wX!P!wX!Q!wX!R!wX!S!wX!T!wX!U!wXY!wX!V!wX~O!q!wXU!wXl!wX!_!wXT!wXV!wXi!wXj!wXn!wXp!wXw!wXx!wXy!wXz!wX{!wX!W!wX!Z!wX!]!wX!`!wX!a!wX!e!wX!g!wX!h!wX!i!wX!j!wX!k!wX!l!wX!m!wX!d!wX~P!zOZSX[SX]!xX^!xX_!xX`!xXa!xXb!xXc!xXd!xXe!xXf!xXg!xXr!xXs!xXt!xXu!xX}!xX!O!xX!P!xX!Q!xX!R!xX!S!xX!T!xX!U!xX!q!xXY!xX!V!xXU!xXl!xX!_!xXT!xXV!xXi!xXj!xXn!xXp!xXw!xXx!xXy!xXz!xX{!xX!W!xX!Z!xX!]!xX!`!xX!a!xX!e!xX!g!xX!h!xX!i!xX!j!xX!k!xX!l!xX!m!xX!d!xX~OZpO[pO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~OT!POV!OO~Ok!TO~OT!WO~PYOV!XO!Z^O~Ok!ZO~O!W![O~O!W!]O~O!W!^O~Ok!_O~OV!`O~OY!uX!V!uXl!uX~P*jOU!dOY!uX~OY!eO~OU!fOY!tX]!tX^!tX_!tX`!tXa!tXb!tXc!tXd!tXe!tXf!tXg!tXr!tXs!tXt!tXu!tX}!tX!O!tX!P!tX!Q!tX!R!tX!S!tX!T!tX!U!tX~OU!gOYvX]vX^vX_vX`vXavXbvXcvXdvXevXfvXgvXrvXsvXtvXuvX}vX!OvX!PvX!QvX!RvX!SvX!TvX!UvX~OY!uO]!vO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~Orhashathauha!qhaUhaYha!Vhalha!_haThaVhaihajhanhaphawhaxhayhazha{ha!Wha!Zha!]ha!`ha!aha!eha!gha!hha!iha!jha!kha!lha!mha!dha~P1eOY!eO!V!xO~O]!yO~P!zO]#RO~OY#SOl#TO~O!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P*jO]Ri^Ri_Ri`RiaRibRicRidRieRifRigRirRisRitRiuRi!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P+iOssOttOuuOrqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOttOuuOrqisqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOuuOrqisqitqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOrqisqitqiuqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eO}vO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!P|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!O|i~PDbO!OwO~PDbO}vO!OwO!PxO!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!R|i!S|i!T|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!Q|i~PHXO}vO!OwO!PxO!QyO!T|O!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!S|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!R|i~PKwO!RzO~PKwO!QyO~PHXO}vO!OwO!PxO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~OY!eOl#XO~OU#ZO~P*jOY!eOl#[O~O]#]O~O!_#^O~P*jO[#_O~OY!eOl#`O~OU#`O~P*jOUXiYXi!VXilXi~P*jO]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~PVO!_#eO~P*jOV#fO~OY!pil!pi~P*jO!q!nq~P*jOrmysmytmyumy!qmyUmyYmy!Vmylmy!_myTmyVmyimyjmynmypmywmyxmyymyzmy{my!Wmy!Zmy!]my!`my!amy!emy!gmy!hmy!imy!jmy!kmy!lmy!mmy!dmy~P1eO!_#mO~P*jO!V!cX!d!cX~P*jO!V#oO!d#nO~O!_#pO~P*jO!V#qO~P*jOU#rO~P*jO!V#vO~P*jO!V!ci!d!ci~P*jO!V#wO!_#xO~P*jO!V#zO~P*jO!]!hj!gz{!j!k!l!m!iT!e!a!`!a~",
1736
- goto: "1O!zPP!{#y$uPPP&R'VPPPPPPPPPPPPPP#yPPPP'aP(]P#yPPPP(`PPPPP)[PPPPPPPPPP*Y+UP*YP*YPPP*Y,TPP*YPPPPPPP,W,Z,^PPP,d.v/W/W/W0S!phOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRnP!sYOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rSOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xQ!QUS!ai#SQ!|![Q#O!^R#V!u!rROPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x]!PUi![!^!u#SSlP!OX!U]!T!Z!_!sXOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!RU!shOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!peOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRoP!scOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rcOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!Y^R#i#^RjOR!ciQ!biR#b#SQTO[kP]!O!T!Z!_Q!SVQ!gvQ!hpQ!iqQ!jrQ!ksQ!ltQ!muQ!nwQ!oxQ!pyQ!qzQ!r{Q!s|Q!t}Q!z!XQ!}!]Q#Q!`Q#U!eQ#W!vQ#Y!yQ#a#RQ#c#TQ#d#WQ#g#]Q#h#^Q#j#_Q#k#eQ#l#fQ#s#mQ#t#nQ#u#pR#y#xSmP!OQ!V]Q!w!TQ!{!ZR#P!_!seOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!sgOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x",
1737
- nodeNames: "\u26A0 Expression Logic Logic_predicates Variable Local ) ( Tuple Expr_enum_min2 , :\u2208 := \u2208 \u2209 \u2286 \u2284 \u2282 > \u2265 < \u2264 \u2260 = Logic_unary \xAC Predicate [ ] Logic_quantor \u2200 Variable_pack \u2203 Logic_binary \u21D4 \u21D2 \u2228 & Setexpr Integer EmptySet IntegerSet Global Radical Setexpr_binary * + - \u222A \\ \u2206 \u2229 \xD7 } { Enumeration Boolean \u212C Filter_expression Filter Declarative | PrefixD PrefixI Imperative Imp_blocks ; PrefixR Recursion Function BigPr SmallPr Card Bool Debool Red Function_decl Arguments Declaration",
1738
- maxTerm: 87,
1739
- nodeProps: [
1740
- ["openedBy", 6, "(", 53, "{"],
1741
- ["closedBy", 7, ")", 54, "}"]
1742
- ],
1743
- skippedNodes: [0],
1744
- repeatNodeCount: 0,
1745
- tokenData: "6j~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q![']![!]'e!]!^'x!^!_'}!_!`(S!`!a(X!c!d(^!e!f(^!f!g(l!h!i(t!k!l)h!p!q(^!r!s)m!t!u*a!u!v(^!v!w(^!z!{(^!|!}*q!}#O*v#O#P*{#P#Q+Q#R#S+V#T#U+V#U#V+m#V#W-]#W#X.x#X#d+V#d#e1b#e#f+V#f#g2w#g#o+V#o#p4R#p#q4W#q#r4]#y#z%s$f$g%s$r$s4b%o%p4g5i6S+V#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s% l% m4l%%Y%%Z4q%%[%%]4v%&Y%&Z4{%&]%&^5Q%&_%&`5V%&`%&a5[%&b%&c5a%&c%&d5f%'S%'T5k%'T%'U5p%'U%'V5u%(^%(_5z%(b%(c6P%(c%(d6U%)Q%)R6Z%)S%)T6`%)U%)V6e&FU&FV%s~%xY!s~X^%spq%s#y#z%s$f$g%s#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s&FU&FV%s~&mOu~~&rOV~~&wOU~~&|O}~~'RO!O~~'WOY~~']O!P~~'bPw~!Q![']~'hQ!_!`'n%&b%&c's~'sO[~~'xOZ~~'}O!d~~(SOd~~(XOg~~(^Ob~~(aP!Q![(d~(iPz~!Q![(d~(qP!`~!Q![(d~(wQ!Q![(}#]#^)V~)SP!g~!Q![(}~)YP!R![)]~)bQ!]~|})V!Q![)]~)mO!a~~)pQ!Q![)v#f#g*O~){Pj~!Q![)v~*RP!R![*U~*ZQ!h~|}*O!Q![*U~*fP!e~!Q![*i~*nP{~!Q![*i~*vOy~~*{Ok~~+QO!R~~+VOl~~+[RT~!Q![+e#T#o+V5i6S+V~+jPT~!Q![+e~+rTT~!Q![+e#T#c+V#c#d,R#d#o+V5i6S+V~,WTT~!Q![+e#T#c+V#c#d,g#d#o+V5i6S+V~,lTT~!Q![+e#T#`+V#`#a,{#a#o+V5i6S+V~-SR!k~T~!Q![+e#T#o+V5i6S+V~-bST~!Q![+e#T#U-n#U#o+V5i6S+V~-sTT~!Q![+e#T#f+V#f#g.S#g#o+V5i6S+V~.XTT~!Q![+e#T#W+V#W#X.h#X#o+V5i6S+V~.oR!j~T~!Q![+e#T#o+V5i6S+V~.}TT~!Q![+e#T#X+V#X#Y/^#Y#o+V5i6S+V~/cTT~!Q![+e#T#U+V#U#V/r#V#o+V5i6S+V~/wTT~!Q![+e#T#c+V#c#d0W#d#o+V5i6S+V~0]TT~!Q![+e#T#c+V#c#d0l#d#o+V5i6S+V~0qTT~!Q![+e#T#`+V#`#a1Q#a#o+V5i6S+V~1XR!l~T~!Q![+e#T#o+V5i6S+V~1gTT~!Q![+e#T#f+V#f#g1v#g#o+V5i6S+V~1{ST~!Q!R+e!R![2X#T#o+V5i6S+V~2`Q!i~T~|}2f!Q![2X~2iP!R![2l~2qQ!i~|}2f!Q![2l~2|TT~!Q![+e#T#X+V#X#Y3]#Y#o+V5i6S+V~3bTT~!Q![+e#T#W+V#W#X3q#X#o+V5i6S+V~3xR!m~T~!Q![+e#T#o+V5i6S+V~4WO!W~~4]O!_~~4bO!V~~4gOi~~4lO!U~~4qO!Z~~4vOs~~4{Or~~5QOn~~5VOp~~5[Ox~~5aO!S~~5fO]~~5kO^~~5pOt~~5uO!T~~5zO!Q~~6POf~~6UOe~~6ZOc~~6`Oa~~6eO`~~6jO_~",
1746
- tokenizers: [0],
1747
- topRules: { "Expression": [0, 1] },
1748
- tokenPrec: 2679
1749
- });
1750
-
1751
- // src/rslang/parser/parser.terms.ts
1752
- var Expression = 1;
1753
- var Logic = 2;
1754
- var Logic_predicates = 3;
1755
- var Variable = 4;
1756
- var Local = 5;
1757
- var Tuple = 8;
1758
- var Expr_enum_min2 = 9;
1759
- var Logic_unary = 24;
1760
- var Predicate = 26;
1761
- var Logic_quantor = 29;
1762
- var Variable_pack = 31;
1763
- var Logic_binary = 33;
1764
- var Setexpr = 38;
1765
- var Integer = 39;
1766
- var EmptySet = 40;
1767
- var IntegerSet = 41;
1768
- var Global = 42;
1769
- var Radical = 43;
1770
- var Setexpr_binary = 44;
1771
- var Enumeration = 55;
1772
- var Boolean = 56;
1773
- var Filter_expression = 58;
1774
- var Filter = 59;
1775
- var Declarative = 60;
1776
- var PrefixD = 62;
1777
- var Imperative = 64;
1778
- var Imp_blocks = 65;
1779
- var Recursion = 68;
1780
- var Function = 69;
1781
- var BigPr = 70;
1782
- var SmallPr = 71;
1783
- var Card = 72;
1784
- var Bool = 73;
1785
- var Debool = 74;
1786
- var Red = 75;
1787
- var Function_decl = 76;
1788
- var Arguments = 77;
1789
- var Declaration = 78;
1790
-
1791
- // src/rslang/parser/normalize.ts
1792
- function normalizeAST(ast, input) {
1793
- visitAstDFS(ast, (node) => normalizeNode(node, input));
1794
- }
1795
- var idRecord = {
1796
- [Global]: TokenID.ID_GLOBAL,
1797
- [Local]: TokenID.ID_LOCAL,
1798
- [Radical]: TokenID.ID_RADICAL,
1799
- [Function]: TokenID.ID_FUNCTION,
1800
- [Predicate]: TokenID.ID_PREDICATE,
1801
- [Integer]: TokenID.LIT_INTEGER,
1802
- [EmptySet]: TokenID.LIT_EMPTYSET,
1803
- [IntegerSet]: TokenID.LIT_WHOLE_NUMBERS,
1804
- [Boolean]: TokenID.BOOLEAN,
1805
- [BigPr]: TokenID.BIGPR,
1806
- [SmallPr]: TokenID.SMALLPR,
1807
- [Filter]: TokenID.FILTER,
1808
- [Bool]: TokenID.BOOL,
1809
- [Debool]: TokenID.DEBOOL,
1810
- [Red]: TokenID.REDUCE,
1811
- [Card]: TokenID.CARD,
1812
- [Enumeration]: TokenID.NT_ENUMERATION,
1813
- [Tuple]: TokenID.NT_TUPLE,
1814
- [Arguments]: TokenID.NT_ARGUMENTS,
1815
- [Declaration]: TokenID.NT_ARG_DECL,
1816
- [Function_decl]: TokenID.NT_FUNC_DEFINITION,
1817
- [Variable_pack]: TokenID.NT_ENUM_DECL,
1818
- [Declarative]: TokenID.NT_DECLARATIVE_EXPR,
1819
- [Imperative]: TokenID.NT_IMPERATIVE_EXPR
1820
- };
1821
- function normalizeNode(node, input) {
1822
- if (node.hasError) {
1823
- return;
1824
- }
1825
- switch (node.typeID) {
1826
- case 0:
1827
- return;
1828
- case Expression:
1829
- promoteSingleChild(node);
1830
- return;
1831
- case EmptySet:
1832
- case IntegerSet:
1833
- node.typeID = idRecord[node.typeID];
1834
- clearData(node);
1835
- return;
1836
- case Integer:
1837
- node.typeID = idRecord[node.typeID];
1838
- node.data.dataType = "number";
1839
- node.data.value = Number(input.slice(node.from, node.to));
1840
- return;
1841
- case Function:
1842
- case Predicate:
1843
- case Global:
1844
- case Local:
1845
- case Radical:
1846
- case Integer:
1847
- node.typeID = idRecord[node.typeID];
1848
- node.data.dataType = "string";
1849
- node.data.value = input.slice(node.from, node.to);
1850
- return;
1851
- case Boolean:
1852
- node.typeID = idRecord[node.typeID];
1853
- if (node.children.length === 4) {
1854
- node.children = [node.children[2]];
1855
- } else {
1856
- node.children = [node.children[1]];
1857
- }
1858
- clearData(node);
1859
- return;
1860
- case Filter:
1861
- case BigPr:
1862
- case SmallPr:
1863
- node.typeID = idRecord[node.typeID];
1864
- node.data.dataType = "string[]";
1865
- node.data.value = parseIndex(input.slice(node.from + 2, node.to));
1866
- return;
1867
- case Red:
1868
- case Debool:
1869
- case Bool:
1870
- case Card:
1871
- node.typeID = idRecord[node.typeID];
1872
- clearData(node);
1873
- return;
1874
- case Function_decl:
1875
- node.typeID = idRecord[node.typeID];
1876
- clearData(node);
1877
- node.children = [node.children[1], node.children[3]];
1878
- return;
1879
- case Declaration:
1880
- node.typeID = idRecord[node.typeID];
1881
- clearData(node);
1882
- node.children = [node.children[0], node.children[2]];
1883
- return;
1884
- case Arguments:
1885
- node.typeID = idRecord[node.typeID];
1886
- clearData(node);
1887
- if (node.children.length === 3) {
1888
- processLeftEnum(node);
1889
- }
1890
- return;
1891
- case Expr_enum_min2:
1892
- processLeftEnum(node);
1893
- return;
1894
- case Setexpr:
1895
- if (node.children.length === 1) {
1896
- promoteSingleChild(node);
1897
- } else if (node.children.length === 4) {
1898
- processTextFunction(node);
1899
- }
1900
- return;
1901
- case Tuple:
1902
- case Enumeration:
1903
- node.typeID = idRecord[node.typeID];
1904
- clearData(node);
1905
- if (node.children[1].typeID === Expr_enum_min2) {
1906
- for (const child of node.children[1].children) {
1907
- child.parent = node;
1908
- }
1909
- node.children = node.children[1].children;
1910
- } else {
1911
- node.children = [node.children[1]];
1912
- }
1913
- return;
1914
- case Logic_binary:
1915
- case Logic_predicates:
1916
- case Setexpr_binary:
1917
- if (node.children[0].data.value === "(") {
1918
- processParenthesis(node);
1919
- } else {
1920
- clearData(node);
1921
- node.typeID = symbolToToken(node.children[1].data.value);
1922
- if (node.typeID === TokenID.DECART) {
1923
- processDecartChildren(node);
1924
- } else {
1925
- node.children = [node.children[0], node.children[2]];
1926
- }
1927
- }
1928
- return;
1929
- case Filter_expression:
1930
- processFilter(node);
1931
- return;
1932
- case Logic:
1933
- if (node.children[0].data.value === "(") {
1934
- processParenthesis(node);
1935
- } else {
1936
- promoteSingleChild(node);
1937
- }
1938
- return;
1939
- case Logic_unary:
1940
- if (node.children[0].data.value === "\xAC") {
1941
- clearData(node);
1942
- node.typeID = TokenID.LOGIC_NOT;
1943
- node.children = [node.children[1]];
1944
- } else if (node.children[0].typeID === TokenID.ID_PREDICATE) {
1945
- processTextFunction(node);
1946
- } else {
1947
- promoteSingleChild(node);
1948
- }
1949
- return;
1950
- case Logic_quantor:
1951
- clearData(node);
1952
- node.typeID = symbolToToken(node.children[0].data.value);
1953
- node.children = [node.children[1], node.children[3], node.children[4]];
1954
- return;
1955
- case Variable:
1956
- convertTupleDeclaration(node.children[0]);
1957
- promoteSingleChild(node);
1958
- return;
1959
- case Variable_pack:
1960
- if (node.children.length === 1) {
1961
- promoteSingleChild(node);
1962
- } else {
1963
- node.typeID = idRecord[node.typeID];
1964
- processLeftEnum(node);
1965
- }
1966
- return;
1967
- case Declarative:
1968
- node.typeID = idRecord[node.typeID];
1969
- clearData(node);
1970
- if (node.children[0].typeID === PrefixD) {
1971
- node.children = [node.children[2], node.children[4], node.children[6]];
1972
- } else {
1973
- node.children = [node.children[1], node.children[3], node.children[5]];
1974
- }
1975
- return;
1976
- case Imp_blocks:
1977
- if (node.children.length === 1) {
1978
- if (node.parent?.typeID === Imp_blocks) {
1979
- promoteSingleChild(node);
1980
- }
1981
- } else {
1982
- processLeftEnum(node);
1983
- }
1984
- return;
1985
- case Imperative:
1986
- node.typeID = idRecord[node.typeID];
1987
- clearData(node);
1988
- for (const child of node.children[4].children) {
1989
- child.parent = node;
1990
- }
1991
- node.children = [node.children[2], ...node.children[4].children];
1992
- return;
1993
- case Recursion:
1994
- if (node.children.length > 9) {
1995
- node.typeID = TokenID.NT_RECURSIVE_FULL;
1996
- node.children = [node.children[2], node.children[4], node.children[6], node.children[8]];
1997
- } else {
1998
- node.typeID = TokenID.NT_RECURSIVE_SHORT;
1999
- node.children = [node.children[2], node.children[4], node.children[6]];
2000
- }
2001
- return;
2002
- }
2003
- }
2004
- function convertTupleDeclaration(node) {
2005
- if (node.typeID !== TokenID.NT_TUPLE) {
2006
- return;
2007
- }
2008
- node.typeID = TokenID.NT_TUPLE_DECL;
2009
- for (const child of node.children) {
2010
- convertTupleDeclaration(child);
2011
- }
2012
- }
2013
- function clearData(node) {
2014
- node.data.value = null;
2015
- node.data.dataType = "null";
2016
- }
2017
- function promoteSingleChild(node, index = 0) {
2018
- for (const child of node.children[index].children) {
2019
- child.parent = node;
2020
- }
2021
- node.typeID = node.children[index].typeID;
2022
- node.data = node.children[index].data;
2023
- node.parenthesis = node.children[index].parenthesis;
2024
- node.children = node.children[index].children;
2025
- }
2026
- function parseIndex(text) {
2027
- return text.split(",");
2028
- }
2029
- function symbolToToken(symbol) {
2030
- switch (symbol) {
2031
- case "+":
2032
- return TokenID.PLUS;
2033
- case "-":
2034
- return TokenID.MINUS;
2035
- case "*":
2036
- return TokenID.MULTIPLY;
2037
- case "\u222A":
2038
- return TokenID.SET_UNION;
2039
- case "\\":
2040
- return TokenID.SET_MINUS;
2041
- case "\u2206":
2042
- return TokenID.SET_SYMMETRIC_MINUS;
2043
- case "\u2229":
2044
- return TokenID.SET_INTERSECTION;
2045
- case "\xD7":
2046
- return TokenID.DECART;
2047
- case "\u2208":
2048
- return TokenID.SET_IN;
2049
- case "\u2209":
2050
- return TokenID.SET_NOT_IN;
2051
- case "\u2286":
2052
- return TokenID.SUBSET_OR_EQ;
2053
- case "\u2284":
2054
- return TokenID.NOT_SUBSET;
2055
- case "\u2282":
2056
- return TokenID.SUBSET;
2057
- case ">":
2058
- return TokenID.GREATER;
2059
- case "\u2265":
2060
- return TokenID.GREATER_OR_EQ;
2061
- case "<":
2062
- return TokenID.LESSER;
2063
- case "\u2264":
2064
- return TokenID.LESSER_OR_EQ;
2065
- case "\u2260":
2066
- return TokenID.NOTEQUAL;
2067
- case "=":
2068
- return TokenID.EQUAL;
2069
- case ":\u2208":
2070
- return TokenID.ITERATE;
2071
- case ":=":
2072
- return TokenID.ASSIGN;
2073
- case "\xAC":
2074
- return TokenID.LOGIC_NOT;
2075
- case "\u21D4":
2076
- return TokenID.LOGIC_EQUIVALENT;
2077
- case "\u21D2":
2078
- return TokenID.LOGIC_IMPLICATION;
2079
- case "\u2228":
2080
- return TokenID.LOGIC_OR;
2081
- case "&":
2082
- return TokenID.LOGIC_AND;
2083
- case "\u2200":
2084
- return TokenID.QUANTOR_UNIVERSAL;
2085
- case "\u2203":
2086
- return TokenID.QUANTOR_EXISTS;
2087
- }
2088
- return TokenID.ERROR;
2089
- }
2090
- function processParenthesis(node) {
2091
- promoteSingleChild(node, 1);
2092
- node.parenthesis = true;
2093
- }
2094
- function processLeftEnum(node) {
2095
- if (node.children[0].typeID === node.typeID) {
2096
- for (const child of node.children[0].children) {
2097
- child.parent = node;
2098
- }
2099
- node.children = [...node.children[0].children, node.children[2]];
2100
- } else {
2101
- node.children = [node.children[0], node.children[2]];
2102
- }
2103
- }
2104
- function processDecartChildren(node) {
2105
- const newChildren = [];
2106
- if (node.children[0].typeID === TokenID.DECART && !node.children[0].parenthesis) {
2107
- for (const child of node.children[0].children) {
2108
- child.parent = node;
2109
- newChildren.push(child);
2110
- }
2111
- } else {
2112
- newChildren.push(node.children[0]);
2113
- }
2114
- if (node.children[2].typeID === TokenID.DECART && !node.children[2].parenthesis) {
2115
- for (const child of node.children[2].children) {
2116
- child.parent = node;
2117
- newChildren.push(child);
2118
- }
2119
- } else {
2120
- newChildren.push(node.children[2]);
2121
- }
2122
- node.children = newChildren;
2123
- }
2124
- function processTextFunction(node) {
2125
- if (node.children[0].typeID === TokenID.ID_FUNCTION || node.children[0].typeID === TokenID.ID_PREDICATE) {
2126
- node.typeID = TokenID.NT_FUNC_CALL;
2127
- clearData(node);
2128
- if (node.children[2].typeID === Expr_enum_min2) {
2129
- for (const child of node.children[2].children) {
2130
- child.parent = node;
2131
- }
2132
- node.children = [node.children[0], ...node.children[2].children];
2133
- } else {
2134
- node.children = [node.children[0], node.children[2]];
2135
- }
2136
- } else {
2137
- node.typeID = node.children[0].typeID;
2138
- node.data = node.children[0].data;
2139
- node.children = [node.children[2]];
2140
- }
2141
- }
2142
- function processFilter(node) {
2143
- const children = [];
2144
- if (node.children[2].typeID === Expr_enum_min2) {
2145
- for (const child of node.children[2].children) {
2146
- child.parent = node;
2147
- children.push(child);
2148
- }
2149
- } else {
2150
- children.push(node.children[2]);
2151
- }
2152
- children.push(node.children[5]);
2153
- promoteSingleChild(node);
2154
- node.children = children;
2155
- }
2156
-
2157
- // src/rslang/parser/syntax-errors.ts
2158
- function extractSyntaxErrors(ast, expression, reporter, annotateErrors = false) {
2159
- const bracketError = extractBracketErrors(expression);
2160
- if (bracketError !== null) {
2161
- reporter(bracketError);
2162
- if (annotateErrors) {
2163
- annotateError(ast, bracketError.code, bracketError.params);
2164
- }
2165
- }
2166
- const hasBracketErrors = bracketError !== null;
2167
- visitAstDFS(ast, (node) => extractInternal(node, reporter, annotateErrors, hasBracketErrors));
2168
- }
2169
- function extractInternal(node, reporter, annotateErrors, ignoreUnknownErrors) {
2170
- if (node.typeID !== TokenID.ERROR) {
2171
- return;
2172
- }
2173
- function emit(target, code) {
2174
- reporter({ code, from: target.from, to: target.to });
2175
- if (annotateErrors) {
2176
- annotateError(target, code);
2177
- }
2178
- }
2179
- const parent = node.parent;
2180
- if (parent === null) {
2181
- if (!ignoreUnknownErrors) {
2182
- return emit(node, RSErrorCode.unknownSyntax);
2183
- }
2184
- return;
2185
- }
2186
- if (parent.typeID === Variable) {
2187
- return emit(parent, RSErrorCode.expectedLocal);
2188
- }
2189
- if (!ignoreUnknownErrors) {
2190
- emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);
2191
- }
2192
- }
2193
- function extractBracketErrors(expression) {
2194
- const stack = [];
2195
- for (let pos = 0; pos < expression.length; pos++) {
2196
- const symbol = expression[pos];
2197
- if (isOpenBracket(symbol)) {
2198
- if (isDoubleParenthesis(expression, pos)) {
2199
- return {
2200
- code: RSErrorCode.doubleParenthesis,
2201
- from: pos,
2202
- to: pos + 2
2203
- };
2204
- }
2205
- stack.push({ bracket: symbol, index: pos });
2206
- continue;
2207
- }
2208
- if (!isCloseBracket(symbol)) {
2209
- continue;
2210
- }
2211
- const expectedOpen = closeToOpen(symbol);
2212
- const top = stack[stack.length - 1];
2213
- if (top === void 0) {
2214
- return {
2215
- code: RSErrorCode.missingOpenBracket,
2216
- from: pos,
2217
- to: pos + 1,
2218
- params: [expectedOpen]
2219
- };
2220
- }
2221
- if (top.bracket !== expectedOpen) {
2222
- return {
2223
- code: RSErrorCode.bracketMismatch,
2224
- from: pos,
2225
- to: pos + 1,
2226
- params: [openToClose(top.bracket), symbol]
2227
- };
2228
- }
2229
- stack.pop();
2230
- }
2231
- if (stack.length > 0) {
2232
- const unclosed = stack[0];
2233
- const code = missingBracketCode(unclosed.bracket);
2234
- return {
2235
- code,
2236
- from: expression.length,
2237
- to: expression.length
2238
- };
2239
- }
2240
- return null;
2241
- }
2242
- function missingBracketCode(bracket) {
2243
- switch (bracket) {
2244
- case "(":
2245
- return RSErrorCode.missingParenthesis;
2246
- case "[":
2247
- return RSErrorCode.missingSquareBracket;
2248
- case "{":
2249
- return RSErrorCode.missingCurlyBrace;
2250
- }
2251
- }
2252
- function isOpenBracket(symbol) {
2253
- return symbol === "(" || symbol === "[" || symbol === "{";
2254
- }
2255
- function isCloseBracket(symbol) {
2256
- return symbol === ")" || symbol === "]" || symbol === "}";
2257
- }
2258
- function openToClose(symbol) {
2259
- switch (symbol) {
2260
- case "(":
2261
- return ")";
2262
- case "[":
2263
- return "]";
2264
- case "{":
2265
- return "}";
2266
- }
2267
- }
2268
- function closeToOpen(symbol) {
2269
- switch (symbol) {
2270
- case ")":
2271
- return "(";
2272
- case "]":
2273
- return "[";
2274
- case "}":
2275
- return "{";
2276
- }
2277
- }
2278
- function isDoubleParenthesis(expression, pos) {
2279
- const isOpenDoubleParenthesis = expression[pos] === "(" && expression[pos + 1] === "(";
2280
- if (!isOpenDoubleParenthesis) {
2281
- return false;
2282
- }
2283
- const outerClose = findMatchingCloseBracket(expression, pos);
2284
- const innerClose = findMatchingCloseBracket(expression, pos + 1);
2285
- if (outerClose < 0 || innerClose < 0) {
2286
- return false;
2287
- }
2288
- return outerClose === innerClose + 1;
2289
- }
2290
- function findMatchingCloseBracket(expression, openPos) {
2291
- if (expression[openPos] !== "(") {
2292
- return -1;
2293
- }
2294
- const stack = [];
2295
- for (let index = openPos; index < expression.length; index++) {
2296
- const symbol = expression[index];
2297
- if (isOpenBracket(symbol)) {
2298
- stack.push(symbol);
2299
- continue;
2300
- }
2301
- if (!isCloseBracket(symbol)) {
2302
- continue;
2303
- }
2304
- const top = stack.pop();
2305
- if (top === void 0 || top !== closeToOpen(symbol)) {
2306
- return -1;
2307
- }
2308
- if (stack.length === 0) {
2309
- return index;
2310
- }
2311
- }
2312
- return -1;
2313
- }
2314
-
2315
- // src/rslang/labels.ts
2316
- var INTEGER_TYPE_NAME = "Z";
2317
- var ANY_TYPE_NAME = "R0";
2318
- var LOGIC_TYPE_NAME = "Logic";
2319
- var labelTokenRecord = {
2320
- [TokenID.DECART]: "\xD7",
2321
- [TokenID.PUNCTUATION_PL]: "( )",
2322
- [TokenID.PUNCTUATION_SL]: "[ ]",
2323
- [TokenID.QUANTOR_UNIVERSAL]: "\u2200",
2324
- [TokenID.QUANTOR_EXISTS]: "\u2203",
2325
- [TokenID.LOGIC_NOT]: "\xAC",
2326
- [TokenID.LOGIC_AND]: "&",
2327
- [TokenID.LOGIC_OR]: "\u2228",
2328
- [TokenID.LOGIC_IMPLICATION]: "\u21D2",
2329
- [TokenID.LOGIC_EQUIVALENT]: "\u21D4",
2330
- [TokenID.LIT_EMPTYSET]: "\u2205",
2331
- [TokenID.LIT_WHOLE_NUMBERS]: "Z",
2332
- [TokenID.MULTIPLY]: "*",
2333
- [TokenID.EQUAL]: "=",
2334
- [TokenID.NOTEQUAL]: "\u2260",
2335
- [TokenID.GREATER_OR_EQ]: "\u2265",
2336
- [TokenID.LESSER_OR_EQ]: "\u2264",
2337
- [TokenID.SET_IN]: "\u2208",
2338
- [TokenID.SET_NOT_IN]: "\u2209",
2339
- [TokenID.SUBSET_OR_EQ]: "\u2286",
2340
- [TokenID.SUBSET]: "\u2282",
2341
- [TokenID.NOT_SUBSET]: "\u2284",
2342
- [TokenID.SET_INTERSECTION]: "\u2229",
2343
- [TokenID.SET_UNION]: "\u222A",
2344
- [TokenID.SET_MINUS]: "\\",
2345
- [TokenID.SET_SYMMETRIC_MINUS]: "\u2206",
2346
- [TokenID.BOOLEAN]: "\u212C()",
2347
- [TokenID.NT_DECLARATIVE_EXPR]: "D{}",
2348
- [TokenID.NT_IMPERATIVE_EXPR]: "I{}",
2349
- [TokenID.NT_RECURSIVE_FULL]: "R{}",
2350
- [TokenID.BIGPR]: "Pr1()",
2351
- [TokenID.SMALLPR]: "pr1()",
2352
- [TokenID.FILTER]: "Fi1[]()",
2353
- [TokenID.REDUCE]: "red()",
2354
- [TokenID.CARD]: "card()",
2355
- [TokenID.BOOL]: "bool()",
2356
- [TokenID.DEBOOL]: "debool()",
2357
- [TokenID.ASSIGN]: ":=",
2358
- [TokenID.ITERATE]: ":\u2208"
2359
- };
2360
- function labelToken(id) {
2361
- const text = labelTokenRecord[id];
2362
- return text ?? "UNKNOWN TOKEN: " + String(id);
2363
- }
2364
- function labelRSLangNode(node) {
2365
- switch (node.typeID) {
2366
- case TokenID.ERROR:
2367
- return "[ERROR]";
2368
- case TokenID.ID_LOCAL:
2369
- case TokenID.ID_GLOBAL:
2370
- case TokenID.ID_FUNCTION:
2371
- case TokenID.ID_PREDICATE:
2372
- case TokenID.ID_RADICAL:
2373
- return node.data.value;
2374
- case TokenID.LIT_INTEGER:
2375
- return String(node.data.value);
2376
- case TokenID.BIGPR:
2377
- return "Pr" + node.data.value.toString();
2378
- case TokenID.SMALLPR:
2379
- return "pr" + node.data.value.toString();
2380
- case TokenID.FILTER:
2381
- return "Fi" + node.data.value.toString();
2382
- case TokenID.NT_DECLARATIVE_EXPR:
2383
- return "DECLARATIVE";
2384
- case TokenID.NT_IMPERATIVE_EXPR:
2385
- return "IMPERATIVE";
2386
- case TokenID.NT_RECURSIVE_FULL:
2387
- return "RECURSIVE";
2388
- case TokenID.NT_RECURSIVE_SHORT:
2389
- return "RECURSIVE";
2390
- case TokenID.BOOLEAN:
2391
- return "\u212C";
2392
- case TokenID.REDUCE:
2393
- return "red";
2394
- case TokenID.CARD:
2395
- return "card";
2396
- case TokenID.BOOL:
2397
- return "bool";
2398
- case TokenID.DEBOOL:
2399
- return "debool";
2400
- case TokenID.PLUS:
2401
- return "+";
2402
- case TokenID.MINUS:
2403
- return "-";
2404
- case TokenID.MULTIPLY:
2405
- return "*";
2406
- case TokenID.GREATER:
2407
- return ">";
2408
- case TokenID.LESSER:
2409
- return "<";
2410
- case TokenID.NT_TUPLE:
2411
- return "TUPLE";
2412
- case TokenID.NT_ENUMERATION:
2413
- return "ENUM";
2414
- case TokenID.NT_ENUM_DECL:
2415
- return "ENUM_DECLARE";
2416
- case TokenID.NT_TUPLE_DECL:
2417
- return "TUPLE_DECLARE";
2418
- case TokenID.PUNCTUATION_DEFINE:
2419
- return "DEFINITION";
2420
- case TokenID.PUNCTUATION_STRUCT:
2421
- return "STRUCTURE_DEFINE";
2422
- case TokenID.NT_ARG_DECL:
2423
- return "ARG";
2424
- case TokenID.NT_FUNC_CALL:
2425
- return "CALL";
2426
- case TokenID.NT_ARGUMENTS:
2427
- return "ARGS";
2428
- case TokenID.NT_FUNC_DEFINITION:
2429
- return "FUNCTION_DEFINE";
2430
- case TokenID.DECART:
2431
- case TokenID.QUANTOR_UNIVERSAL:
2432
- case TokenID.QUANTOR_EXISTS:
2433
- case TokenID.LOGIC_NOT:
2434
- case TokenID.LOGIC_AND:
2435
- case TokenID.LOGIC_OR:
2436
- case TokenID.LOGIC_IMPLICATION:
2437
- case TokenID.LOGIC_EQUIVALENT:
2438
- case TokenID.LIT_EMPTYSET:
2439
- case TokenID.LIT_WHOLE_NUMBERS:
2440
- case TokenID.EQUAL:
2441
- case TokenID.NOTEQUAL:
2442
- case TokenID.GREATER_OR_EQ:
2443
- case TokenID.LESSER_OR_EQ:
2444
- case TokenID.SET_IN:
2445
- case TokenID.SET_NOT_IN:
2446
- case TokenID.SUBSET_OR_EQ:
2447
- case TokenID.SUBSET:
2448
- case TokenID.NOT_SUBSET:
2449
- case TokenID.SET_INTERSECTION:
2450
- case TokenID.SET_UNION:
2451
- case TokenID.SET_MINUS:
2452
- case TokenID.SET_SYMMETRIC_MINUS:
2453
- case TokenID.ASSIGN:
2454
- case TokenID.ITERATE:
2455
- return labelToken(node.typeID);
2456
- }
2457
- if (node.data.value) {
2458
- return node.data.value;
2459
- }
2460
- return "UNKNOWN NODE: " + String(node.typeID);
2461
- }
2462
- function labelType(type) {
2463
- if (!type) {
2464
- return "N/A";
2465
- }
2466
- switch (type.typeID) {
2467
- case TypeID.anyTypification:
2468
- return ANY_TYPE_NAME;
2469
- case TypeID.integer:
2470
- return INTEGER_TYPE_NAME;
2471
- case TypeID.basic:
2472
- return type.baseID;
2473
- case TypeID.tuple:
2474
- return type.factors.map((factor) => factor.typeID === TypeID.tuple ? `(${labelType(factor)})` : labelType(factor)).join("\xD7");
2475
- case TypeID.collection:
2476
- return type.base.typeID === TypeID.collection ? `\u212C${labelType(type.base)}` : `\u212C(${labelType(type.base)})`;
2477
- case TypeID.logic:
2478
- return LOGIC_TYPE_NAME;
2479
- case TypeID.predicate:
2480
- case TypeID.function:
2481
- const argsText = type.args.map((arg) => labelType(arg.type)).join(", ");
2482
- return `[${argsText}] \u2192 ${labelType(type.result)}`;
2483
- }
2484
- }
2485
-
2486
- // src/rslang/semantic/typification-api.ts
2487
- var TypeIDToClass = {
2488
- [TypeID.anyTypification]: TypeClass.typification,
2489
- [TypeID.integer]: TypeClass.typification,
2490
- [TypeID.basic]: TypeClass.typification,
2491
- [TypeID.tuple]: TypeClass.typification,
2492
- [TypeID.collection]: TypeClass.typification,
2493
- [TypeID.logic]: TypeClass.logic,
2494
- [TypeID.function]: TypeClass.function,
2495
- [TypeID.predicate]: TypeClass.predicate
2496
- };
2497
- function getTypeClass(typeID) {
2498
- return TypeIDToClass[typeID];
2499
- }
2500
- function hasGenerics(type) {
2501
- switch (type.typeID) {
2502
- case TypeID.anyTypification:
2503
- return true;
2504
- case TypeID.integer:
2505
- return false;
2506
- case TypeID.basic:
2507
- return isRadical(type.baseID);
2508
- case TypeID.collection:
2509
- return hasGenerics(type.base);
2510
- case TypeID.tuple:
2511
- for (const factor of type.factors) {
2512
- if (hasGenerics(factor)) {
2513
- return true;
2514
- }
2515
- }
2516
- return false;
2517
- }
2518
- }
2519
- function checkEquality(type1, type2) {
2520
- if (type1 === type2) {
2521
- return true;
2522
- }
2523
- if (type1.typeID !== type2.typeID) {
2524
- return false;
2525
- }
2526
- switch (type1.typeID) {
2527
- case TypeID.integer:
2528
- case TypeID.anyTypification:
2529
- return true;
2530
- case TypeID.basic:
2531
- return type1.baseID === type2.baseID;
2532
- case TypeID.collection:
2533
- return checkEquality(type1.base, type2.base);
2534
- case TypeID.tuple: {
2535
- if (type1.factors.length !== type2.factors.length) {
2536
- return false;
2537
- }
2538
- for (let index = 0; index < type1.factors.length; ++index) {
2539
- if (!checkEquality(type1.factors[index], type2.factors[index])) {
2540
- return false;
2541
- }
2542
- }
2543
- return true;
2544
- }
2545
- }
2546
- }
2547
- function mergeTypifications(type1, type2) {
2548
- if (type1 === type2) {
2549
- return type1;
2550
- }
2551
- if (type1.typeID === TypeID.anyTypification) {
2552
- return isTypification(type2) ? type2 : null;
2553
- }
2554
- if (type2.typeID === TypeID.anyTypification) {
2555
- return isTypification(type1) ? type1 : null;
2556
- }
2557
- switch (type1.typeID) {
2558
- case TypeID.integer:
2559
- case TypeID.basic:
2560
- return commonType(type1, type2);
2561
- case TypeID.collection:
2562
- if (type2.typeID !== TypeID.collection) {
2563
- return null;
2564
- }
2565
- const base = mergeTypifications(type1.base, type2.base);
2566
- return base ? bool(base) : null;
2567
- case TypeID.tuple:
2568
- if (type2.typeID !== TypeID.tuple) {
2569
- return null;
2570
- }
2571
- if (type1.factors.length !== type2.factors.length) {
2572
- return null;
2573
- }
2574
- const components = [];
2575
- for (let index = 0; index < type1.factors.length; ++index) {
2576
- const component2 = mergeTypifications(type1.factors[index], type2.factors[index]);
2577
- if (component2 === null) {
2578
- return null;
2579
- }
2580
- components.push(component2);
2581
- }
2582
- return tuple(components);
2583
- }
2584
- }
2585
- function checkCompatibility(type1, type2) {
2586
- if (type1 === type2) {
2587
- return true;
2588
- }
2589
- if (type1.typeID === TypeID.anyTypification) {
2590
- return isTypification(type2);
2591
- }
2592
- if (type2.typeID === TypeID.anyTypification) {
2593
- return isTypification(type1);
2594
- }
2595
- if (isTypification(type1) !== isTypification(type2)) {
2596
- return false;
2597
- }
2598
- if (type1.typeID === TypeID.integer || type1.typeID === TypeID.basic || type2.typeID === TypeID.integer || type2.typeID === TypeID.basic) {
2599
- return commonType(type1, type2) !== null;
2600
- }
2601
- if (type1.typeID !== type2.typeID) {
2602
- return false;
2603
- }
2604
- switch (type1.typeID) {
2605
- case TypeID.collection:
2606
- return checkCompatibility(type1.base, type2.base);
2607
- case TypeID.tuple:
2608
- if (type1.factors.length !== type2.factors.length) {
2609
- return false;
2610
- }
2611
- for (let index = 0; index < type1.factors.length; ++index) {
2612
- if (!checkCompatibility(type1.factors[index], type2.factors[index])) {
2613
- return false;
2614
- }
2615
- }
2616
- return true;
2617
- case TypeID.logic:
2618
- case TypeID.predicate:
2619
- case TypeID.function:
2620
- return false;
2621
- }
2622
- }
2623
- function compareTemplated(substitutes, arg, value) {
2624
- if (arg === value) {
2625
- return true;
2626
- }
2627
- if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {
2628
- if (!substitutes.has(arg.baseID)) {
2629
- substitutes.set(arg.baseID, value);
2630
- return true;
2631
- } else {
2632
- const mergeType = mergeTypifications(substitutes.get(arg.baseID), value);
2633
- if (mergeType === null) {
2634
- return false;
2635
- }
2636
- substitutes.set(arg.baseID, mergeType);
2637
- return true;
2638
- }
2639
- }
2640
- if (value.typeID === TypeID.anyTypification) {
2641
- return true;
2642
- }
2643
- if (arg.typeID === TypeID.integer || arg.typeID === TypeID.basic || value.typeID === TypeID.integer || value.typeID === TypeID.basic) {
2644
- return commonType(arg, value) !== null;
2645
- }
2646
- if (arg.typeID !== value.typeID) {
2647
- return false;
2648
- }
2649
- switch (arg.typeID) {
2650
- case TypeID.collection:
2651
- return compareTemplated(substitutes, arg.base, value.base);
2652
- case TypeID.tuple: {
2653
- if (arg.factors.length !== value.factors.length) {
2654
- return false;
2655
- }
2656
- for (let index = 0; index < arg.factors.length; ++index) {
2657
- if (!compareTemplated(substitutes, arg.factors[index], value.factors[index])) {
2658
- return false;
2659
- }
2660
- }
2661
- return true;
2662
- }
2663
- }
2664
- }
2665
- function substituteBase(target, substitutes) {
2666
- switch (target.typeID) {
2667
- case TypeID.basic: {
2668
- if (substitutes.has(target.baseID)) {
2669
- Object.assign(target, substitutes.get(target.baseID));
2670
- }
2671
- return;
2672
- }
2673
- case TypeID.collection: {
2674
- substituteBase(target.base, substitutes);
2675
- return;
2676
- }
2677
- case TypeID.tuple: {
2678
- for (const factor of target.factors) {
2679
- substituteBase(factor, substitutes);
2680
- }
2681
- return;
2682
- }
2683
- }
2684
- }
2685
- function commonType(type1, type2) {
2686
- if (type1 === type2) {
2687
- return type1;
2688
- }
2689
- const int1 = "isIntegerCompatible" in type1 && type1.isIntegerCompatible;
2690
- const int2 = "isIntegerCompatible" in type2 && type2.isIntegerCompatible;
2691
- if (!int1 || !int2) {
2692
- if (type1.typeID === TypeID.basic && type2.typeID === TypeID.basic) {
2693
- return type1.baseID === type2.baseID ? type1 : null;
2694
- }
2695
- return null;
2696
- }
2697
- if (type1.typeID === TypeID.integer) {
2698
- return type2;
2699
- } else if (type2.typeID === TypeID.integer) {
2700
- return type1;
2701
- } else {
2702
- return IntegerT;
2703
- }
2704
- }
2705
-
2706
- // src/rslang/semantic/type-auditor.ts
2707
- var TypeAuditor = class _TypeAuditor {
2708
- static TYPE_DEDUCTION_DEPTH = 5;
2709
- context;
2710
- reporter;
2711
- locals;
2712
- annotateTypes;
2713
- annotateErrors;
2714
- constructor(context) {
2715
- this.annotateTypes = false;
2716
- this.annotateErrors = false;
2717
- this.context = context;
2718
- this.locals = new LocalContext2(this.onError.bind(this));
2719
- }
2720
- run(ast, annotateTypes, reporter, annotateErrors = false) {
2721
- if (ast.hasError) {
2722
- return null;
2723
- }
2724
- this.annotateTypes = annotateTypes;
2725
- this.annotateErrors = annotateErrors;
2726
- this.reporter = reporter;
2727
- this.clear();
2728
- return this.dispatchVisit(ast);
2729
- }
2730
- clear() {
2731
- this.locals = new LocalContext2(this.onError.bind(this));
2732
- }
2733
- dispatchDeclare(node, domain) {
2734
- const result = this.processDeclare(node, domain);
2735
- if (result === true && this.annotateTypes) {
2736
- annotateType(node, domain);
2737
- }
2738
- return result;
2739
- }
2740
- processDeclare(node, domain) {
2741
- switch (node.typeID) {
2742
- case TokenID.ID_LOCAL:
2743
- return this.declareLocal(node, domain);
2744
- case TokenID.NT_TUPLE_DECL:
2745
- return this.declareTuple(node, domain);
2746
- case TokenID.NT_ENUM_DECL:
2747
- return this.declareEnumeration(node, domain);
2748
- }
2749
- return false;
2750
- }
2751
- declareLocal(node, domain) {
2752
- return this.locals.pushLocal(node, domain);
2753
- }
2754
- declareTuple(node, domain) {
2755
- if (domain.typeID !== TypeID.tuple || domain.factors.length !== node.children.length) {
2756
- this.onError(RSErrorCode.invalidCortegeDeclare, node.children[0]);
2757
- return false;
2758
- }
2759
- for (let child = 0; child < node.children.length; child++) {
2760
- if (!this.visitChildDeclaration(node, child, component(domain, child + 1))) {
2761
- return false;
2762
- }
2763
- }
2764
- return true;
2765
- }
2766
- declareEnumeration(node, domain) {
2767
- for (const child of node.children) {
2768
- if (!this.dispatchDeclare(child, domain)) {
2769
- return false;
2770
- }
2771
- }
2772
- return true;
2773
- }
2774
- dispatchVisit(node) {
2775
- const result = this.processVisit(node);
2776
- if (result !== null && this.annotateTypes) {
2777
- annotateType(node, result);
2778
- }
2779
- return result;
2780
- }
2781
- processVisit(node) {
2782
- switch (node.typeID) {
2783
- case TokenID.ID_GLOBAL:
2784
- case TokenID.ID_FUNCTION:
2785
- case TokenID.ID_PREDICATE:
2786
- return this.visitGlobal(node);
2787
- case TokenID.ID_LOCAL:
2788
- return this.visitLocal(node);
2789
- case TokenID.ID_RADICAL:
2790
- return this.visitRadical(node);
2791
- case TokenID.LIT_INTEGER:
2792
- return IntegerT;
2793
- case TokenID.LIT_WHOLE_NUMBERS:
2794
- return bool(IntegerT);
2795
- case TokenID.LIT_EMPTYSET:
2796
- return this.visitEmptySet(node);
2797
- case TokenID.NT_ARGUMENTS:
2798
- return this.visitArgumentsEnum(node);
2799
- case TokenID.NT_ARG_DECL:
2800
- return this.visitArgument(node);
2801
- case TokenID.PLUS:
2802
- case TokenID.MINUS:
2803
- case TokenID.MULTIPLY:
2804
- return this.visitArithmetic(node);
2805
- case TokenID.QUANTOR_UNIVERSAL:
2806
- case TokenID.QUANTOR_EXISTS:
2807
- return this.visitQuantifier(node);
2808
- case TokenID.LOGIC_NOT:
2809
- return this.visitNegation(node);
2810
- case TokenID.LOGIC_AND:
2811
- case TokenID.LOGIC_OR:
2812
- case TokenID.LOGIC_IMPLICATION:
2813
- case TokenID.LOGIC_EQUIVALENT:
2814
- return this.visitLogicBinary(node);
2815
- case TokenID.EQUAL:
2816
- case TokenID.NOTEQUAL:
2817
- return this.visitEquals(node);
2818
- case TokenID.GREATER:
2819
- case TokenID.LESSER:
2820
- case TokenID.GREATER_OR_EQ:
2821
- case TokenID.LESSER_OR_EQ:
2822
- return this.visitIntegerPredicate(node);
2823
- case TokenID.SET_IN:
2824
- case TokenID.SET_NOT_IN:
2825
- case TokenID.SUBSET:
2826
- case TokenID.SUBSET_OR_EQ:
2827
- case TokenID.NOT_SUBSET:
2828
- return this.visitSetexprPredicate(node);
2829
- case TokenID.DECART:
2830
- return this.visitDecart(node);
2831
- case TokenID.BOOLEAN:
2832
- return this.visitBoolean(node);
2833
- case TokenID.NT_TUPLE:
2834
- return this.visitTuple(node);
2835
- case TokenID.NT_ENUMERATION:
2836
- return this.visitEnumeration(node);
2837
- case TokenID.BIGPR:
2838
- return this.visitProjectSet(node);
2839
- case TokenID.SMALLPR:
2840
- return this.visitProjectTuple(node);
2841
- case TokenID.FILTER:
2842
- return this.visitFilter(node);
2843
- case TokenID.CARD:
2844
- return this.visitCard(node);
2845
- case TokenID.REDUCE:
2846
- return this.visitReduce(node);
2847
- case TokenID.BOOL:
2848
- return this.visitBool(node);
2849
- case TokenID.DEBOOL:
2850
- return this.visitDebool(node);
2851
- case TokenID.SET_UNION:
2852
- case TokenID.SET_INTERSECTION:
2853
- case TokenID.SET_MINUS:
2854
- case TokenID.SET_SYMMETRIC_MINUS:
2855
- return this.visitSetexprBinary(node);
2856
- case TokenID.NT_FUNC_DEFINITION:
2857
- return this.visitFunctionDefinition(node);
2858
- case TokenID.NT_FUNC_CALL:
2859
- return this.visitFunctionCall(node);
2860
- case TokenID.ITERATE:
2861
- return this.visitIterate(node);
2862
- case TokenID.ASSIGN:
2863
- return this.visitAssign(node);
2864
- case TokenID.NT_DECLARATIVE_EXPR:
2865
- return this.visitDeclarative(node);
2866
- case TokenID.NT_IMPERATIVE_EXPR:
2867
- return this.visitImperative(node);
2868
- case TokenID.NT_RECURSIVE_FULL:
2869
- case TokenID.NT_RECURSIVE_SHORT:
2870
- return this.visitRecursion(node);
2871
- }
2872
- return null;
2873
- }
2874
- onError(code, node, params) {
2875
- this.reporter?.({ code, from: node.from, to: node.to, params });
2876
- if (this.annotateErrors) {
2877
- annotateError(node, code, params);
2878
- }
2879
- return null;
2880
- }
2881
- visitChild(node, index) {
2882
- if (index >= node.children.length) {
2883
- return null;
2884
- }
2885
- return this.dispatchVisit(node.children[index]);
2886
- }
2887
- visitChildDeclaration(node, index, domain) {
2888
- if (index >= node.children.length) {
2889
- return false;
2890
- }
2891
- if (!this.dispatchDeclare(node.children[index], domain)) {
2892
- return false;
2893
- }
2894
- return true;
2895
- }
2896
- visitAllAndReturn(node, type) {
2897
- for (const child of node.children) {
2898
- if (!this.dispatchVisit(child)) {
2899
- return null;
2900
- }
2901
- }
2902
- return type;
2903
- }
2904
- childTypification(node, index) {
2905
- const result = this.visitChild(node, index);
2906
- if (result === null) {
2907
- return null;
2908
- }
2909
- if (!isTypification(result)) {
2910
- this.onError(RSErrorCode.expectedSetexpr, node.children[index], [labelType(result)]);
2911
- return null;
2912
- }
2913
- return result;
2914
- }
2915
- childLogic(node, index) {
2916
- const result = this.visitChild(node, index);
2917
- if (result === null) {
2918
- return false;
2919
- }
2920
- if (result.typeID !== TypeID.logic) {
2921
- this.onError(RSErrorCode.expectedLogic, node.children[index], [labelType(result)]);
2922
- return false;
2923
- }
2924
- return true;
2925
- }
2926
- childTypeDebool(node, index, errorCode) {
2927
- const result = this.childTypification(node, index);
2928
- if (result === null) {
2929
- return null;
2930
- }
2931
- if (result.typeID === TypeID.anyTypification) {
2932
- return result;
2933
- }
2934
- if (result.typeID !== TypeID.collection) {
2935
- this.onError(errorCode, node.children[index], [labelType(result)]);
2936
- return null;
2937
- }
2938
- return debool(result);
2939
- }
2940
- visitLocal(node) {
2941
- return this.locals.getLocalType(node);
2942
- }
2943
- visitGlobal(node) {
2944
- const alias = getNodeText(node);
2945
- const type = this.context.get(alias);
2946
- if (!type) {
2947
- return this.onError(RSErrorCode.globalNotTyped, node, [alias]);
2948
- }
2949
- return type;
2950
- }
2951
- visitFunctionDefinition(node) {
2952
- this.locals.startScope();
2953
- if (!this.visitChild(node, 0)) {
2954
- return null;
2955
- }
2956
- const args = [];
2957
- for (const local of this.locals.data) {
2958
- if (local.level === 1) {
2959
- args.push({ alias: local.alias, type: local.type });
2960
- }
2961
- }
2962
- const result = this.visitChild(node, 1);
2963
- if (result === null || result.typeID === TypeID.function || result.typeID === TypeID.predicate) {
2964
- return null;
2965
- }
2966
- this.locals.endScope(node.children[1]);
2967
- if (result.typeID === TypeID.logic) {
2968
- return {
2969
- typeID: TypeID.predicate,
2970
- result,
2971
- args
2972
- };
2973
- } else {
2974
- return {
2975
- typeID: TypeID.function,
2976
- result,
2977
- args
2978
- };
2979
- }
2980
- }
2981
- visitFunctionCall(node) {
2982
- const funcName = getNodeText(node.children[0]);
2983
- const funcType = this.context.get(funcName);
2984
- if (funcType?.typeID !== TypeID.function && funcType?.typeID !== TypeID.predicate) {
2985
- return this.onError(RSErrorCode.globalNotTyped, node.children[0], [funcName]);
2986
- }
2987
- if (this.annotateTypes) {
2988
- annotateType(node.children[0], funcType);
2989
- }
2990
- const substitutes = this.checkFuncArguments(node, funcName, funcType);
2991
- if (substitutes === null) {
2992
- return null;
2993
- }
2994
- if (funcType.result.typeID === TypeID.logic) {
2995
- return funcType.result;
2996
- } else {
2997
- const result = mangleRadicals(funcName, funcType.result);
2998
- if (substitutes.size > 0) {
2999
- substituteBase(result, substitutes);
3000
- }
3001
- return result;
3002
- }
3003
- }
3004
- visitRadical(node) {
3005
- const alias = getNodeText(node);
3006
- if (!this.isInsideFuncArgument(node)) {
3007
- return this.onError(RSErrorCode.radicalUsage, node, [alias]);
3008
- }
3009
- return bool({ typeID: TypeID.basic, baseID: alias });
3010
- }
3011
- visitEmptySet(node) {
3012
- const invalidParents = [
3013
- TokenID.CARD,
3014
- TokenID.DEBOOL,
3015
- TokenID.SET_UNION,
3016
- TokenID.SET_INTERSECTION,
3017
- TokenID.SET_MINUS,
3018
- TokenID.SET_SYMMETRIC_MINUS,
3019
- TokenID.REDUCE,
3020
- TokenID.BIGPR,
3021
- TokenID.SMALLPR
3022
- ];
3023
- if (invalidParents.includes(node.parent?.typeID)) {
3024
- return this.onError(RSErrorCode.invalidEmptySetUsage, node);
3025
- }
3026
- return EmptySetT;
3027
- }
3028
- visitArgument(node) {
3029
- const variable = node.children[0];
3030
- if (variable.typeID === TokenID.NT_TUPLE_DECL) {
3031
- return this.onError(RSErrorCode.invalidArgumentCortegeDeclare, variable);
3032
- }
3033
- const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3034
- if (domain === null) {
3035
- return null;
3036
- }
3037
- if (!this.visitChildDeclaration(node, 0, domain)) {
3038
- return null;
3039
- }
3040
- return domain;
3041
- }
3042
- visitCard(node) {
3043
- if (!this.childTypeDebool(node, 0, RSErrorCode.invalidCard)) {
3044
- return null;
3045
- }
3046
- return IntegerT;
3047
- }
3048
- visitArithmetic(node) {
3049
- const type1 = this.childTypification(node, 0);
3050
- if (type1 === null) {
3051
- return null;
3052
- }
3053
- if (!("isArithmetic" in type1 && type1.isArithmetic)) {
3054
- return this.onError(RSErrorCode.arithmeticNotSupported, node.children[0], [labelType(type1)]);
3055
- }
3056
- const type2 = this.childTypification(node, 1);
3057
- if (type2 === null) {
3058
- return null;
3059
- }
3060
- if (!("isArithmetic" in type2 && type2.isArithmetic)) {
3061
- return this.onError(RSErrorCode.arithmeticNotSupported, node.children[1], [labelType(type2)]);
3062
- }
3063
- const result = mergeTypifications(type1, type2);
3064
- if (result === null) {
3065
- return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);
3066
- }
3067
- return result;
3068
- }
3069
- visitIntegerPredicate(node) {
3070
- const type1 = this.childTypification(node, 0);
3071
- if (type1 === null) {
3072
- return null;
3073
- }
3074
- if (!("isOrdered" in type1 && type1.isOrdered)) {
3075
- return this.onError(RSErrorCode.orderingNotSupported, node.children[0], [labelType(type1)]);
3076
- }
3077
- const type2 = this.childTypification(node, 1);
3078
- if (type2 === null) {
3079
- return null;
3080
- }
3081
- if (!("isOrdered" in type2 && type2.isOrdered)) {
3082
- return this.onError(RSErrorCode.orderingNotSupported, node.children[1], [labelType(type2)]);
3083
- }
3084
- if (!checkCompatibility(type1, type2)) {
3085
- return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);
3086
- }
3087
- return LogicT;
3088
- }
3089
- visitQuantifier(node) {
3090
- this.locals.startScope();
3091
- const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3092
- if (domain === null) {
3093
- return null;
3094
- } else if (!this.visitChildDeclaration(node, 0, domain)) {
3095
- return null;
3096
- } else if (!this.childLogic(node, 2)) {
3097
- return null;
3098
- }
3099
- this.locals.endScope(node.children[2]);
3100
- return LogicT;
3101
- }
3102
- visitNegation(node) {
3103
- if (!this.childLogic(node, 0)) {
3104
- return null;
3105
- }
3106
- return LogicT;
3107
- }
3108
- visitLogicBinary(node) {
3109
- if (!this.childLogic(node, 0) || !this.childLogic(node, 1)) {
3110
- return null;
3111
- }
3112
- return LogicT;
3113
- }
3114
- visitEquals(node) {
3115
- const type1 = this.childTypification(node, 0);
3116
- if (type1 === null) {
3117
- return null;
3118
- }
3119
- const type2 = this.childTypification(node, 1);
3120
- if (type2 === null) {
3121
- return null;
3122
- }
3123
- if (!checkCompatibility(type1, type2)) {
3124
- return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);
3125
- }
3126
- return LogicT;
3127
- }
3128
- visitSetexprPredicate(node) {
3129
- let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3130
- if (type2 === null) {
3131
- return null;
3132
- }
3133
- const isSubset = this.isSubset(node.typeID);
3134
- if (isSubset) {
3135
- type2 = bool(type2);
3136
- }
3137
- const type1 = this.childTypification(node, 0);
3138
- if (type1 === null) {
3139
- return null;
3140
- }
3141
- if (!checkCompatibility(type1, type2)) {
3142
- if (isSubset) {
3143
- return this.onError(RSErrorCode.typesNotEqual, node, [labelType(type1), labelType(type2)]);
3144
- } else {
3145
- return this.onError(RSErrorCode.invalidElementPredicate, node, [
3146
- labelType(type1),
3147
- labelToken(node.typeID),
3148
- labelType(bool(type2))
3149
- ]);
3150
- }
3151
- }
3152
- return LogicT;
3153
- }
3154
- visitDecart(node) {
3155
- const factors = [];
3156
- for (let child = 0; child < node.children.length; child++) {
3157
- const type = this.childTypeDebool(node, child, RSErrorCode.invalidDecart);
3158
- if (type === null) {
3159
- return null;
3160
- } else {
3161
- factors.push(type);
3162
- }
3163
- }
3164
- return bool(tuple(factors));
3165
- }
3166
- visitBoolean(node) {
3167
- const type = this.childTypeDebool(node, 0, RSErrorCode.invalidBoolean);
3168
- if (type === null) {
3169
- return null;
3170
- }
3171
- return bool(bool(type));
3172
- }
3173
- visitTuple(node) {
3174
- const components = [];
3175
- for (let child = 0; child < node.children.length; child++) {
3176
- const type = this.childTypification(node, child);
3177
- if (type === null) {
3178
- return null;
3179
- }
3180
- components.push(type);
3181
- }
3182
- return tuple(components);
3183
- }
3184
- visitEnumeration(node) {
3185
- let type = this.childTypification(node, 0);
3186
- if (type === null) {
3187
- return null;
3188
- }
3189
- for (let child = 1; child < node.children.length; child++) {
3190
- const childType = this.childTypification(node, child);
3191
- if (childType === null) {
3192
- return null;
3193
- }
3194
- const merge = mergeTypifications(type, childType);
3195
- if (merge === null) {
3196
- return this.onError(RSErrorCode.invalidEnumeration, node.children[child], [
3197
- labelType(type),
3198
- labelType(childType)
3199
- ]);
3200
- }
3201
- type = merge;
3202
- }
3203
- return bool(type);
3204
- }
3205
- visitBool(node) {
3206
- return this.visitEnumeration(node);
3207
- }
3208
- visitDebool(node) {
3209
- return this.childTypeDebool(node, 0, RSErrorCode.invalidDebool);
3210
- }
3211
- visitSetexprBinary(node) {
3212
- const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation);
3213
- if (type1 === null) {
3214
- return null;
3215
- }
3216
- const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3217
- if (type2 === null) {
3218
- return null;
3219
- }
3220
- const result = mergeTypifications(type1, type2);
3221
- if (result === null) {
3222
- return this.onError(RSErrorCode.typesNotEqual, node, [labelType(bool(type1)), labelType(bool(type2))]);
3223
- }
3224
- return bool(result);
3225
- }
3226
- visitProjectSet(node) {
3227
- const argument = this.childTypeDebool(node, 0, RSErrorCode.invalidProjectionSet);
3228
- if (argument === null) {
3229
- return null;
3230
- }
3231
- if (argument.typeID === TypeID.anyTypification) {
3232
- return EmptySetT;
3233
- }
3234
- if (argument.typeID !== TypeID.tuple) {
3235
- return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [
3236
- labelRSLangNode(node),
3237
- labelType(bool(argument))
3238
- ]);
3239
- }
3240
- const indices = getNodeIndices(node);
3241
- const components = [];
3242
- for (const index of indices) {
3243
- const newComponent = component(argument, index);
3244
- if (newComponent === null) {
3245
- return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [
3246
- labelRSLangNode(node),
3247
- labelType(bool(argument))
3248
- ]);
3249
- } else {
3250
- components.push(newComponent);
3251
- }
3252
- }
3253
- if (components.length === 1) {
3254
- return bool(components[0]);
3255
- } else {
3256
- return bool(tuple(components));
3257
- }
3258
- }
3259
- visitProjectTuple(node) {
3260
- const argument = this.childTypification(node, 0);
3261
- if (argument === null) {
3262
- return null;
3263
- }
3264
- if (argument.typeID === TypeID.anyTypification) {
3265
- return argument;
3266
- }
3267
- if (argument.typeID !== TypeID.tuple) {
3268
- return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [
3269
- labelRSLangNode(node),
3270
- labelType(argument)
3271
- ]);
3272
- }
3273
- const indices = getNodeIndices(node);
3274
- const components = [];
3275
- for (const index of indices) {
3276
- const newComponent = component(argument, index);
3277
- if (newComponent === null) {
3278
- return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [
3279
- labelRSLangNode(node),
3280
- labelType(argument)
3281
- ]);
3282
- } else {
3283
- components.push(newComponent);
3284
- }
3285
- }
3286
- if (components.length === 1) {
3287
- return components[0];
3288
- } else {
3289
- return tuple(components);
3290
- }
3291
- }
3292
- visitFilter(node) {
3293
- const indices = getNodeIndices(node);
3294
- const tupleParam = indices.length === node.children.length - 1;
3295
- if (!tupleParam && node.children.length > 2) {
3296
- return this.onError(RSErrorCode.invalidFilterArity, node);
3297
- }
3298
- const argument = this.childTypification(node, node.children.length - 1);
3299
- if (argument === null) {
3300
- return null;
3301
- }
3302
- if (argument.typeID === TypeID.anyTypification || argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification) {
3303
- return EmptySetT;
3304
- }
3305
- if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {
3306
- return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [
3307
- labelRSLangNode(node),
3308
- labelType(argument)
3309
- ]);
3310
- }
3311
- const argBase = debool(argument);
3312
- const bases = [];
3313
- for (const index of indices) {
3314
- const newBase = component(argBase, index);
3315
- if (newBase === null) {
3316
- return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [
3317
- labelRSLangNode(node),
3318
- labelType(argument)
3319
- ]);
3320
- }
3321
- bases.push(newBase);
3322
- }
3323
- if (tupleParam) {
3324
- for (let child = 0; child + 1 < node.children.length; child++) {
3325
- const param = this.childTypification(node, child);
3326
- if (param === null) {
3327
- return null;
3328
- }
3329
- if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {
3330
- return this.onError(RSErrorCode.typesNotEqual, node.children[child], [
3331
- labelType(param),
3332
- labelType(bool(bases[child]))
3333
- ]);
3334
- }
3335
- }
3336
- } else {
3337
- const param = this.childTypification(node, 0);
3338
- if (param === null) {
3339
- return null;
3340
- }
3341
- const paramType = param;
3342
- const expected = bool(tuple(bases));
3343
- if (paramType.typeID !== TypeID.collection || !checkCompatibility(expected, paramType)) {
3344
- return this.onError(RSErrorCode.typesNotEqual, node.children[0], [labelType(paramType), labelType(expected)]);
3345
- }
3346
- }
3347
- return argument;
3348
- }
3349
- visitReduce(node) {
3350
- const argument = this.childTypification(node, 0);
3351
- if (argument === null) {
3352
- return null;
3353
- }
3354
- if (argument.typeID === TypeID.anyTypification || argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification) {
3355
- return EmptySetT;
3356
- }
3357
- if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.collection) {
3358
- return this.onError(RSErrorCode.invalidReduce, node.children[0], [labelType(argument)]);
3359
- }
3360
- return debool(argument);
3361
- }
3362
- visitArgumentsEnum(node) {
3363
- return this.visitAllAndReturn(node, LogicT);
3364
- }
3365
- visitDeclarative(node) {
3366
- this.locals.startScope();
3367
- const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3368
- if (domain === null) {
3369
- return null;
3370
- } else if (!this.visitChildDeclaration(node, 0, domain)) {
3371
- return null;
3372
- } else if (!this.childLogic(node, 2)) {
3373
- return null;
3374
- }
3375
- this.locals.endScope(node.children[2]);
3376
- return bool(domain);
3377
- }
3378
- visitImperative(node) {
3379
- this.locals.startScope();
3380
- for (let child = 1; child < node.children.length; child++) {
3381
- if (!this.childLogic(node, child)) {
3382
- return null;
3383
- }
3384
- }
3385
- const type = this.childTypification(node, 0);
3386
- if (type === null) {
3387
- return null;
3388
- }
3389
- this.locals.endScope(node);
3390
- return bool(type);
3391
- }
3392
- visitIterate(node) {
3393
- const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);
3394
- if (domain === null) {
3395
- return null;
3396
- }
3397
- if (!this.visitChildDeclaration(node, 0, domain)) {
3398
- return null;
3399
- }
3400
- return LogicT;
3401
- }
3402
- visitAssign(node) {
3403
- const domain = this.childTypification(node, 1);
3404
- if (domain === null) {
3405
- return null;
3406
- }
3407
- if (!this.visitChildDeclaration(node, 0, domain)) {
3408
- return null;
3409
- }
3410
- return LogicT;
3411
- }
3412
- visitRecursion(node) {
3413
- this.locals.startScope();
3414
- const initType = this.childTypification(node, 1);
3415
- if (initType === null) {
3416
- return null;
3417
- }
3418
- if (!this.visitChildDeclaration(node, 0, initType)) {
3419
- return null;
3420
- }
3421
- const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;
3422
- const iterationIndex = isFull ? 3 : 2;
3423
- let iterationValue = this.childTypification(node, iterationIndex);
3424
- if (iterationValue === null) {
3425
- return null;
3426
- }
3427
- if (!checkCompatibility(iterationValue, initType)) {
3428
- return this.onError(RSErrorCode.typesNotEqual, node.children[iterationIndex], [
3429
- labelType(iterationValue),
3430
- labelType(initType)
3431
- ]);
3432
- }
3433
- if (hasGenerics(initType)) {
3434
- for (let retries = _TypeAuditor.TYPE_DEDUCTION_DEPTH; retries > 0; retries--) {
3435
- this.locals.endScope(node);
3436
- this.locals.clearUnused();
3437
- this.locals.startScope();
3438
- if (!this.visitChildDeclaration(node, 0, iterationValue)) {
3439
- return null;
3440
- }
3441
- const newIteration = this.childTypification(node, iterationIndex);
3442
- if (newIteration === null) {
3443
- return null;
3444
- }
3445
- if (checkEquality(newIteration, iterationValue)) {
3446
- break;
3447
- }
3448
- iterationValue = newIteration;
3449
- }
3450
- }
3451
- if (isFull) {
3452
- if (!this.childLogic(node, 2)) {
3453
- return null;
3454
- }
3455
- }
3456
- this.locals.endScope(node);
3457
- return iterationValue;
3458
- }
3459
- isSubset(token) {
3460
- return token === TokenID.SUBSET || token === TokenID.SUBSET_OR_EQ || token === TokenID.NOT_SUBSET;
3461
- }
3462
- isInsideFuncArgument(node) {
3463
- while (node.parent && node.parent !== node) {
3464
- if (node.typeID === TokenID.NT_ARGUMENTS) return true;
3465
- node = node.parent;
3466
- }
3467
- return false;
3468
- }
3469
- checkFuncArguments(node, alias, type) {
3470
- if (node.children.length - 1 !== type.args.length) {
3471
- return this.onError(RSErrorCode.invalidArgsArity, node.children[1], [
3472
- String(type.args.length),
3473
- String(node.children.length - 1)
3474
- ]);
3475
- }
3476
- const substitutes = /* @__PURE__ */ new Map();
3477
- for (let child = 1; child < node.children.length; child++) {
3478
- const childType = this.childTypification(node, child);
3479
- if (childType === null) {
3480
- return null;
3481
- }
3482
- const argType = mangleRadicals(alias, type.args[child - 1].type);
3483
- if (!compareTemplated(substitutes, argType, childType)) {
3484
- this.onError(RSErrorCode.invalidArgumentType, node.children[child], [
3485
- `${type.args[child - 1].alias}\u2208${labelType(argType)}`,
3486
- labelType(childType)
3487
- ]);
3488
- return null;
3489
- }
3490
- }
3491
- return substitutes;
3492
- }
3493
- };
3494
- function mangleRadicals(funcName, type) {
3495
- switch (type.typeID) {
3496
- default:
3497
- throw new Error(`Unexpected type: ${type.typeID}`);
3498
- case TypeID.integer:
3499
- return type;
3500
- case TypeID.basic: {
3501
- if (isRadical(type.baseID)) {
3502
- return {
3503
- typeID: type.typeID,
3504
- baseID: type.baseID + funcName
3505
- };
3506
- }
3507
- return type;
3508
- }
3509
- case TypeID.collection: {
3510
- return {
3511
- typeID: type.typeID,
3512
- base: mangleRadicals(funcName, debool(type))
3513
- };
3514
- }
3515
- case TypeID.tuple: {
3516
- const factors = [];
3517
- for (let index = 1; index <= type.factors.length; ++index) {
3518
- factors.push(mangleRadicals(funcName, component(type, index)));
3519
- }
3520
- return {
3521
- typeID: type.typeID,
3522
- factors
3523
- };
3524
- }
3525
- }
3526
- }
3527
- var LocalContext2 = class {
3528
- onError;
3529
- data = [];
3530
- constructor(onError) {
3531
- this.onError = onError;
3532
- }
3533
- startScope() {
3534
- for (const local of this.data) {
3535
- if (local.level > 0) {
3536
- local.level = local.level + 1;
3537
- }
3538
- }
3539
- }
3540
- endScope(node, skipUnused = false) {
3541
- for (const local of this.data) {
3542
- local.level--;
3543
- if (!skipUnused && local.level === 0 && local.useCount === 0) {
3544
- this.onError(RSErrorCode.localNotUsed, node, [local.alias]);
3545
- }
3546
- }
3547
- }
3548
- clearUnused() {
3549
- this.data = this.data.filter((data) => data.level > 0);
3550
- }
3551
- pushLocal(node, type) {
3552
- const alias = getNodeText(node);
3553
- const existing = this.data.find((data) => data.alias === alias);
3554
- if (existing) {
3555
- if (existing.level > 0) {
3556
- this.onError(RSErrorCode.localShadowing, node, [alias]);
3557
- return false;
3558
- } else {
3559
- this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);
3560
- const index = this.data.indexOf(existing);
3561
- if (index !== -1) {
3562
- this.data.splice(index, 1);
3563
- }
3564
- }
3565
- }
3566
- this.data.push({ alias, type, level: 1, useCount: 0 });
3567
- return true;
3568
- }
3569
- getLocalType(node) {
3570
- const alias = getNodeText(node);
3571
- const local = this.data.find((data) => data.alias === alias);
3572
- if (local === void 0) {
3573
- this.onError(RSErrorCode.localUndeclared, node, [alias]);
3574
- return null;
3575
- } else if (local.level < 1) {
3576
- this.onError(RSErrorCode.localOutOfScope, node, [alias]);
3577
- return null;
3578
- } else {
3579
- local.useCount++;
3580
- return local.type;
3581
- }
3582
- }
3583
- };
3584
-
3585
- // src/rslang/semantic/value-class.ts
3586
- var ValueClass = {
3587
- VALUE: "value",
3588
- PROPERTY: "property"
3589
- };
3590
-
3591
- // src/rslang/semantic/value-auditor.ts
3592
- var ValueAuditor = class {
3593
- context;
3594
- annotateErrors;
3595
- reporter;
3596
- constructor(context) {
3597
- this.context = context;
3598
- this.annotateErrors = false;
3599
- }
3600
- /**
3601
- * Runs value audit on the AST. Returns the value class on success, null on failure.
3602
- */
3603
- run(ast, reporter, annotateErrors = false) {
3604
- if (ast.hasError) {
3605
- return null;
3606
- }
3607
- this.reporter = reporter;
3608
- this.annotateErrors = annotateErrors;
3609
- return this.dispatchVisit(ast);
3610
- }
3611
- dispatchVisit(node) {
3612
- switch (node.typeID) {
3613
- case TokenID.ID_GLOBAL:
3614
- case TokenID.ID_FUNCTION:
3615
- case TokenID.ID_PREDICATE:
3616
- return this.visitGlobal(node);
3617
- case TokenID.ID_LOCAL:
3618
- case TokenID.ID_RADICAL:
3619
- case TokenID.LIT_INTEGER:
3620
- case TokenID.LIT_EMPTYSET:
3621
- return ValueClass.VALUE;
3622
- case TokenID.LIT_WHOLE_NUMBERS:
3623
- return ValueClass.PROPERTY;
3624
- case TokenID.NT_TUPLE_DECL:
3625
- case TokenID.NT_ENUM_DECL:
3626
- return this.visitAllAndReturn(node, ValueClass.VALUE);
3627
- case TokenID.NT_ARGUMENTS:
3628
- case TokenID.NT_ARG_DECL:
3629
- return this.visitAllAndReturn(node, ValueClass.VALUE);
3630
- case TokenID.PLUS:
3631
- case TokenID.MINUS:
3632
- case TokenID.MULTIPLY:
3633
- return this.visitAllAndReturn(node, ValueClass.VALUE);
3634
- case TokenID.QUANTOR_UNIVERSAL:
3635
- case TokenID.QUANTOR_EXISTS:
3636
- return this.visitQuantifier(node);
3637
- case TokenID.LOGIC_NOT:
3638
- case TokenID.LOGIC_AND:
3639
- case TokenID.LOGIC_OR:
3640
- case TokenID.LOGIC_IMPLICATION:
3641
- case TokenID.LOGIC_EQUIVALENT:
3642
- return this.visitAllAndReturn(node, ValueClass.VALUE);
3643
- case TokenID.EQUAL:
3644
- case TokenID.NOTEQUAL:
3645
- return this.assertAllValues(node);
3646
- case TokenID.GREATER:
3647
- case TokenID.LESSER:
3648
- case TokenID.GREATER_OR_EQ:
3649
- case TokenID.LESSER_OR_EQ:
3650
- return this.visitAllAndReturn(node, ValueClass.VALUE);
3651
- case TokenID.SET_IN:
3652
- case TokenID.SET_NOT_IN:
3653
- case TokenID.SUBSET:
3654
- case TokenID.SUBSET_OR_EQ:
3655
- case TokenID.NOT_SUBSET:
3656
- return this.visitSetexprPredicate(node);
3657
- case TokenID.DECART:
3658
- return this.visitDecart(node);
3659
- case TokenID.BOOLEAN:
3660
- return this.visitBoolean(node);
3661
- case TokenID.NT_TUPLE:
3662
- case TokenID.NT_ENUMERATION:
3663
- return this.assertAllValues(node);
3664
- case TokenID.FILTER:
3665
- return this.visitFilter(node);
3666
- case TokenID.CARD:
3667
- case TokenID.BOOL:
3668
- case TokenID.DEBOOL:
3669
- case TokenID.BIGPR:
3670
- case TokenID.SMALLPR:
3671
- case TokenID.REDUCE:
3672
- return this.assertChildIsValue(node, 0);
3673
- case TokenID.SET_UNION:
3674
- case TokenID.SET_INTERSECTION:
3675
- case TokenID.SET_MINUS:
3676
- case TokenID.SET_SYMMETRIC_MINUS:
3677
- return this.visitSetexprBinary(node);
3678
- case TokenID.NT_FUNC_DEFINITION:
3679
- return this.visitFunctionDefinition(node);
3680
- case TokenID.NT_FUNC_CALL:
3681
- return this.visitFunctionCall(node);
3682
- case TokenID.NT_DECLARATIVE_EXPR:
3683
- return this.visitDeclarative(node);
3684
- case TokenID.NT_IMPERATIVE_EXPR:
3685
- return this.visitImperative(node);
3686
- case TokenID.NT_RECURSIVE_FULL:
3687
- case TokenID.NT_RECURSIVE_SHORT:
3688
- return this.assertAllValues(node);
3689
- case TokenID.ITERATE:
3690
- case TokenID.ASSIGN:
3691
- return this.visitIterateOrAssign(node);
3692
- }
3693
- return null;
3694
- }
3695
- onError(code, node, params) {
3696
- this.reporter?.({ code, from: node.from, to: node.to, params });
3697
- if (this.annotateErrors) {
3698
- annotateError(node, code, params);
3699
- }
3700
- return null;
3701
- }
3702
- visitChild(node, index) {
3703
- return this.dispatchVisit(node.children[index]);
3704
- }
3705
- visitAllAndReturn(node, value) {
3706
- for (const child of node.children) {
3707
- if (this.dispatchVisit(child) === null) {
3708
- return null;
3709
- }
3710
- }
3711
- return value;
3712
- }
3713
- assertChildIsValue(node, index) {
3714
- const result = this.visitChild(node, index);
3715
- if (result === null) {
3716
- return null;
3717
- }
3718
- if (result !== ValueClass.VALUE) {
3719
- const child = node.children[index];
3720
- return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);
3721
- }
3722
- return ValueClass.VALUE;
3723
- }
3724
- assertAllValues(node) {
3725
- for (let i = 0; i < node.children.length; i++) {
3726
- if (this.assertChildIsValue(node, i) === null) {
3727
- return null;
3728
- }
3729
- }
3730
- return ValueClass.VALUE;
3731
- }
3732
- visitFunctionDefinition(node) {
3733
- if (this.visitChild(node, 0) === null) {
3734
- return null;
3735
- }
3736
- return this.visitChild(node, 1);
3737
- }
3738
- visitFunctionCall(node) {
3739
- const result = this.visitChild(node, 0);
3740
- if (result === null) {
3741
- return null;
3742
- }
3743
- for (let child = 1; child < node.children.length; child++) {
3744
- if (this.assertChildIsValue(node, child) === null) {
3745
- return null;
3746
- }
3747
- }
3748
- return result;
3749
- }
3750
- visitGlobal(node) {
3751
- const alias = getNodeText(node);
3752
- const result = this.context.get(alias);
3753
- if (!result) {
3754
- return this.onError(RSErrorCode.globalNoValue, node, [alias]);
3755
- }
3756
- return result;
3757
- }
3758
- visitQuantifier(node) {
3759
- if (this.assertChildIsValue(node, 1) === null) {
3760
- return null;
3761
- }
3762
- if (this.visitChild(node, 2) === null) {
3763
- return null;
3764
- }
3765
- return ValueClass.VALUE;
3766
- }
3767
- visitSetexprPredicate(node) {
3768
- const tokenId = node.typeID;
3769
- switch (tokenId) {
3770
- case TokenID.SET_IN:
3771
- case TokenID.SET_NOT_IN:
3772
- case TokenID.SUBSET_OR_EQ:
3773
- if (this.assertChildIsValue(node, 0) === null) {
3774
- return null;
3775
- }
3776
- if (this.visitChild(node, 1) === null) {
3777
- return null;
3778
- }
3779
- return ValueClass.VALUE;
3780
- case TokenID.SUBSET:
3781
- case TokenID.NOT_SUBSET:
3782
- return this.assertAllValues(node);
3783
- }
3784
- return null;
3785
- }
3786
- visitDeclarative(node) {
3787
- if (this.visitChild(node, 2) === null) {
3788
- return null;
3789
- }
3790
- return this.visitChild(node, 1);
3791
- }
3792
- visitImperative(node) {
3793
- for (let child = 1; child < node.children.length; child++) {
3794
- if (this.visitChild(node, child) === null) {
3795
- return null;
3796
- }
3797
- }
3798
- return this.assertChildIsValue(node, 0);
3799
- }
3800
- visitIterateOrAssign(node) {
3801
- if (this.visitChild(node, 0) === null) {
3802
- return null;
3803
- }
3804
- return this.assertChildIsValue(node, 1);
3805
- }
3806
- visitDecart(node) {
3807
- let result = ValueClass.VALUE;
3808
- for (let child = 0; child < node.children.length; child++) {
3809
- const childClass = this.visitChild(node, child);
3810
- if (childClass === null) {
3811
- return null;
3812
- }
3813
- if (childClass === ValueClass.PROPERTY) {
3814
- result = ValueClass.PROPERTY;
3815
- }
3816
- }
3817
- return result;
3818
- }
3819
- visitBoolean(node) {
3820
- if (this.visitChild(node, 0) === null) {
3821
- return null;
3822
- }
3823
- return ValueClass.PROPERTY;
3824
- }
3825
- visitFilter(node) {
3826
- let last = null;
3827
- for (const child of node.children) {
3828
- last = this.dispatchVisit(child);
3829
- if (last === null) {
3830
- return null;
3831
- }
3832
- }
3833
- return last;
3834
- }
3835
- visitSetexprBinary(node) {
3836
- const first = this.visitChild(node, 0);
3837
- if (first === null) {
3838
- return null;
3839
- }
3840
- const second = this.visitChild(node, 1);
3841
- if (second === null) {
3842
- return null;
3843
- }
3844
- const isValue = combineOperationValues(
3845
- node.typeID,
3846
- first === ValueClass.VALUE,
3847
- second === ValueClass.VALUE
3848
- );
3849
- return isValue ? ValueClass.VALUE : ValueClass.PROPERTY;
3850
- }
3851
- };
3852
- function combineOperationValues(op, v1, v2) {
3853
- switch (op) {
3854
- case TokenID.SET_SYMMETRIC_MINUS:
3855
- case TokenID.SET_UNION:
3856
- return v1 && v2;
3857
- case TokenID.SET_INTERSECTION:
3858
- return v1 || v2;
3859
- case TokenID.SET_MINUS:
3860
- return v1;
3861
- default:
3862
- return v1 && v2;
3863
- }
3864
- }
3865
-
3866
- // src/rslang/semantic/analyzer.ts
3867
- var RSLangAnalyzer = class {
3868
- typeContext = /* @__PURE__ */ new Map();
3869
- valueContext = /* @__PURE__ */ new Map();
3870
- typeAuditor = new TypeAuditor(this.typeContext);
3871
- valueAuditor = new ValueAuditor(this.valueContext);
3872
- addBase(alias, isNumeric = false, valueClass = ValueClass.VALUE) {
3873
- if (isNumeric) {
3874
- this.typeContext.set(alias, bool(constant(alias)));
3875
- this.valueContext.set(alias, valueClass);
3876
- } else {
3877
- this.typeContext.set(alias, bool(basic(alias)));
3878
- this.valueContext.set(alias, valueClass);
3879
- }
3880
- }
3881
- setGlobal(alias, type, value) {
3882
- if (type) {
3883
- this.typeContext.set(alias, type);
3884
- }
3885
- if (value) {
3886
- this.valueContext.set(alias, value);
3887
- }
3888
- }
3889
- getType(alias) {
3890
- return this.typeContext.get(alias) ?? null;
3891
- }
3892
- checkFast(expression, options) {
3893
- if (expression.length === 0) {
3894
- return { success: false, type: null, valueClass: null, ast: null };
3895
- }
3896
- const ast = this.parse(expression);
3897
- if (ast.hasError) {
3898
- return { success: false, type: null, valueClass: null, ast };
3899
- }
3900
- const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false);
3901
- if (type === null) {
3902
- return { success: false, type: null, valueClass: null, ast };
3903
- }
3904
- if (options?.isDomain) {
3905
- if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {
3906
- return { success: false, type: null, valueClass: null, ast };
3907
- }
3908
- return { success: true, type: debool(type), valueClass: ValueClass.VALUE, ast };
3909
- }
3910
- if (options?.expected && getTypeClass(type.typeID) !== options.expected) {
3911
- return { success: false, type: null, valueClass: null, ast };
3912
- }
3913
- return {
3914
- success: true,
3915
- type,
3916
- valueClass: options?.isDomain ? ValueClass.VALUE : this.valueAuditor.run(ast),
3917
- ast
3918
- };
3919
- }
3920
- checkFull(expression, options) {
3921
- const errors = [];
3922
- const reporter = (error) => {
3923
- errors.push(error);
3924
- };
3925
- if (expression.length === 0) {
3926
- reporter({ code: RSErrorCode.cstEmptyDerived, from: 0, to: 0 });
3927
- return { success: false, type: null, valueClass: null, errors, ast: null };
3928
- }
3929
- const ast = this.parse(expression);
3930
- if (ast.hasError) {
3931
- extractSyntaxErrors(ast, expression, reporter, options?.annotateErrors ?? false);
3932
- return { success: false, type: null, valueClass: null, errors, ast };
3933
- }
3934
- const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false, reporter, options?.annotateErrors ?? false);
3935
- if (type === null) {
3936
- return { success: false, type: null, valueClass: null, errors, ast };
3937
- }
3938
- if (options?.isDomain) {
3939
- if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {
3940
- reporter({ code: RSErrorCode.globalStructure, from: ast.from, to: ast.to });
3941
- if (options?.annotateErrors) {
3942
- annotateError(ast, RSErrorCode.globalStructure);
3943
- }
3944
- return { success: false, type: null, valueClass: null, errors, ast };
3945
- }
3946
- return { success: true, type: debool(type), valueClass: ValueClass.VALUE, errors, ast };
3947
- }
3948
- if (options?.expected && getTypeClass(type.typeID) !== options.expected) {
3949
- reporter({
3950
- code: RSErrorCode.expectedType,
3951
- from: ast.from,
3952
- to: ast.to
3953
- });
3954
- if (options?.annotateErrors) {
3955
- annotateError(ast, RSErrorCode.expectedType);
3956
- }
3957
- return { success: false, type: null, valueClass: null, errors, ast };
3958
- }
3959
- const valueClass = options?.isDomain ? ValueClass.VALUE : this.valueAuditor.run(ast, reporter, options?.annotateErrors ?? false);
3960
- return { success: true, type, valueClass, errors, ast };
3961
- }
3962
- parse(expression) {
3963
- const tree = parser.parse(expression);
3964
- const ast = buildTree(tree.cursor());
3965
- normalizeAST(ast, expression);
3966
- return ast;
3967
- }
3968
- };
3969
- function isStructureDomain(node) {
3970
- switch (node.typeID) {
3971
- case TokenID.LIT_WHOLE_NUMBERS:
3972
- case TokenID.ID_GLOBAL:
3973
- case TokenID.BOOLEAN:
3974
- case TokenID.DECART:
3975
- case TokenID.NT_ENUMERATION:
3976
- break;
3977
- default:
3978
- return false;
3979
- }
3980
- for (const child of node.children) {
3981
- if (!isStructureDomain(child)) {
3982
- return false;
3983
- }
3984
- }
3985
- return true;
3986
- }
3987
-
3988
- // src/rslang/semantic/typification-parser.ts
3989
- function parseTypeText(input) {
3990
- const normalized = input.trim().replaceAll("->", "\u2192");
3991
- if (normalized.length === 0) {
3992
- return { type: null, error: null };
3993
- }
3994
- const parser2 = new TypificationParser(normalized);
3995
- return parser2.parse();
3996
- }
3997
- function applyAsciiTypeSubstitutions(raw) {
3998
- return raw.replaceAll("->", "\u2192").replaceAll("*", "\xD7").replaceAll("B", "\u212C");
3999
- }
4000
- var TypificationParser = class {
4001
- index = 0;
4002
- input;
4003
- constructor(input) {
4004
- this.index = 0;
4005
- this.input = input;
4006
- }
4007
- parse() {
4008
- try {
4009
- const result = this.parseExpressionType();
4010
- this.skipSpaces();
4011
- if (!this.eof()) {
4012
- throw new Error("Unexpected trailing symbols");
4013
- }
4014
- return { type: result, error: null };
4015
- } catch (error) {
4016
- const message = error instanceof Error ? error.message : String(error);
4017
- return { type: null, error: message };
4018
- }
4019
- }
4020
- parseExpressionType() {
4021
- this.skipSpaces();
4022
- if (this.peek() === "[") {
4023
- return this.parseCallableType();
4024
- } else {
4025
- return this.parseTypification();
4026
- }
4027
- }
4028
- parseCallableType() {
4029
- this.expect("[");
4030
- const args = [];
4031
- this.skipSpaces();
4032
- if (this.peek() !== "]") {
4033
- while (true) {
4034
- args.push(this.parseTypification());
4035
- this.skipSpaces();
4036
- if (this.peek() === ",") {
4037
- this.next();
4038
- this.skipSpaces();
4039
- if (this.peek() === "]") {
4040
- throw new Error("Empty argument in callable typification");
4041
- }
4042
- continue;
4043
- }
4044
- break;
4045
- }
4046
- }
4047
- this.expect("]");
4048
- this.skipSpaces();
4049
- this.expect("\u2192");
4050
- const result = this.parseCallableResult();
4051
- if (result.typeID === TypeID.logic) {
4052
- return {
4053
- typeID: TypeID.predicate,
4054
- result: LogicT,
4055
- args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))
4056
- };
4057
- }
4058
- if (!isTypification(result)) {
4059
- throw new Error("Invalid callable result type");
4060
- }
4061
- return {
4062
- typeID: TypeID.function,
4063
- result,
4064
- args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))
4065
- };
4066
- }
4067
- parseCallableResult() {
4068
- this.skipSpaces();
4069
- const lookahead = this.readToken();
4070
- this.index -= lookahead.length;
4071
- if (lookahead === "Logic") {
4072
- this.index += lookahead.length;
4073
- return LogicT;
4074
- }
4075
- return this.parseTypification();
4076
- }
4077
- parseTypification() {
4078
- this.skipSpaces();
4079
- if (this.match("\u212C")) {
4080
- this.skipSpaces();
4081
- if (this.peek() === "(") {
4082
- this.next();
4083
- const base = this.parseTypification();
4084
- this.expect(")");
4085
- return bool(base);
4086
- }
4087
- this.skipSpaces();
4088
- if (this.input.startsWith("\u212C", this.index)) {
4089
- const base = this.parseTypification();
4090
- return bool(base);
4091
- }
4092
- throw new Error('Expected "(" after "\u212C"');
4093
- }
4094
- const first = this.parseTypificationAtom();
4095
- const factors = [first];
4096
- while (true) {
4097
- this.skipSpaces();
4098
- if (!this.match("\xD7")) {
4099
- break;
4100
- }
4101
- factors.push(this.parseTypificationAtom());
4102
- }
4103
- if (factors.length === 1) {
4104
- return first;
4105
- }
4106
- return tuple(factors);
4107
- }
4108
- parseTypificationAtom() {
4109
- this.skipSpaces();
4110
- if (this.input.startsWith("\u212C", this.index)) {
4111
- return this.parseTypification();
4112
- }
4113
- if (this.peek() === "(") {
4114
- this.next();
4115
- const wrapped = this.parseTypification();
4116
- this.expect(")");
4117
- return wrapped;
4118
- }
4119
- const token = this.readToken();
4120
- if (token === "Z") {
4121
- return IntegerT;
4122
- }
4123
- if (token === "R0") {
4124
- return { typeID: TypeID.anyTypification };
4125
- }
4126
- if (!/^[A-Z]\d+$/.test(token)) {
4127
- throw new Error(`Unknown typification token "${token}"`);
4128
- }
4129
- return { typeID: TypeID.basic, baseID: token };
4130
- }
4131
- readToken() {
4132
- this.skipSpaces();
4133
- const start = this.index;
4134
- while (!this.eof()) {
4135
- const char = this.peek();
4136
- if (!char || /[\s,()[\]→×]/.test(char)) {
4137
- break;
4138
- }
4139
- this.next();
4140
- }
4141
- if (start === this.index) {
4142
- throw new Error("Expected typification token");
4143
- }
4144
- return this.input.slice(start, this.index);
4145
- }
4146
- skipSpaces() {
4147
- while (!this.eof() && /\s/.test(this.peek())) {
4148
- this.index += 1;
4149
- }
4150
- }
4151
- expect(symbol) {
4152
- this.skipSpaces();
4153
- if (!this.match(symbol)) {
4154
- throw new Error(`Expected "${symbol}"`);
4155
- }
4156
- }
4157
- match(symbol) {
4158
- if (this.input.startsWith(symbol, this.index)) {
4159
- this.index += symbol.length;
4160
- return true;
4161
- }
4162
- return false;
4163
- }
4164
- peek() {
4165
- return this.input[this.index];
4166
- }
4167
- next() {
4168
- const value = this.input[this.index];
4169
- this.index += 1;
4170
- return value;
4171
- }
4172
- eof() {
4173
- return this.index >= this.input.length;
4174
- }
4175
- };
4176
-
4177
- // src/rslang/typification-graph.ts
4178
- var TypificationGraph = class {
4179
- /** List of nodes. */
4180
- nodes = [];
4181
- /** Map of nodes by ID. */
4182
- nodeById = /* @__PURE__ */ new Map();
4183
- /** Map of nodes by alias. */
4184
- nodeByAlias = /* @__PURE__ */ new Map();
4185
- /** Adds an element to the graph. */
4186
- addElement(alias, type) {
4187
- const node = this.processType(type);
4188
- if (!node) {
4189
- return;
4190
- }
4191
- this.addAliasAnnotation(node.id, alias);
4192
- }
4193
- processType(type) {
4194
- switch (type.typeID) {
4195
- case TypeID.logic:
4196
- return null;
4197
- case TypeID.anyTypification:
4198
- case TypeID.integer:
4199
- case TypeID.basic:
4200
- return this.addBaseNode(type);
4201
- case TypeID.collection:
4202
- return this.addBooleanNode(type);
4203
- case TypeID.tuple:
4204
- return this.addCartesianNode(type);
4205
- case TypeID.function:
4206
- case TypeID.predicate:
4207
- const combined = convertFunctionToTypification(type);
4208
- if (!combined) {
4209
- return null;
4210
- }
4211
- return this.processType(combined);
4212
- }
4213
- }
4214
- addBaseNode(type) {
4215
- const text = labelType(type);
4216
- const existingNode = this.nodes.find((node2) => node2.text === text);
4217
- if (existingNode) {
4218
- return existingNode;
4219
- }
4220
- const node = {
4221
- id: this.nodes.length,
4222
- text,
4223
- rank: 0,
4224
- parents: [],
4225
- annotations: []
4226
- };
4227
- this.nodes.push(node);
4228
- this.nodeById.set(node.id, node);
4229
- return node;
4230
- }
4231
- addBooleanNode(type) {
4232
- const baseNode = this.processType(type.base);
4233
- if (!baseNode) {
4234
- return null;
4235
- }
4236
- const existingNode = this.nodes.find((node2) => node2.parents.length === 1 && node2.parents[0] === baseNode.id);
4237
- if (existingNode) {
4238
- return existingNode;
4239
- }
4240
- const node = {
4241
- id: this.nodes.length,
4242
- rank: baseNode.rank + 1,
4243
- text: labelType(type),
4244
- parents: [baseNode.id],
4245
- annotations: []
4246
- };
4247
- this.nodes.push(node);
4248
- this.nodeById.set(node.id, node);
4249
- return node;
4250
- }
4251
- addCartesianNode(type) {
4252
- const factors = type.factors.map((factor) => this.processType(factor)).filter((factor) => factor !== null);
4253
- if (factors.length !== type.factors.length) {
4254
- return null;
4255
- }
4256
- const existingNode = this.nodes.find(
4257
- (node2) => node2.parents.length === factors.length && node2.parents.every((p, i) => p === factors[i].id)
4258
- );
4259
- if (existingNode) {
4260
- return existingNode;
4261
- }
4262
- const node = {
4263
- id: this.nodes.length,
4264
- text: labelType(type),
4265
- rank: Math.max(...factors.map((factor) => factor.rank)) + 1,
4266
- parents: factors.map((factor) => factor.id),
4267
- annotations: []
4268
- };
4269
- this.nodes.push(node);
4270
- this.nodeById.set(node.id, node);
4271
- return node;
4272
- }
4273
- addAliasAnnotation(node, alias) {
4274
- const nodeToAnnotate = this.nodeById.get(node);
4275
- if (!nodeToAnnotate) {
4276
- throw new Error(`Node ${node} not found`);
4277
- }
4278
- nodeToAnnotate.annotations.push(alias);
4279
- this.nodeByAlias.set(alias, nodeToAnnotate);
4280
- }
4281
- };
4282
- function convertFunctionToTypification(type) {
4283
- if (!("args" in type) || type.args.length === 0) {
4284
- return null;
4285
- }
4286
- const args = type.args.length === 1 ? type.args[0].type : tuple(type.args.map((arg) => arg.type));
4287
- if (type.result.typeID === TypeID.logic) {
4288
- return bool(args);
4289
- } else {
4290
- return bool(tuple([type.result, args]));
4291
- }
4292
- }
4293
- export {
4294
- AnyTypificationT,
4295
- EmptySetT,
4296
- LogicT,
4297
- RSCalculator,
4298
- RSErrorCode,
4299
- RSLangAnalyzer,
4300
- TokenID,
4301
- TypeClass,
4302
- TypeID,
4303
- TypificationGraph,
4304
- ValueClass,
4305
- applyAsciiTypeSubstitutions,
4306
- makeTypePath,
4307
- makeValuePath,
4308
- parseTypeText,
4309
- printValue,
4310
- readErrorAnnotation,
4311
- readTypeAnnotation,
4312
- parser as rslangParser
4313
- };
4314
- //# sourceMappingURL=index.js.map
1
+ import { readErrorAnnotation, readTypeAnnotation } from "./ast-annotations.js";
2
+ import { RSErrorCode } from "./error.js";
3
+ import { TokenID } from "./parser/token.js";
4
+ import { AnyTypificationT, EmptySetT, LogicT, TypeClass, TypeID, makeTypePath } from "./semantic/typification.js";
5
+ import { S as printValue, l as makeValuePath } from "../value-B8UtCqaK.js";
6
+ import { RSCalculator } from "./eval/calculator.js";
7
+ import { parser } from "./parser/parser.js";
8
+ import { ValueClass } from "./semantic/value-class.js";
9
+ import { RSLangAnalyzer } from "./semantic/analyzer.js";
10
+ import { applyAsciiTypeSubstitutions, parseTypeText } from "./semantic/typification-parser.js";
11
+ import { TypificationGraph } from "./typification-graph.js";
12
+ export { AnyTypificationT, EmptySetT, LogicT, RSCalculator, RSErrorCode, RSLangAnalyzer, TokenID, TypeClass, TypeID, TypificationGraph, ValueClass, applyAsciiTypeSubstitutions, makeTypePath, makeValuePath, parseTypeText, printValue, readErrorAnnotation, readTypeAnnotation, parser as rslangParser };