@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,523 +1,211 @@
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_ERRORS_KEY = "rsErrors";
12
- function annotateError(node, code, params) {
13
- if (typeof node.annotation === "object" && node.annotation !== null && AST_ERRORS_KEY in node.annotation && isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])) {
14
- return;
15
- }
16
- const entry = params !== void 0 && params.length > 0 ? { code, params: [...params] } : { code };
17
- node.annotation = {
18
- ...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
19
- [AST_ERRORS_KEY]: entry
20
- };
21
- }
22
- function isAstNodeErrorRef(x) {
23
- if (typeof x !== "object" || x === null || !("code" in x)) {
24
- return false;
25
- }
26
- const code = x.code;
27
- if (typeof code !== "number") {
28
- return false;
29
- }
30
- if (!("params" in x)) {
31
- return true;
32
- }
33
- const p = x.params;
34
- if (p === void 0) {
35
- return true;
36
- }
37
- return Array.isArray(p) && p.every((item) => typeof item === "string");
38
- }
39
-
40
- // src/rslang/error.ts
41
- var RSErrorCode = {
42
- unknownSyntax: 33792,
43
- // 33792
44
- missingParenthesis: 33798,
45
- // 33798
46
- missingCurlyBrace: 33799,
47
- // 33799
48
- missingSquareBracket: 33800,
49
- // 33800
50
- bracketMismatch: 33801,
51
- // 33801
52
- doubleParenthesis: 33802,
53
- // 33802
54
- missingOpenBracket: 33803,
55
- // 33803
56
- expectedLocal: 33813,
57
- // 33813
58
- expectedType: 33814,
59
- // 33814
60
- localDoubleDeclare: 10241,
61
- // 10241
62
- localNotUsed: 10242,
63
- // 10242
64
- localUndeclared: 34817,
65
- // 34817
66
- localShadowing: 34818,
67
- // 34818
68
- typesNotEqual: 34819,
69
- // 34819
70
- globalNotTyped: 34820,
71
- // 34820
72
- invalidDecart: 34821,
73
- // 34821
74
- invalidBoolean: 34822,
75
- // 34822
76
- invalidTypeOperation: 34823,
77
- // 34823
78
- invalidCard: 34824,
79
- // 34824
80
- invalidDebool: 34825,
81
- // 34825
82
- globalFuncWithoutArgs: 34827,
83
- // 34827
84
- invalidReduce: 34832,
85
- // 34832
86
- invalidProjectionTuple: 34833,
87
- // 34833
88
- invalidProjectionSet: 34834,
89
- // 34834
90
- invalidEnumeration: 34835,
91
- // 34835
92
- invalidCortegeDeclare: 34836,
93
- // 34836
94
- localOutOfScope: 34837,
95
- // 34837
96
- invalidElementPredicate: 34838,
97
- // 34838
98
- invalidEmptySetUsage: 34839,
99
- // 34839
100
- invalidArgsArity: 34840,
101
- // 34840
102
- invalidArgumentType: 34841,
103
- // 34841
104
- globalStructure: 34844,
105
- // 34844
106
- radicalUsage: 34849,
107
- // 34849
108
- invalidFilterArgumentType: 34850,
109
- // 34850
110
- invalidFilterArity: 34851,
111
- // 34851
112
- arithmeticNotSupported: 34852,
113
- // 34852
114
- typesNotCompatible: 34853,
115
- // 34853
116
- orderingNotSupported: 34854,
117
- // 34854
118
- expectedLogic: 34855,
119
- // 34855
120
- expectedSetexpr: 34856,
121
- // 34856
122
- invalidArgumentCortegeDeclare: 34857,
123
- // 34857
124
- globalNoValue: 34880,
125
- // 34880
126
- invalidPropertyUsage: 34881,
127
- // 34881
128
- // Value evaluation (runtime)
129
- calcUnknownError: 33024,
130
- // 35328
131
- setOverflow: 33025,
132
- // 35329
133
- booleanBaseLimit: 33026,
134
- // 35330
135
- calcGlobalMissing: 33027,
136
- // 35331
137
- iterationsLimit: 33028,
138
- // 35332
139
- calcInvalidDebool: 33029,
140
- // 35333
141
- iterateInfinity: 33030,
142
- // 35334
143
- calculationNotSupported: 33031,
144
- // 35335
145
- cstEmptyDerived: 34913,
146
- // 34913
147
- definitionNotAllowed: 34914
148
- // 34914
149
- };
150
-
151
- // src/rslang/parser/token.ts
152
- var TokenID = {
153
- // Global, local IDs and literals
154
- ERROR: TOKEN_ERROR,
155
- ID_LOCAL: 258,
156
- ID_GLOBAL: 259,
157
- ID_FUNCTION: 260,
158
- ID_PREDICATE: 261,
159
- ID_RADICAL: 262,
160
- LIT_INTEGER: 263,
161
- LIT_WHOLE_NUMBERS: 264,
162
- LIT_EMPTYSET: 265,
163
- // Arithmetic
164
- PLUS: 266,
165
- MINUS: 267,
166
- MULTIPLY: 268,
167
- // Integer predicate symbols
168
- GREATER: 269,
169
- LESSER: 270,
170
- GREATER_OR_EQ: 271,
171
- LESSER_OR_EQ: 272,
172
- // Equality comparison
173
- EQUAL: 273,
174
- NOTEQUAL: 274,
175
- // Logic predicate symbols
176
- QUANTOR_UNIVERSAL: 275,
177
- QUANTOR_EXISTS: 276,
178
- LOGIC_NOT: 277,
179
- LOGIC_EQUIVALENT: 278,
180
- LOGIC_IMPLICATION: 279,
181
- LOGIC_OR: 280,
182
- LOGIC_AND: 281,
183
- // Set theory predicate symbols
184
- SET_IN: 282,
185
- SET_NOT_IN: 283,
186
- SUBSET: 284,
187
- SUBSET_OR_EQ: 285,
188
- NOT_SUBSET: 286,
189
- // Set theory operators
190
- DECART: 287,
191
- SET_UNION: 288,
192
- SET_INTERSECTION: 289,
193
- SET_MINUS: 290,
194
- SET_SYMMETRIC_MINUS: 291,
195
- BOOLEAN: 292,
196
- // Structure operations
197
- BIGPR: 293,
198
- SMALLPR: 294,
199
- FILTER: 295,
200
- CARD: 296,
201
- BOOL: 297,
202
- DEBOOL: 298,
203
- REDUCE: 299,
204
- // Term constructions prefixes
205
- DECLARATIVE: 300,
206
- RECURSIVE: 301,
207
- IMPERATIVE: 302,
208
- ITERATE: 303,
209
- ASSIGN: 304,
210
- // Punctuation
211
- PUNCTUATION_DEFINE: 305,
212
- PUNCTUATION_STRUCT: 306,
213
- PUNCTUATION_PL: 307,
214
- PUNCTUATION_PR: 308,
215
- PUNCTUATION_CL: 309,
216
- PUNCTUATION_CR: 310,
217
- PUNCTUATION_SL: 311,
218
- PUNCTUATION_SR: 312,
219
- PUNCTUATION_BAR: 313,
220
- PUNCTUATION_COMMA: 314,
221
- PUNCTUATION_SEMICOLON: 315,
222
- // ======= Non-terminal tokens =========
223
- NT_ENUM_DECL: 316,
224
- NT_TUPLE: 317,
225
- NT_ENUMERATION: 318,
226
- NT_TUPLE_DECL: 319,
227
- NT_ARG_DECL: 320,
228
- NT_FUNC_DEFINITION: 321,
229
- NT_ARGUMENTS: 322,
230
- NT_FUNC_CALL: 323,
231
- NT_DECLARATIVE_EXPR: 324,
232
- NT_IMPERATIVE_EXPR: 325,
233
- NT_RECURSIVE_FULL: 326,
234
- NT_RECURSIVE_SHORT: 327,
235
- // ======= Helper tokens ========
236
- INTERRUPT: 328,
237
- END: 329
238
- };
239
-
240
- // src/rslang/semantic/value-class.ts
241
- var ValueClass = {
242
- VALUE: "value",
243
- PROPERTY: "property"
244
- };
245
-
246
- // src/rslang/semantic/value-auditor.ts
1
+ import { annotateError } from "../ast-annotations.js";
2
+ import { RSErrorCode } from "../error.js";
3
+ import { getNodeText } from "../../parsing/ast.js";
4
+ import "../../parsing/index.js";
5
+ import { TokenID } from "../parser/token.js";
6
+ import { ValueClass } from "./value-class.js";
7
+ //#region src/rslang/semantic/value-auditor.ts
8
+ /**
9
+ * Module: Value auditor for AST value class checking.
10
+ *
11
+ * Determines whether an expression yields a concrete value (computable)
12
+ * or a property (e.g., depends on a quantified variable).
13
+ */
14
+ /** Value auditor for AST value class checking. */
247
15
  var ValueAuditor = class {
248
- context;
249
- annotateErrors;
250
- reporter;
251
- constructor(context) {
252
- this.context = context;
253
- this.annotateErrors = false;
254
- }
255
- /**
256
- * Runs value audit on the AST. Returns the value class on success, null on failure.
257
- */
258
- run(ast, reporter, annotateErrors = false) {
259
- if (ast.hasError) {
260
- return null;
261
- }
262
- this.reporter = reporter;
263
- this.annotateErrors = annotateErrors;
264
- return this.dispatchVisit(ast);
265
- }
266
- dispatchVisit(node) {
267
- switch (node.typeID) {
268
- case TokenID.ID_GLOBAL:
269
- case TokenID.ID_FUNCTION:
270
- case TokenID.ID_PREDICATE:
271
- return this.visitGlobal(node);
272
- case TokenID.ID_LOCAL:
273
- case TokenID.ID_RADICAL:
274
- case TokenID.LIT_INTEGER:
275
- case TokenID.LIT_EMPTYSET:
276
- return ValueClass.VALUE;
277
- case TokenID.LIT_WHOLE_NUMBERS:
278
- return ValueClass.PROPERTY;
279
- case TokenID.NT_TUPLE_DECL:
280
- case TokenID.NT_ENUM_DECL:
281
- return this.visitAllAndReturn(node, ValueClass.VALUE);
282
- case TokenID.NT_ARGUMENTS:
283
- case TokenID.NT_ARG_DECL:
284
- return this.visitAllAndReturn(node, ValueClass.VALUE);
285
- case TokenID.PLUS:
286
- case TokenID.MINUS:
287
- case TokenID.MULTIPLY:
288
- return this.visitAllAndReturn(node, ValueClass.VALUE);
289
- case TokenID.QUANTOR_UNIVERSAL:
290
- case TokenID.QUANTOR_EXISTS:
291
- return this.visitQuantifier(node);
292
- case TokenID.LOGIC_NOT:
293
- case TokenID.LOGIC_AND:
294
- case TokenID.LOGIC_OR:
295
- case TokenID.LOGIC_IMPLICATION:
296
- case TokenID.LOGIC_EQUIVALENT:
297
- return this.visitAllAndReturn(node, ValueClass.VALUE);
298
- case TokenID.EQUAL:
299
- case TokenID.NOTEQUAL:
300
- return this.assertAllValues(node);
301
- case TokenID.GREATER:
302
- case TokenID.LESSER:
303
- case TokenID.GREATER_OR_EQ:
304
- case TokenID.LESSER_OR_EQ:
305
- return this.visitAllAndReturn(node, ValueClass.VALUE);
306
- case TokenID.SET_IN:
307
- case TokenID.SET_NOT_IN:
308
- case TokenID.SUBSET:
309
- case TokenID.SUBSET_OR_EQ:
310
- case TokenID.NOT_SUBSET:
311
- return this.visitSetexprPredicate(node);
312
- case TokenID.DECART:
313
- return this.visitDecart(node);
314
- case TokenID.BOOLEAN:
315
- return this.visitBoolean(node);
316
- case TokenID.NT_TUPLE:
317
- case TokenID.NT_ENUMERATION:
318
- return this.assertAllValues(node);
319
- case TokenID.FILTER:
320
- return this.visitFilter(node);
321
- case TokenID.CARD:
322
- case TokenID.BOOL:
323
- case TokenID.DEBOOL:
324
- case TokenID.BIGPR:
325
- case TokenID.SMALLPR:
326
- case TokenID.REDUCE:
327
- return this.assertChildIsValue(node, 0);
328
- case TokenID.SET_UNION:
329
- case TokenID.SET_INTERSECTION:
330
- case TokenID.SET_MINUS:
331
- case TokenID.SET_SYMMETRIC_MINUS:
332
- return this.visitSetexprBinary(node);
333
- case TokenID.NT_FUNC_DEFINITION:
334
- return this.visitFunctionDefinition(node);
335
- case TokenID.NT_FUNC_CALL:
336
- return this.visitFunctionCall(node);
337
- case TokenID.NT_DECLARATIVE_EXPR:
338
- return this.visitDeclarative(node);
339
- case TokenID.NT_IMPERATIVE_EXPR:
340
- return this.visitImperative(node);
341
- case TokenID.NT_RECURSIVE_FULL:
342
- case TokenID.NT_RECURSIVE_SHORT:
343
- return this.assertAllValues(node);
344
- case TokenID.ITERATE:
345
- case TokenID.ASSIGN:
346
- return this.visitIterateOrAssign(node);
347
- }
348
- return null;
349
- }
350
- onError(code, node, params) {
351
- this.reporter?.({ code, from: node.from, to: node.to, params });
352
- if (this.annotateErrors) {
353
- annotateError(node, code, params);
354
- }
355
- return null;
356
- }
357
- visitChild(node, index) {
358
- return this.dispatchVisit(node.children[index]);
359
- }
360
- visitAllAndReturn(node, value) {
361
- for (const child of node.children) {
362
- if (this.dispatchVisit(child) === null) {
363
- return null;
364
- }
365
- }
366
- return value;
367
- }
368
- assertChildIsValue(node, index) {
369
- const result = this.visitChild(node, index);
370
- if (result === null) {
371
- return null;
372
- }
373
- if (result !== ValueClass.VALUE) {
374
- const child = node.children[index];
375
- return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);
376
- }
377
- return ValueClass.VALUE;
378
- }
379
- assertAllValues(node) {
380
- for (let i = 0; i < node.children.length; i++) {
381
- if (this.assertChildIsValue(node, i) === null) {
382
- return null;
383
- }
384
- }
385
- return ValueClass.VALUE;
386
- }
387
- visitFunctionDefinition(node) {
388
- if (this.visitChild(node, 0) === null) {
389
- return null;
390
- }
391
- return this.visitChild(node, 1);
392
- }
393
- visitFunctionCall(node) {
394
- const result = this.visitChild(node, 0);
395
- if (result === null) {
396
- return null;
397
- }
398
- for (let child = 1; child < node.children.length; child++) {
399
- if (this.assertChildIsValue(node, child) === null) {
400
- return null;
401
- }
402
- }
403
- return result;
404
- }
405
- visitGlobal(node) {
406
- const alias = getNodeText(node);
407
- const result = this.context.get(alias);
408
- if (!result) {
409
- return this.onError(RSErrorCode.globalNoValue, node, [alias]);
410
- }
411
- return result;
412
- }
413
- visitQuantifier(node) {
414
- if (this.assertChildIsValue(node, 1) === null) {
415
- return null;
416
- }
417
- if (this.visitChild(node, 2) === null) {
418
- return null;
419
- }
420
- return ValueClass.VALUE;
421
- }
422
- visitSetexprPredicate(node) {
423
- const tokenId = node.typeID;
424
- switch (tokenId) {
425
- case TokenID.SET_IN:
426
- case TokenID.SET_NOT_IN:
427
- case TokenID.SUBSET_OR_EQ:
428
- if (this.assertChildIsValue(node, 0) === null) {
429
- return null;
430
- }
431
- if (this.visitChild(node, 1) === null) {
432
- return null;
433
- }
434
- return ValueClass.VALUE;
435
- case TokenID.SUBSET:
436
- case TokenID.NOT_SUBSET:
437
- return this.assertAllValues(node);
438
- }
439
- return null;
440
- }
441
- visitDeclarative(node) {
442
- if (this.visitChild(node, 2) === null) {
443
- return null;
444
- }
445
- return this.visitChild(node, 1);
446
- }
447
- visitImperative(node) {
448
- for (let child = 1; child < node.children.length; child++) {
449
- if (this.visitChild(node, child) === null) {
450
- return null;
451
- }
452
- }
453
- return this.assertChildIsValue(node, 0);
454
- }
455
- visitIterateOrAssign(node) {
456
- if (this.visitChild(node, 0) === null) {
457
- return null;
458
- }
459
- return this.assertChildIsValue(node, 1);
460
- }
461
- visitDecart(node) {
462
- let result = ValueClass.VALUE;
463
- for (let child = 0; child < node.children.length; child++) {
464
- const childClass = this.visitChild(node, child);
465
- if (childClass === null) {
466
- return null;
467
- }
468
- if (childClass === ValueClass.PROPERTY) {
469
- result = ValueClass.PROPERTY;
470
- }
471
- }
472
- return result;
473
- }
474
- visitBoolean(node) {
475
- if (this.visitChild(node, 0) === null) {
476
- return null;
477
- }
478
- return ValueClass.PROPERTY;
479
- }
480
- visitFilter(node) {
481
- let last = null;
482
- for (const child of node.children) {
483
- last = this.dispatchVisit(child);
484
- if (last === null) {
485
- return null;
486
- }
487
- }
488
- return last;
489
- }
490
- visitSetexprBinary(node) {
491
- const first = this.visitChild(node, 0);
492
- if (first === null) {
493
- return null;
494
- }
495
- const second = this.visitChild(node, 1);
496
- if (second === null) {
497
- return null;
498
- }
499
- const isValue = combineOperationValues(
500
- node.typeID,
501
- first === ValueClass.VALUE,
502
- second === ValueClass.VALUE
503
- );
504
- return isValue ? ValueClass.VALUE : ValueClass.PROPERTY;
505
- }
16
+ context;
17
+ annotateErrors;
18
+ reporter;
19
+ constructor(context) {
20
+ this.context = context;
21
+ this.annotateErrors = false;
22
+ }
23
+ /**
24
+ * Runs value audit on the AST. Returns the value class on success, null on failure.
25
+ */
26
+ run(ast, reporter, annotateErrors = false) {
27
+ if (ast.hasError) return null;
28
+ this.reporter = reporter;
29
+ this.annotateErrors = annotateErrors;
30
+ return this.dispatchVisit(ast);
31
+ }
32
+ dispatchVisit(node) {
33
+ switch (node.typeID) {
34
+ case TokenID.ID_GLOBAL:
35
+ case TokenID.ID_FUNCTION:
36
+ case TokenID.ID_PREDICATE: return this.visitGlobal(node);
37
+ case TokenID.ID_LOCAL:
38
+ case TokenID.ID_RADICAL:
39
+ case TokenID.LIT_INTEGER:
40
+ case TokenID.LIT_EMPTYSET: return ValueClass.VALUE;
41
+ case TokenID.LIT_WHOLE_NUMBERS: return ValueClass.PROPERTY;
42
+ case TokenID.NT_TUPLE_DECL:
43
+ case TokenID.NT_ENUM_DECL: return this.visitAllAndReturn(node, ValueClass.VALUE);
44
+ case TokenID.NT_ARGUMENTS:
45
+ case TokenID.NT_ARG_DECL: return this.visitAllAndReturn(node, ValueClass.VALUE);
46
+ case TokenID.PLUS:
47
+ case TokenID.MINUS:
48
+ case TokenID.MULTIPLY: return this.visitAllAndReturn(node, ValueClass.VALUE);
49
+ case TokenID.QUANTOR_UNIVERSAL:
50
+ case TokenID.QUANTOR_EXISTS: return this.visitQuantifier(node);
51
+ case TokenID.LOGIC_NOT:
52
+ case TokenID.LOGIC_AND:
53
+ case TokenID.LOGIC_OR:
54
+ case TokenID.LOGIC_IMPLICATION:
55
+ case TokenID.LOGIC_EQUIVALENT: return this.visitAllAndReturn(node, ValueClass.VALUE);
56
+ case TokenID.EQUAL:
57
+ case TokenID.NOTEQUAL: return this.assertAllValues(node);
58
+ case TokenID.GREATER:
59
+ case TokenID.LESSER:
60
+ case TokenID.GREATER_OR_EQ:
61
+ case TokenID.LESSER_OR_EQ: return this.visitAllAndReturn(node, ValueClass.VALUE);
62
+ case TokenID.SET_IN:
63
+ case TokenID.SET_NOT_IN:
64
+ case TokenID.SUBSET:
65
+ case TokenID.SUBSET_OR_EQ:
66
+ case TokenID.NOT_SUBSET: return this.visitSetexprPredicate(node);
67
+ case TokenID.DECART: return this.visitDecart(node);
68
+ case TokenID.BOOLEAN: return this.visitBoolean(node);
69
+ case TokenID.NT_TUPLE:
70
+ case TokenID.NT_ENUMERATION: return this.assertAllValues(node);
71
+ case TokenID.FILTER: return this.visitFilter(node);
72
+ case TokenID.CARD:
73
+ case TokenID.BOOL:
74
+ case TokenID.DEBOOL:
75
+ case TokenID.BIGPR:
76
+ case TokenID.SMALLPR:
77
+ case TokenID.REDUCE: return this.assertChildIsValue(node, 0);
78
+ case TokenID.SET_UNION:
79
+ case TokenID.SET_INTERSECTION:
80
+ case TokenID.SET_MINUS:
81
+ case TokenID.SET_SYMMETRIC_MINUS: return this.visitSetexprBinary(node);
82
+ case TokenID.NT_FUNC_DEFINITION: return this.visitFunctionDefinition(node);
83
+ case TokenID.NT_FUNC_CALL: return this.visitFunctionCall(node);
84
+ case TokenID.NT_DECLARATIVE_EXPR: return this.visitDeclarative(node);
85
+ case TokenID.NT_IMPERATIVE_EXPR: return this.visitImperative(node);
86
+ case TokenID.NT_RECURSIVE_FULL:
87
+ case TokenID.NT_RECURSIVE_SHORT: return this.assertAllValues(node);
88
+ case TokenID.ITERATE:
89
+ case TokenID.ASSIGN: return this.visitIterateOrAssign(node);
90
+ }
91
+ return null;
92
+ }
93
+ onError(code, node, params) {
94
+ this.reporter?.({
95
+ code,
96
+ from: node.from,
97
+ to: node.to,
98
+ params
99
+ });
100
+ if (this.annotateErrors) annotateError(node, code, params);
101
+ return null;
102
+ }
103
+ visitChild(node, index) {
104
+ return this.dispatchVisit(node.children[index]);
105
+ }
106
+ visitAllAndReturn(node, value) {
107
+ for (const child of node.children) if (this.dispatchVisit(child) === null) return null;
108
+ return value;
109
+ }
110
+ assertChildIsValue(node, index) {
111
+ const result = this.visitChild(node, index);
112
+ if (result === null) return null;
113
+ if (result !== ValueClass.VALUE) {
114
+ const child = node.children[index];
115
+ return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);
116
+ }
117
+ return ValueClass.VALUE;
118
+ }
119
+ assertAllValues(node) {
120
+ for (let i = 0; i < node.children.length; i++) if (this.assertChildIsValue(node, i) === null) return null;
121
+ return ValueClass.VALUE;
122
+ }
123
+ visitFunctionDefinition(node) {
124
+ if (this.visitChild(node, 0) === null) return null;
125
+ return this.visitChild(node, 1);
126
+ }
127
+ visitFunctionCall(node) {
128
+ const result = this.visitChild(node, 0);
129
+ if (result === null) return null;
130
+ for (let child = 1; child < node.children.length; child++) if (this.assertChildIsValue(node, child) === null) return null;
131
+ return result;
132
+ }
133
+ visitGlobal(node) {
134
+ const alias = getNodeText(node);
135
+ const result = this.context.get(alias);
136
+ if (!result) return this.onError(RSErrorCode.globalNoValue, node, [alias]);
137
+ return result;
138
+ }
139
+ visitQuantifier(node) {
140
+ if (this.assertChildIsValue(node, 1) === null) return null;
141
+ if (this.visitChild(node, 2) === null) return null;
142
+ return ValueClass.VALUE;
143
+ }
144
+ visitSetexprPredicate(node) {
145
+ switch (node.typeID) {
146
+ case TokenID.SET_IN:
147
+ case TokenID.SET_NOT_IN:
148
+ case TokenID.SUBSET_OR_EQ:
149
+ if (this.assertChildIsValue(node, 0) === null) return null;
150
+ if (this.visitChild(node, 1) === null) return null;
151
+ return ValueClass.VALUE;
152
+ case TokenID.SUBSET:
153
+ case TokenID.NOT_SUBSET: return this.assertAllValues(node);
154
+ }
155
+ return null;
156
+ }
157
+ visitDeclarative(node) {
158
+ if (this.visitChild(node, 2) === null) return null;
159
+ return this.visitChild(node, 1);
160
+ }
161
+ visitImperative(node) {
162
+ for (let child = 1; child < node.children.length; child++) if (this.visitChild(node, child) === null) return null;
163
+ return this.assertChildIsValue(node, 0);
164
+ }
165
+ visitIterateOrAssign(node) {
166
+ if (this.visitChild(node, 0) === null) return null;
167
+ return this.assertChildIsValue(node, 1);
168
+ }
169
+ visitDecart(node) {
170
+ let result = ValueClass.VALUE;
171
+ for (let child = 0; child < node.children.length; child++) {
172
+ const childClass = this.visitChild(node, child);
173
+ if (childClass === null) return null;
174
+ if (childClass === ValueClass.PROPERTY) result = ValueClass.PROPERTY;
175
+ }
176
+ return result;
177
+ }
178
+ visitBoolean(node) {
179
+ if (this.visitChild(node, 0) === null) return null;
180
+ return ValueClass.PROPERTY;
181
+ }
182
+ visitFilter(node) {
183
+ let last = null;
184
+ for (const child of node.children) {
185
+ last = this.dispatchVisit(child);
186
+ if (last === null) return null;
187
+ }
188
+ return last;
189
+ }
190
+ visitSetexprBinary(node) {
191
+ const first = this.visitChild(node, 0);
192
+ if (first === null) return null;
193
+ const second = this.visitChild(node, 1);
194
+ if (second === null) return null;
195
+ return combineOperationValues(node.typeID, first === ValueClass.VALUE, second === ValueClass.VALUE) ? ValueClass.VALUE : ValueClass.PROPERTY;
196
+ }
506
197
  };
198
+ /** Combines value flags for set operations. */
507
199
  function combineOperationValues(op, v1, v2) {
508
- switch (op) {
509
- case TokenID.SET_SYMMETRIC_MINUS:
510
- case TokenID.SET_UNION:
511
- return v1 && v2;
512
- case TokenID.SET_INTERSECTION:
513
- return v1 || v2;
514
- case TokenID.SET_MINUS:
515
- return v1;
516
- default:
517
- return v1 && v2;
518
- }
200
+ switch (op) {
201
+ case TokenID.SET_SYMMETRIC_MINUS:
202
+ case TokenID.SET_UNION: return v1 && v2;
203
+ case TokenID.SET_INTERSECTION: return v1 || v2;
204
+ case TokenID.SET_MINUS: return v1;
205
+ default: return v1 && v2;
206
+ }
519
207
  }
520
- export {
521
- ValueAuditor
522
- };
208
+ //#endregion
209
+ export { ValueAuditor };
210
+
523
211
  //# sourceMappingURL=value-auditor.js.map