@rsconcept/domain 1.0.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/cctext/index.d.ts +1 -0
  4. package/dist/cctext/index.js +42 -0
  5. package/dist/cctext/index.js.map +1 -0
  6. package/dist/cctext/language-api.d.ts +43 -0
  7. package/dist/cctext/language-api.js +252 -0
  8. package/dist/cctext/language-api.js.map +1 -0
  9. package/dist/cctext/language.d.ts +58 -0
  10. package/dist/cctext/language.js +44 -0
  11. package/dist/cctext/language.js.map +1 -0
  12. package/dist/graph/graph.d.ts +62 -0
  13. package/dist/graph/graph.js +385 -0
  14. package/dist/graph/graph.js.map +1 -0
  15. package/dist/graph/index.d.ts +1 -0
  16. package/dist/graph/index.js +384 -0
  17. package/dist/graph/index.js.map +1 -0
  18. package/dist/index.d.ts +28 -0
  19. package/dist/index.js +5851 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/library/folder-tree.d.ts +32 -0
  22. package/dist/library/folder-tree.js +136 -0
  23. package/dist/library/folder-tree.js.map +1 -0
  24. package/dist/library/index.d.ts +17 -0
  25. package/dist/library/index.js +2800 -0
  26. package/dist/library/index.js.map +1 -0
  27. package/dist/library/library-api.d.ts +6 -0
  28. package/dist/library/library-api.js +13 -0
  29. package/dist/library/library-api.js.map +1 -0
  30. package/dist/library/library.d.ts +56 -0
  31. package/dist/library/library.js +23 -0
  32. package/dist/library/library.js.map +1 -0
  33. package/dist/library/oss-api.d.ts +47 -0
  34. package/dist/library/oss-api.js +1105 -0
  35. package/dist/library/oss-api.js.map +1 -0
  36. package/dist/library/oss-layout-api.d.ts +36 -0
  37. package/dist/library/oss-layout-api.js +330 -0
  38. package/dist/library/oss-layout-api.js.map +1 -0
  39. package/dist/library/oss-layout.d.ts +25 -0
  40. package/dist/library/oss-layout.js +1 -0
  41. package/dist/library/oss-layout.js.map +1 -0
  42. package/dist/library/oss.d.ts +136 -0
  43. package/dist/library/oss.js +30 -0
  44. package/dist/library/oss.js.map +1 -0
  45. package/dist/library/rsengine.d.ts +116 -0
  46. package/dist/library/rsengine.js +2604 -0
  47. package/dist/library/rsengine.js.map +1 -0
  48. package/dist/library/rsform-api.d.ts +74 -0
  49. package/dist/library/rsform-api.js +879 -0
  50. package/dist/library/rsform-api.js.map +1 -0
  51. package/dist/library/rsform.d.ts +206 -0
  52. package/dist/library/rsform.js +32 -0
  53. package/dist/library/rsform.js.map +1 -0
  54. package/dist/library/rsmodel-api.d.ts +43 -0
  55. package/dist/library/rsmodel-api.js +836 -0
  56. package/dist/library/rsmodel-api.js.map +1 -0
  57. package/dist/library/rsmodel.d.ts +52 -0
  58. package/dist/library/rsmodel.js +25 -0
  59. package/dist/library/rsmodel.js.map +1 -0
  60. package/dist/library/structure-planner.d.ts +33 -0
  61. package/dist/library/structure-planner.js +481 -0
  62. package/dist/library/structure-planner.js.map +1 -0
  63. package/dist/parsing/ast.d.ts +49 -0
  64. package/dist/parsing/ast.js +93 -0
  65. package/dist/parsing/ast.js.map +1 -0
  66. package/dist/parsing/index.d.ts +3 -0
  67. package/dist/parsing/index.js +141 -0
  68. package/dist/parsing/index.js.map +1 -0
  69. package/dist/parsing/lezer-tree.d.ts +13 -0
  70. package/dist/parsing/lezer-tree.js +50 -0
  71. package/dist/parsing/lezer-tree.js.map +1 -0
  72. package/dist/rslang/api.d.ts +53 -0
  73. package/dist/rslang/api.js +846 -0
  74. package/dist/rslang/api.js.map +1 -0
  75. package/dist/rslang/ast-annotations.d.ts +18 -0
  76. package/dist/rslang/ast-annotations.js +56 -0
  77. package/dist/rslang/ast-annotations.js.map +1 -0
  78. package/dist/rslang/error.d.ts +85 -0
  79. package/dist/rslang/error.js +159 -0
  80. package/dist/rslang/error.js.map +1 -0
  81. package/dist/rslang/eval/calculator.d.ts +43 -0
  82. package/dist/rslang/eval/calculator.js +1639 -0
  83. package/dist/rslang/eval/calculator.js.map +1 -0
  84. package/dist/rslang/eval/evaluation-cache.d.ts +36 -0
  85. package/dist/rslang/eval/evaluation-cache.js +310 -0
  86. package/dist/rslang/eval/evaluation-cache.js.map +1 -0
  87. package/dist/rslang/eval/evaluator.d.ts +70 -0
  88. package/dist/rslang/eval/evaluator.js +1514 -0
  89. package/dist/rslang/eval/evaluator.js.map +1 -0
  90. package/dist/rslang/eval/value-api.d.ts +48 -0
  91. package/dist/rslang/eval/value-api.js +490 -0
  92. package/dist/rslang/eval/value-api.js.map +1 -0
  93. package/dist/rslang/eval/value.d.ts +36 -0
  94. package/dist/rslang/eval/value.js +118 -0
  95. package/dist/rslang/eval/value.js.map +1 -0
  96. package/dist/rslang/index.d.ts +17 -0
  97. package/dist/rslang/index.js +4314 -0
  98. package/dist/rslang/index.js.map +1 -0
  99. package/dist/rslang/labels.d.ts +16 -0
  100. package/dist/rslang/labels.js +315 -0
  101. package/dist/rslang/labels.js.map +1 -0
  102. package/dist/rslang/parser/expression-generator.d.ts +10 -0
  103. package/dist/rslang/parser/expression-generator.js +451 -0
  104. package/dist/rslang/parser/expression-generator.js.map +1 -0
  105. package/dist/rslang/parser/normalize.d.ts +11 -0
  106. package/dist/rslang/parser/normalize.js +507 -0
  107. package/dist/rslang/parser/normalize.js.map +1 -0
  108. package/dist/rslang/parser/parser.d.ts +5 -0
  109. package/dist/rslang/parser/parser.js +24 -0
  110. package/dist/rslang/parser/parser.js.map +1 -0
  111. package/dist/rslang/parser/parser.terms.d.ts +42 -0
  112. package/dist/rslang/parser/parser.terms.js +84 -0
  113. package/dist/rslang/parser/parser.terms.js.map +1 -0
  114. package/dist/rslang/parser/syntax-errors.d.ts +11 -0
  115. package/dist/rslang/parser/syntax-errors.js +403 -0
  116. package/dist/rslang/parser/syntax-errors.js.map +1 -0
  117. package/dist/rslang/parser/token.d.ts +79 -0
  118. package/dist/rslang/parser/token.js +95 -0
  119. package/dist/rslang/parser/token.js.map +1 -0
  120. package/dist/rslang/semantic/analyzer.d.ts +39 -0
  121. package/dist/rslang/semantic/analyzer.js +2604 -0
  122. package/dist/rslang/semantic/analyzer.js.map +1 -0
  123. package/dist/rslang/semantic/arguments-extractor.d.ts +42 -0
  124. package/dist/rslang/semantic/arguments-extractor.js +366 -0
  125. package/dist/rslang/semantic/arguments-extractor.js.map +1 -0
  126. package/dist/rslang/semantic/type-auditor.d.ts +73 -0
  127. package/dist/rslang/semantic/type-auditor.js +1570 -0
  128. package/dist/rslang/semantic/type-auditor.js.map +1 -0
  129. package/dist/rslang/semantic/typification-api.d.ts +27 -0
  130. package/dist/rslang/semantic/typification-api.js +320 -0
  131. package/dist/rslang/semantic/typification-api.js.map +1 -0
  132. package/dist/rslang/semantic/typification-parser.d.ts +12 -0
  133. package/dist/rslang/semantic/typification-parser.js +226 -0
  134. package/dist/rslang/semantic/typification-parser.js.map +1 -0
  135. package/dist/rslang/semantic/typification.d.ts +119 -0
  136. package/dist/rslang/semantic/typification.js +74 -0
  137. package/dist/rslang/semantic/typification.js.map +1 -0
  138. package/dist/rslang/semantic/value-auditor.d.ts +43 -0
  139. package/dist/rslang/semantic/value-auditor.js +523 -0
  140. package/dist/rslang/semantic/value-auditor.js.map +1 -0
  141. package/dist/rslang/semantic/value-class.d.ts +10 -0
  142. package/dist/rslang/semantic/value-class.js +9 -0
  143. package/dist/rslang/semantic/value-class.js.map +1 -0
  144. package/dist/rslang/typification-graph.d.ts +33 -0
  145. package/dist/rslang/typification-graph.js +311 -0
  146. package/dist/rslang/typification-graph.js.map +1 -0
  147. package/dist/shared/branded.d.ts +7 -0
  148. package/dist/shared/branded.js +1 -0
  149. package/dist/shared/branded.js.map +1 -0
  150. package/dist/shared/hash.d.ts +6 -0
  151. package/dist/shared/hash.js +18 -0
  152. package/dist/shared/hash.js.map +1 -0
  153. package/dist/shared/index.d.ts +2 -0
  154. package/dist/shared/index.js +18 -0
  155. package/dist/shared/index.js.map +1 -0
  156. package/package.json +184 -0
  157. package/src/cctext/index.ts +9 -0
  158. package/src/cctext/language-api.test.ts +149 -0
  159. package/src/cctext/language-api.ts +285 -0
  160. package/src/cctext/language.ts +80 -0
  161. package/src/graph/graph.test.ts +392 -0
  162. package/src/graph/graph.ts +433 -0
  163. package/src/graph/index.ts +1 -0
  164. package/src/index.ts +96 -0
  165. package/src/library/folder-tree.test.ts +47 -0
  166. package/src/library/folder-tree.ts +156 -0
  167. package/src/library/index.ts +46 -0
  168. package/src/library/library-api.test.ts +32 -0
  169. package/src/library/library-api.ts +11 -0
  170. package/src/library/library.ts +61 -0
  171. package/src/library/oss-api.ts +449 -0
  172. package/src/library/oss-layout-api.ts +377 -0
  173. package/src/library/oss-layout.ts +27 -0
  174. package/src/library/oss.ts +150 -0
  175. package/src/library/rsengine.ts +593 -0
  176. package/src/library/rsform-api.ts +533 -0
  177. package/src/library/rsform.ts +228 -0
  178. package/src/library/rsmodel-api.ts +340 -0
  179. package/src/library/rsmodel.ts +50 -0
  180. package/src/library/structure-planner.ts +143 -0
  181. package/src/parsing/ast.ts +136 -0
  182. package/src/parsing/index.ts +15 -0
  183. package/src/parsing/lezer-tree.ts +69 -0
  184. package/src/rslang/api.test.ts +116 -0
  185. package/src/rslang/api.ts +183 -0
  186. package/src/rslang/ast-annotations.ts +70 -0
  187. package/src/rslang/error.ts +129 -0
  188. package/src/rslang/eval/calculator.test.ts +124 -0
  189. package/src/rslang/eval/calculator.ts +121 -0
  190. package/src/rslang/eval/evaluation-cache.ts +257 -0
  191. package/src/rslang/eval/evaluator.test.ts +352 -0
  192. package/src/rslang/eval/evaluator.ts +935 -0
  193. package/src/rslang/eval/value-api.test.ts +105 -0
  194. package/src/rslang/eval/value-api.ts +444 -0
  195. package/src/rslang/eval/value.ts +102 -0
  196. package/src/rslang/index.ts +23 -0
  197. package/src/rslang/labels.ts +191 -0
  198. package/src/rslang/parser/expression-generator.test.ts +100 -0
  199. package/src/rslang/parser/expression-generator.ts +466 -0
  200. package/src/rslang/parser/normalize.test.ts +99 -0
  201. package/src/rslang/parser/normalize.ts +462 -0
  202. package/src/rslang/parser/parser.terms.ts +42 -0
  203. package/src/rslang/parser/parser.test.ts +153 -0
  204. package/src/rslang/parser/parser.ts +20 -0
  205. package/src/rslang/parser/rslang.grammar +251 -0
  206. package/src/rslang/parser/syntax-errors.ts +209 -0
  207. package/src/rslang/parser/token.ts +106 -0
  208. package/src/rslang/semantic/analyzer.test.ts +59 -0
  209. package/src/rslang/semantic/analyzer.ts +179 -0
  210. package/src/rslang/semantic/arguments-extractor.ts +327 -0
  211. package/src/rslang/semantic/type-auditor.test.ts +326 -0
  212. package/src/rslang/semantic/type-auditor.ts +1049 -0
  213. package/src/rslang/semantic/typification-api.test.ts +46 -0
  214. package/src/rslang/semantic/typification-api.ts +321 -0
  215. package/src/rslang/semantic/typification-parser.test.ts +50 -0
  216. package/src/rslang/semantic/typification-parser.ts +220 -0
  217. package/src/rslang/semantic/typification.ts +180 -0
  218. package/src/rslang/semantic/value-auditor.test.ts +206 -0
  219. package/src/rslang/semantic/value-auditor.ts +332 -0
  220. package/src/rslang/semantic/value-class.ts +11 -0
  221. package/src/rslang/typification-graph.ts +155 -0
  222. package/src/shared/branded.ts +6 -0
  223. package/src/shared/hash.ts +17 -0
  224. package/src/shared/index.ts +2 -0
@@ -0,0 +1,523 @@
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
247
+ 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
+ }
506
+ };
507
+ 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
+ }
519
+ }
520
+ export {
521
+ ValueAuditor
522
+ };
523
+ //# sourceMappingURL=value-auditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/parsing/ast.ts","../../../src/rslang/ast-annotations.ts","../../../src/rslang/error.ts","../../../src/rslang/parser/token.ts","../../../src/rslang/semantic/value-class.ts","../../../src/rslang/semantic/value-auditor.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","/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n missingParenthesis: 0x8406, // 33798\n missingCurlyBrace: 0x8407, // 33799\n missingSquareBracket: 0x8408, // 33800\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localDoubleDeclare: 0x2801, // 10241\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n\n typesNotEqual: 0x8803, // 34819\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidProjectionTuple: 0x8811, // 34833\n invalidProjectionSet: 0x8812, // 34834\n invalidEnumeration: 0x8813, // 34835\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;\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","/* Module: Calculation for RSLang. */\n\n/** Represents computability class. */\nexport const ValueClass = {\n VALUE: 'value',\n PROPERTY: 'property'\n} as const;\nexport type ValueClass = (typeof ValueClass)[keyof typeof ValueClass];\n\n/** ValueClass context. */\nexport type ValueClassContext = Map<string, ValueClass>;\n","/**\n * Module: Value auditor for AST value class checking.\n *\n * Determines whether an expression yields a concrete value (computable)\n * or a property (e.g., depends on a quantified variable).\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { TokenID } from '../parser/token';\n\nimport { ValueClass, type ValueClassContext } from './value-class';\n\n/** Value auditor for AST value class checking. */\nexport class ValueAuditor {\n private context: ValueClassContext;\n private annotateErrors: boolean;\n private reporter?: ErrorReporter;\n\n constructor(context: ValueClassContext) {\n this.context = context;\n this.annotateErrors = false;\n }\n\n /**\n * Runs value audit on the AST. Returns the value class on success, null on failure.\n */\n run(ast: AstNode, reporter?: ErrorReporter, annotateErrors: boolean = false): ValueClass | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n return this.dispatchVisit(ast);\n }\n\n private dispatchVisit(node: AstNode): ValueClass | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n return ValueClass.VALUE;\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return ValueClass.PROPERTY;\n\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ARG_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.assertAllValues(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\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 return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n return this.assertAllValues(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n return this.assertChildIsValue(node, 0);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\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.assertAllValues(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterateOrAssign(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ValueClass | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode, value: ValueClass): ValueClass | null {\n for (const child of node.children) {\n if (this.dispatchVisit(child) === null) {\n return null;\n }\n }\n return value;\n }\n\n private assertChildIsValue(node: AstNode, index: number): ValueClass | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (result !== ValueClass.VALUE) {\n const child = node.children[index];\n return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);\n }\n return ValueClass.VALUE;\n }\n\n private assertAllValues(node: AstNode): ValueClass | null {\n for (let i = 0; i < node.children.length; i++) {\n if (this.assertChildIsValue(node, i) === null) {\n return null;\n }\n }\n return ValueClass.VALUE;\n }\n\n private visitFunctionDefinition(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitFunctionCall(node: AstNode): ValueClass | null {\n const result = this.visitChild(node, 0);\n if (result === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n if (this.assertChildIsValue(node, child) === null) {\n return null;\n }\n }\n return result;\n }\n\n private visitGlobal(node: AstNode): ValueClass | null {\n const alias = getNodeText(node);\n const result = this.context.get(alias);\n if (!result) {\n return this.onError(RSErrorCode.globalNoValue, node, [alias]);\n }\n return result;\n }\n\n private visitQuantifier(node: AstNode): ValueClass | null {\n if (this.assertChildIsValue(node, 1) === null) {\n return null;\n }\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return ValueClass.VALUE;\n }\n\n private visitSetexprPredicate(node: AstNode): ValueClass | null {\n const tokenId = node.typeID as TokenID;\n switch (tokenId) {\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET_OR_EQ:\n if (this.assertChildIsValue(node, 0) === null) {\n return null;\n }\n if (this.visitChild(node, 1) === null) {\n return null;\n }\n return ValueClass.VALUE;\n\n case TokenID.SUBSET:\n case TokenID.NOT_SUBSET:\n return this.assertAllValues(node);\n }\n return null;\n }\n\n private visitDeclarative(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitImperative(node: AstNode): ValueClass | null {\n for (let child = 1; child < node.children.length; child++) {\n if (this.visitChild(node, child) === null) {\n return null;\n }\n }\n return this.assertChildIsValue(node, 0);\n }\n\n private visitIterateOrAssign(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.assertChildIsValue(node, 1);\n }\n\n private visitDecart(node: AstNode): ValueClass | null {\n let result: ValueClass = ValueClass.VALUE;\n for (let child = 0; child < node.children.length; child++) {\n const childClass = this.visitChild(node, child);\n if (childClass === null) {\n return null;\n }\n if (childClass === ValueClass.PROPERTY) {\n result = ValueClass.PROPERTY;\n }\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return ValueClass.PROPERTY;\n }\n\n private visitFilter(node: AstNode): ValueClass | null {\n let last: ValueClass | null = null;\n for (const child of node.children) {\n last = this.dispatchVisit(child);\n if (last === null) {\n return null;\n }\n }\n return last;\n }\n\n private visitSetexprBinary(node: AstNode): ValueClass | null {\n const first = this.visitChild(node, 0);\n if (first === null) {\n return null;\n }\n const second = this.visitChild(node, 1);\n if (second === null) {\n return null;\n }\n const isValue = combineOperationValues(\n node.typeID as TokenID,\n first === ValueClass.VALUE,\n second === ValueClass.VALUE\n );\n return isValue ? ValueClass.VALUE : ValueClass.PROPERTY;\n }\n}\n\n// ====== Internals ======\n\n/** Combines value flags for set operations. */\nfunction combineOperationValues(op: TokenID, v1: boolean, v2: boolean): boolean {\n switch (op) {\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.SET_UNION:\n return v1 && v2;\n case TokenID.SET_INTERSECTION:\n return v1 || v2;\n case TokenID.SET_MINUS:\n return v1;\n default:\n return v1 && v2;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ /** Represents computability class. */
2
+ declare const ValueClass: {
3
+ readonly VALUE: "value";
4
+ readonly PROPERTY: "property";
5
+ };
6
+ type ValueClass = (typeof ValueClass)[keyof typeof ValueClass];
7
+ /** ValueClass context. */
8
+ type ValueClassContext = Map<string, ValueClass>;
9
+
10
+ export { ValueClass, type ValueClassContext };
@@ -0,0 +1,9 @@
1
+ // src/rslang/semantic/value-class.ts
2
+ var ValueClass = {
3
+ VALUE: "value",
4
+ PROPERTY: "property"
5
+ };
6
+ export {
7
+ ValueClass
8
+ };
9
+ //# sourceMappingURL=value-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/rslang/semantic/value-class.ts"],"sourcesContent":["/* Module: Calculation for RSLang. */\n\n/** Represents computability class. */\nexport const ValueClass = {\n VALUE: 'value',\n PROPERTY: 'property'\n} as const;\nexport type ValueClass = (typeof ValueClass)[keyof typeof ValueClass];\n\n/** ValueClass context. */\nexport type ValueClassContext = Map<string, ValueClass>;\n"],"mappings":";AAGO,IAAM,aAAa;AAAA,EACxB,OAAO;AAAA,EACP,UAAU;AACZ;","names":[]}
@@ -0,0 +1,33 @@
1
+ import { ExpressionType } from './semantic/typification.js';
2
+ import '../shared/branded.js';
3
+
4
+ /**
5
+ * Module: Multi-graph for typifications.
6
+ */
7
+
8
+ /** Represents a single node of a {@link TypificationGraph}. */
9
+ interface TypificationNodeData extends Record<string, unknown> {
10
+ id: number;
11
+ rank: number;
12
+ text: string;
13
+ parents: number[];
14
+ annotations: string[];
15
+ }
16
+ /** Represents a typification multi-graph. */
17
+ declare class TypificationGraph {
18
+ /** List of nodes. */
19
+ nodes: TypificationNodeData[];
20
+ /** Map of nodes by ID. */
21
+ nodeById: Map<number, TypificationNodeData>;
22
+ /** Map of nodes by alias. */
23
+ nodeByAlias: Map<string, TypificationNodeData>;
24
+ /** Adds an element to the graph. */
25
+ addElement(alias: string, type: ExpressionType): void;
26
+ private processType;
27
+ private addBaseNode;
28
+ private addBooleanNode;
29
+ private addCartesianNode;
30
+ private addAliasAnnotation;
31
+ }
32
+
33
+ export { TypificationGraph, type TypificationNodeData };