@rsconcept/domain 1.0.0 → 1.2.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 (185) 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 +258 -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/oss-api.test.ts +76 -0
  172. package/src/library/oss-api.ts +4 -1
  173. package/src/library/rsform-api.test.ts +24 -0
  174. package/src/library/rsform-api.ts +12 -4
  175. package/dist/cctext/index.js.map +0 -1
  176. package/dist/graph/index.js.map +0 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/library/index.js.map +0 -1
  179. package/dist/library/oss-layout.js.map +0 -1
  180. package/dist/parsing/index.js.map +0 -1
  181. package/dist/rslang/eval/value-api.js.map +0 -1
  182. package/dist/rslang/eval/value.js.map +0 -1
  183. package/dist/rslang/index.js.map +0 -1
  184. package/dist/shared/branded.js.map +0 -1
  185. package/dist/shared/index.js.map +0 -1
@@ -1,366 +1,207 @@
1
- // src/parsing/ast.ts
2
- var TOKEN_ERROR = 0;
3
- function getNodeText(node) {
4
- if (node.data.dataType === "string" && typeof node.data.value === "string") {
5
- return node.data.value;
6
- }
7
- return `NO DATA NODE: ${node.typeID}`;
8
- }
9
-
10
- // src/rslang/ast-annotations.ts
11
- var AST_TYPE_KEY = "rsType";
12
- function readTypeAnnotation(node) {
13
- if (node.annotation && AST_TYPE_KEY in node.annotation) {
14
- return node.annotation[AST_TYPE_KEY];
15
- }
16
- return null;
17
- }
18
-
19
- // src/rslang/parser/token.ts
20
- var TokenID = {
21
- // Global, local IDs and literals
22
- ERROR: TOKEN_ERROR,
23
- ID_LOCAL: 258,
24
- ID_GLOBAL: 259,
25
- ID_FUNCTION: 260,
26
- ID_PREDICATE: 261,
27
- ID_RADICAL: 262,
28
- LIT_INTEGER: 263,
29
- LIT_WHOLE_NUMBERS: 264,
30
- LIT_EMPTYSET: 265,
31
- // Arithmetic
32
- PLUS: 266,
33
- MINUS: 267,
34
- MULTIPLY: 268,
35
- // Integer predicate symbols
36
- GREATER: 269,
37
- LESSER: 270,
38
- GREATER_OR_EQ: 271,
39
- LESSER_OR_EQ: 272,
40
- // Equality comparison
41
- EQUAL: 273,
42
- NOTEQUAL: 274,
43
- // Logic predicate symbols
44
- QUANTOR_UNIVERSAL: 275,
45
- QUANTOR_EXISTS: 276,
46
- LOGIC_NOT: 277,
47
- LOGIC_EQUIVALENT: 278,
48
- LOGIC_IMPLICATION: 279,
49
- LOGIC_OR: 280,
50
- LOGIC_AND: 281,
51
- // Set theory predicate symbols
52
- SET_IN: 282,
53
- SET_NOT_IN: 283,
54
- SUBSET: 284,
55
- SUBSET_OR_EQ: 285,
56
- NOT_SUBSET: 286,
57
- // Set theory operators
58
- DECART: 287,
59
- SET_UNION: 288,
60
- SET_INTERSECTION: 289,
61
- SET_MINUS: 290,
62
- SET_SYMMETRIC_MINUS: 291,
63
- BOOLEAN: 292,
64
- // Structure operations
65
- BIGPR: 293,
66
- SMALLPR: 294,
67
- FILTER: 295,
68
- CARD: 296,
69
- BOOL: 297,
70
- DEBOOL: 298,
71
- REDUCE: 299,
72
- // Term constructions prefixes
73
- DECLARATIVE: 300,
74
- RECURSIVE: 301,
75
- IMPERATIVE: 302,
76
- ITERATE: 303,
77
- ASSIGN: 304,
78
- // Punctuation
79
- PUNCTUATION_DEFINE: 305,
80
- PUNCTUATION_STRUCT: 306,
81
- PUNCTUATION_PL: 307,
82
- PUNCTUATION_PR: 308,
83
- PUNCTUATION_CL: 309,
84
- PUNCTUATION_CR: 310,
85
- PUNCTUATION_SL: 311,
86
- PUNCTUATION_SR: 312,
87
- PUNCTUATION_BAR: 313,
88
- PUNCTUATION_COMMA: 314,
89
- PUNCTUATION_SEMICOLON: 315,
90
- // ======= Non-terminal tokens =========
91
- NT_ENUM_DECL: 316,
92
- NT_TUPLE: 317,
93
- NT_ENUMERATION: 318,
94
- NT_TUPLE_DECL: 319,
95
- NT_ARG_DECL: 320,
96
- NT_FUNC_DEFINITION: 321,
97
- NT_ARGUMENTS: 322,
98
- NT_FUNC_CALL: 323,
99
- NT_DECLARATIVE_EXPR: 324,
100
- NT_IMPERATIVE_EXPR: 325,
101
- NT_RECURSIVE_FULL: 326,
102
- NT_RECURSIVE_SHORT: 327,
103
- // ======= Helper tokens ========
104
- INTERRUPT: 328,
105
- END: 329
106
- };
107
-
108
- // src/rslang/semantic/arguments-extractor.ts
1
+ import { readTypeAnnotation } from "../ast-annotations.js";
2
+ import { getNodeText } from "../../parsing/ast.js";
3
+ import "../../parsing/index.js";
4
+ import { TokenID } from "../parser/token.js";
5
+ //#region src/rslang/semantic/arguments-extractor.ts
6
+ /**
7
+ * Module: Type auditor for AST type checking.
8
+ */
9
+ /** Type auditor for AST type checking.
10
+ * Warning! Assumes that the AST is well-formed and annotated with types.
11
+ */
109
12
  var ArgumentsExtractor = class {
110
- locals = new LocalContext();
111
- result = [];
112
- run(ast) {
113
- if (ast.hasError) {
114
- return [];
115
- }
116
- this.result = [];
117
- this.locals.clear();
118
- this.dispatchVisit(ast);
119
- return this.result;
120
- }
121
- dispatchDeclare(node) {
122
- return this.processDeclare(node);
123
- }
124
- processDeclare(node) {
125
- switch (node.typeID) {
126
- case TokenID.ID_LOCAL:
127
- return this.declareLocal(node);
128
- case TokenID.NT_TUPLE_DECL:
129
- return this.declareTuple(node);
130
- case TokenID.NT_ENUM_DECL:
131
- return this.declareEnumeration(node);
132
- }
133
- return false;
134
- }
135
- declareLocal(node) {
136
- this.locals.pushLocal(node);
137
- return true;
138
- }
139
- declareTuple(node) {
140
- for (let child = 0; child < node.children.length; child++) {
141
- if (!this.visitChildDeclaration(node, child)) {
142
- return false;
143
- }
144
- }
145
- return true;
146
- }
147
- declareEnumeration(node) {
148
- for (const child of node.children) {
149
- if (!this.dispatchDeclare(child)) {
150
- return false;
151
- }
152
- }
153
- return true;
154
- }
155
- dispatchVisit(node) {
156
- return this.processVisit(node);
157
- }
158
- processVisit(node) {
159
- switch (node.typeID) {
160
- case TokenID.ID_GLOBAL:
161
- case TokenID.ID_FUNCTION:
162
- case TokenID.ID_PREDICATE:
163
- case TokenID.ID_RADICAL:
164
- case TokenID.LIT_INTEGER:
165
- case TokenID.LIT_WHOLE_NUMBERS:
166
- case TokenID.LIT_EMPTYSET:
167
- return true;
168
- case TokenID.CARD:
169
- case TokenID.FILTER:
170
- case TokenID.PLUS:
171
- case TokenID.MINUS:
172
- case TokenID.MULTIPLY:
173
- case TokenID.LOGIC_AND:
174
- case TokenID.LOGIC_OR:
175
- case TokenID.LOGIC_IMPLICATION:
176
- case TokenID.LOGIC_EQUIVALENT:
177
- case TokenID.EQUAL:
178
- case TokenID.NOTEQUAL:
179
- case TokenID.GREATER:
180
- case TokenID.LESSER:
181
- case TokenID.GREATER_OR_EQ:
182
- case TokenID.LESSER_OR_EQ:
183
- case TokenID.SET_IN:
184
- case TokenID.SET_NOT_IN:
185
- case TokenID.SUBSET:
186
- case TokenID.SUBSET_OR_EQ:
187
- case TokenID.NOT_SUBSET:
188
- case TokenID.DECART:
189
- case TokenID.BOOLEAN:
190
- case TokenID.BIGPR:
191
- case TokenID.SMALLPR:
192
- case TokenID.REDUCE:
193
- case TokenID.BOOL:
194
- case TokenID.DEBOOL:
195
- case TokenID.SET_UNION:
196
- case TokenID.SET_INTERSECTION:
197
- case TokenID.SET_MINUS:
198
- case TokenID.SET_SYMMETRIC_MINUS:
199
- case TokenID.LOGIC_NOT:
200
- case TokenID.NT_TUPLE:
201
- case TokenID.NT_ENUMERATION:
202
- case TokenID.NT_ARGUMENTS:
203
- return this.visitAllAndReturn(node);
204
- case TokenID.ID_LOCAL:
205
- return this.visitLocal(node);
206
- case TokenID.NT_ARG_DECL:
207
- return this.visitArgument(node);
208
- case TokenID.QUANTOR_UNIVERSAL:
209
- case TokenID.QUANTOR_EXISTS:
210
- case TokenID.NT_DECLARATIVE_EXPR:
211
- return this.visitQuantifier(node);
212
- case TokenID.NT_FUNC_DEFINITION:
213
- return this.visitFunctionDefinition(node);
214
- case TokenID.NT_FUNC_CALL:
215
- return this.visitFunctionCall(node);
216
- case TokenID.ITERATE:
217
- case TokenID.ASSIGN:
218
- return this.visitIterate(node);
219
- case TokenID.NT_IMPERATIVE_EXPR:
220
- return this.visitImperative(node);
221
- case TokenID.NT_RECURSIVE_FULL:
222
- case TokenID.NT_RECURSIVE_SHORT:
223
- return this.visitRecursion(node);
224
- }
225
- return false;
226
- }
227
- visitChild(node, index) {
228
- return index < node.children.length && this.dispatchVisit(node.children[index]);
229
- }
230
- visitChildDeclaration(node, index) {
231
- return index < node.children.length && this.dispatchDeclare(node.children[index]);
232
- }
233
- visitAllAndReturn(node) {
234
- for (const child of node.children) {
235
- if (!this.dispatchVisit(child)) {
236
- return false;
237
- }
238
- }
239
- return true;
240
- }
241
- visitLocal(node) {
242
- const alias = getNodeText(node);
243
- if (!this.locals.checkLocal(node) && this.result.find((arg) => arg.alias === alias) === void 0) {
244
- this.result.push({ alias, type: readTypeAnnotation(node) });
245
- }
246
- return true;
247
- }
248
- visitFunctionDefinition(node) {
249
- this.locals.startScope();
250
- if (!this.visitChild(node, 0)) {
251
- return false;
252
- }
253
- if (!this.visitChild(node, 1)) {
254
- return false;
255
- }
256
- this.locals.endScope();
257
- return true;
258
- }
259
- visitFunctionCall(node) {
260
- for (let child = 1; child < node.children.length; child++) {
261
- if (!this.visitChild(node, child)) {
262
- return false;
263
- }
264
- }
265
- return true;
266
- }
267
- visitArgument(node) {
268
- return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
269
- }
270
- visitQuantifier(node) {
271
- this.locals.startScope();
272
- if (!this.visitChild(node, 1)) {
273
- return false;
274
- }
275
- if (!this.visitChildDeclaration(node, 0)) {
276
- return false;
277
- }
278
- if (!this.visitChild(node, 2)) {
279
- return false;
280
- }
281
- this.locals.endScope();
282
- return true;
283
- }
284
- visitImperative(node) {
285
- this.locals.startScope();
286
- for (let child = 1; child < node.children.length; child++) {
287
- if (!this.visitChild(node, child)) {
288
- return false;
289
- }
290
- }
291
- if (!this.visitChild(node, 0)) {
292
- return false;
293
- }
294
- this.locals.endScope();
295
- return true;
296
- }
297
- visitIterate(node) {
298
- return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
299
- }
300
- visitRecursion(node) {
301
- this.locals.startScope();
302
- if (!this.visitChild(node, 1)) {
303
- return false;
304
- }
305
- if (!this.visitChildDeclaration(node, 0)) {
306
- return false;
307
- }
308
- const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;
309
- const iterationIndex = isFull ? 3 : 2;
310
- if (!this.visitChild(node, iterationIndex)) {
311
- return false;
312
- }
313
- if (isFull) {
314
- if (!this.visitChild(node, 2)) {
315
- return false;
316
- }
317
- }
318
- this.locals.endScope();
319
- return true;
320
- }
13
+ locals = new LocalContext();
14
+ result = [];
15
+ run(ast) {
16
+ if (ast.hasError) return [];
17
+ this.result = [];
18
+ this.locals.clear();
19
+ this.dispatchVisit(ast);
20
+ return this.result;
21
+ }
22
+ dispatchDeclare(node) {
23
+ return this.processDeclare(node);
24
+ }
25
+ processDeclare(node) {
26
+ switch (node.typeID) {
27
+ case TokenID.ID_LOCAL: return this.declareLocal(node);
28
+ case TokenID.NT_TUPLE_DECL: return this.declareTuple(node);
29
+ case TokenID.NT_ENUM_DECL: return this.declareEnumeration(node);
30
+ }
31
+ return false;
32
+ }
33
+ declareLocal(node) {
34
+ this.locals.pushLocal(node);
35
+ return true;
36
+ }
37
+ declareTuple(node) {
38
+ for (let child = 0; child < node.children.length; child++) if (!this.visitChildDeclaration(node, child)) return false;
39
+ return true;
40
+ }
41
+ declareEnumeration(node) {
42
+ for (const child of node.children) if (!this.dispatchDeclare(child)) return false;
43
+ return true;
44
+ }
45
+ dispatchVisit(node) {
46
+ return this.processVisit(node);
47
+ }
48
+ processVisit(node) {
49
+ switch (node.typeID) {
50
+ case TokenID.ID_GLOBAL:
51
+ case TokenID.ID_FUNCTION:
52
+ case TokenID.ID_PREDICATE:
53
+ case TokenID.ID_RADICAL:
54
+ case TokenID.LIT_INTEGER:
55
+ case TokenID.LIT_WHOLE_NUMBERS:
56
+ case TokenID.LIT_EMPTYSET: return true;
57
+ case TokenID.CARD:
58
+ case TokenID.FILTER:
59
+ case TokenID.PLUS:
60
+ case TokenID.MINUS:
61
+ case TokenID.MULTIPLY:
62
+ case TokenID.LOGIC_AND:
63
+ case TokenID.LOGIC_OR:
64
+ case TokenID.LOGIC_IMPLICATION:
65
+ case TokenID.LOGIC_EQUIVALENT:
66
+ case TokenID.EQUAL:
67
+ case TokenID.NOTEQUAL:
68
+ case TokenID.GREATER:
69
+ case TokenID.LESSER:
70
+ case TokenID.GREATER_OR_EQ:
71
+ case TokenID.LESSER_OR_EQ:
72
+ case TokenID.SET_IN:
73
+ case TokenID.SET_NOT_IN:
74
+ case TokenID.SUBSET:
75
+ case TokenID.SUBSET_OR_EQ:
76
+ case TokenID.NOT_SUBSET:
77
+ case TokenID.DECART:
78
+ case TokenID.BOOLEAN:
79
+ case TokenID.BIGPR:
80
+ case TokenID.SMALLPR:
81
+ case TokenID.REDUCE:
82
+ case TokenID.BOOL:
83
+ case TokenID.DEBOOL:
84
+ case TokenID.SET_UNION:
85
+ case TokenID.SET_INTERSECTION:
86
+ case TokenID.SET_MINUS:
87
+ case TokenID.SET_SYMMETRIC_MINUS:
88
+ case TokenID.LOGIC_NOT:
89
+ case TokenID.NT_TUPLE:
90
+ case TokenID.NT_ENUMERATION:
91
+ case TokenID.NT_ARGUMENTS: return this.visitAllAndReturn(node);
92
+ case TokenID.ID_LOCAL: return this.visitLocal(node);
93
+ case TokenID.NT_ARG_DECL: return this.visitArgument(node);
94
+ case TokenID.QUANTOR_UNIVERSAL:
95
+ case TokenID.QUANTOR_EXISTS:
96
+ case TokenID.NT_DECLARATIVE_EXPR: return this.visitQuantifier(node);
97
+ case TokenID.NT_FUNC_DEFINITION: return this.visitFunctionDefinition(node);
98
+ case TokenID.NT_FUNC_CALL: return this.visitFunctionCall(node);
99
+ case TokenID.ITERATE:
100
+ case TokenID.ASSIGN: return this.visitIterate(node);
101
+ case TokenID.NT_IMPERATIVE_EXPR: return this.visitImperative(node);
102
+ case TokenID.NT_RECURSIVE_FULL:
103
+ case TokenID.NT_RECURSIVE_SHORT: return this.visitRecursion(node);
104
+ }
105
+ return false;
106
+ }
107
+ visitChild(node, index) {
108
+ return index < node.children.length && this.dispatchVisit(node.children[index]);
109
+ }
110
+ visitChildDeclaration(node, index) {
111
+ return index < node.children.length && this.dispatchDeclare(node.children[index]);
112
+ }
113
+ visitAllAndReturn(node) {
114
+ for (const child of node.children) if (!this.dispatchVisit(child)) return false;
115
+ return true;
116
+ }
117
+ visitLocal(node) {
118
+ const alias = getNodeText(node);
119
+ if (!this.locals.checkLocal(node) && this.result.find((arg) => arg.alias === alias) === void 0) this.result.push({
120
+ alias,
121
+ type: readTypeAnnotation(node)
122
+ });
123
+ return true;
124
+ }
125
+ visitFunctionDefinition(node) {
126
+ this.locals.startScope();
127
+ if (!this.visitChild(node, 0)) return false;
128
+ if (!this.visitChild(node, 1)) return false;
129
+ this.locals.endScope();
130
+ return true;
131
+ }
132
+ visitFunctionCall(node) {
133
+ for (let child = 1; child < node.children.length; child++) if (!this.visitChild(node, child)) return false;
134
+ return true;
135
+ }
136
+ visitArgument(node) {
137
+ return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
138
+ }
139
+ visitQuantifier(node) {
140
+ this.locals.startScope();
141
+ if (!this.visitChild(node, 1)) return false;
142
+ if (!this.visitChildDeclaration(node, 0)) return false;
143
+ if (!this.visitChild(node, 2)) return false;
144
+ this.locals.endScope();
145
+ return true;
146
+ }
147
+ visitImperative(node) {
148
+ this.locals.startScope();
149
+ for (let child = 1; child < node.children.length; child++) if (!this.visitChild(node, child)) return false;
150
+ if (!this.visitChild(node, 0)) return false;
151
+ this.locals.endScope();
152
+ return true;
153
+ }
154
+ visitIterate(node) {
155
+ return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
156
+ }
157
+ visitRecursion(node) {
158
+ this.locals.startScope();
159
+ if (!this.visitChild(node, 1)) return false;
160
+ if (!this.visitChildDeclaration(node, 0)) return false;
161
+ const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;
162
+ const iterationIndex = isFull ? 3 : 2;
163
+ if (!this.visitChild(node, iterationIndex)) return false;
164
+ if (isFull) {
165
+ if (!this.visitChild(node, 2)) return false;
166
+ }
167
+ this.locals.endScope();
168
+ return true;
169
+ }
321
170
  };
171
+ /** Local variables context. */
322
172
  var LocalContext = class {
323
- data = [];
324
- clear() {
325
- this.data = [];
326
- }
327
- startScope() {
328
- for (const local of this.data) {
329
- if (local.level > 0) {
330
- local.level = local.level + 1;
331
- }
332
- }
333
- }
334
- endScope() {
335
- for (const local of this.data) {
336
- local.level--;
337
- }
338
- }
339
- clearUnused() {
340
- this.data = this.data.filter((data) => data.level > 0);
341
- }
342
- pushLocal(node) {
343
- const alias = getNodeText(node);
344
- const existing = this.data.find((data) => data.alias === alias);
345
- if (existing) {
346
- if (existing.level > 0) {
347
- return;
348
- } else {
349
- const index = this.data.indexOf(existing);
350
- if (index !== -1) {
351
- this.data.splice(index, 1);
352
- }
353
- }
354
- }
355
- this.data.push({ alias, level: 1 });
356
- }
357
- checkLocal(node) {
358
- const alias = getNodeText(node);
359
- const local = this.data.find((data) => data.alias === alias);
360
- return local !== void 0;
361
- }
362
- };
363
- export {
364
- ArgumentsExtractor
173
+ data = [];
174
+ clear() {
175
+ this.data = [];
176
+ }
177
+ startScope() {
178
+ for (const local of this.data) if (local.level > 0) local.level = local.level + 1;
179
+ }
180
+ endScope() {
181
+ for (const local of this.data) local.level--;
182
+ }
183
+ clearUnused() {
184
+ this.data = this.data.filter((data) => data.level > 0);
185
+ }
186
+ pushLocal(node) {
187
+ const alias = getNodeText(node);
188
+ const existing = this.data.find((data) => data.alias === alias);
189
+ if (existing) if (existing.level > 0) return;
190
+ else {
191
+ const index = this.data.indexOf(existing);
192
+ if (index !== -1) this.data.splice(index, 1);
193
+ }
194
+ this.data.push({
195
+ alias,
196
+ level: 1
197
+ });
198
+ }
199
+ checkLocal(node) {
200
+ const alias = getNodeText(node);
201
+ return this.data.find((data) => data.alias === alias) !== void 0;
202
+ }
365
203
  };
204
+ //#endregion
205
+ export { ArgumentsExtractor };
206
+
366
207
  //# sourceMappingURL=arguments-extractor.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/parsing/ast.ts","../../../src/rslang/ast-annotations.ts","../../../src/rslang/parser/token.ts","../../../src/rslang/semantic/arguments-extractor.ts"],"sourcesContent":["import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { readTypeAnnotation } from '../ast-annotations';\nimport { TokenID } from '../parser/token';\n\nimport { type ExpressionType } from './typification';\n\n/** Represents function argument definition. */\nexport interface ArgumentsType {\n alias: string;\n type: ExpressionType | null;\n}\n\n/** Type auditor for AST type checking.\n * Warning! Assumes that the AST is well-formed and annotated with types.\n */\nexport class ArgumentsExtractor {\n private locals: LocalContext = new LocalContext();\n private result: ArgumentsType[] = [];\n\n public run(ast: AstNode): ArgumentsType[] {\n if (ast.hasError) {\n return [];\n }\n this.result = [];\n this.locals.clear();\n this.dispatchVisit(ast);\n return this.result;\n }\n\n private dispatchDeclare(node: AstNode): boolean {\n return this.processDeclare(node);\n }\n\n private processDeclare(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node);\n }\n return false;\n }\n\n private declareLocal(node: AstNode): boolean {\n this.locals.pushLocal(node);\n return true;\n }\n\n private declareTuple(node: AstNode): boolean {\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): boolean {\n return this.processVisit(node);\n }\n\n private processVisit(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.LIT_EMPTYSET:\n return true;\n\n case TokenID.CARD:\n case TokenID.FILTER:\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n case TokenID.DECART:\n case TokenID.BOOLEAN:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.LOGIC_NOT:\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n case TokenID.NT_ARGUMENTS:\n return this.visitAllAndReturn(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitQuantifier(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterate(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return false;\n }\n\n private visitChild(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchDeclare(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n if (!this.locals.checkLocal(node) && this.result.find(arg => arg.alias === alias) === undefined) {\n this.result.push({ alias, type: readTypeAnnotation(node) });\n }\n return true;\n }\n\n private visitFunctionDefinition(node: AstNode): boolean {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 1)) {\n return false;\n }\n this.locals.endScope();\n return true;\n }\n\n private visitFunctionCall(node: AstNode): boolean {\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitArgument(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitQuantifier(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 2)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitImperative(node: AstNode): boolean {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n\n if (!this.visitChild(node, 0)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitIterate(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitRecursion(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n if (!this.visitChild(node, iterationIndex)) {\n return false;\n }\n\n if (isFull) {\n if (!this.visitChild(node, 2)) {\n return false;\n }\n }\n\n this.locals.endScope();\n return true;\n }\n}\n\n// ========= Internals ========\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n}\n\n/** Local variables context. */\nclass LocalContext {\n public data: LocalData[] = [];\n\n clear(): void {\n this.data = [];\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(): void {\n for (const local of this.data) {\n local.level--;\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode) {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n return;\n } else {\n const index = this.data.indexOf(existing);\n if (index !== -1) {\n this.data.splice(index, 1);\n }\n }\n }\n this.data.push({ alias, level: 1 });\n }\n\n checkLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n return local !== undefined;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"arguments-extractor.js","names":[],"sources":["../../../src/rslang/semantic/arguments-extractor.ts"],"sourcesContent":["/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { readTypeAnnotation } from '../ast-annotations';\nimport { TokenID } from '../parser/token';\n\nimport { type ExpressionType } from './typification';\n\n/** Represents function argument definition. */\nexport interface ArgumentsType {\n alias: string;\n type: ExpressionType | null;\n}\n\n/** Type auditor for AST type checking.\n * Warning! Assumes that the AST is well-formed and annotated with types.\n */\nexport class ArgumentsExtractor {\n private locals: LocalContext = new LocalContext();\n private result: ArgumentsType[] = [];\n\n public run(ast: AstNode): ArgumentsType[] {\n if (ast.hasError) {\n return [];\n }\n this.result = [];\n this.locals.clear();\n this.dispatchVisit(ast);\n return this.result;\n }\n\n private dispatchDeclare(node: AstNode): boolean {\n return this.processDeclare(node);\n }\n\n private processDeclare(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node);\n }\n return false;\n }\n\n private declareLocal(node: AstNode): boolean {\n this.locals.pushLocal(node);\n return true;\n }\n\n private declareTuple(node: AstNode): boolean {\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): boolean {\n return this.processVisit(node);\n }\n\n private processVisit(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.LIT_EMPTYSET:\n return true;\n\n case TokenID.CARD:\n case TokenID.FILTER:\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n case TokenID.DECART:\n case TokenID.BOOLEAN:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.LOGIC_NOT:\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n case TokenID.NT_ARGUMENTS:\n return this.visitAllAndReturn(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitQuantifier(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterate(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return false;\n }\n\n private visitChild(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchDeclare(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n if (!this.locals.checkLocal(node) && this.result.find(arg => arg.alias === alias) === undefined) {\n this.result.push({ alias, type: readTypeAnnotation(node) });\n }\n return true;\n }\n\n private visitFunctionDefinition(node: AstNode): boolean {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 1)) {\n return false;\n }\n this.locals.endScope();\n return true;\n }\n\n private visitFunctionCall(node: AstNode): boolean {\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitArgument(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitQuantifier(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 2)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitImperative(node: AstNode): boolean {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n\n if (!this.visitChild(node, 0)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitIterate(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitRecursion(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n if (!this.visitChild(node, iterationIndex)) {\n return false;\n }\n\n if (isFull) {\n if (!this.visitChild(node, 2)) {\n return false;\n }\n }\n\n this.locals.endScope();\n return true;\n }\n}\n\n// ========= Internals ========\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n}\n\n/** Local variables context. */\nclass LocalContext {\n public data: LocalData[] = [];\n\n clear(): void {\n this.data = [];\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(): void {\n for (const local of this.data) {\n local.level--;\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode) {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n return;\n } else {\n const index = this.data.indexOf(existing);\n if (index !== -1) {\n this.data.splice(index, 1);\n }\n }\n }\n this.data.push({ alias, level: 1 });\n }\n\n checkLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n return local !== undefined;\n }\n}\n"],"mappings":"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"}