@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,846 +1,133 @@
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
- function getNodeIndices(node) {
10
- if (node.data.dataType === "string[]" && Array.isArray(node.data.value)) {
11
- return node.data.value.map((s) => parseInt(s, 10)).filter((n) => !isNaN(n));
12
- }
13
- return [];
14
- }
15
-
16
- // src/rslang/ast-annotations.ts
17
- var AST_TYPE_KEY = "rsType";
18
- function readTypeAnnotation(node) {
19
- if (node.annotation && AST_TYPE_KEY in node.annotation) {
20
- return node.annotation[AST_TYPE_KEY];
21
- }
22
- return null;
23
- }
24
-
25
- // src/rslang/parser/token.ts
26
- var TokenID = {
27
- // Global, local IDs and literals
28
- ERROR: TOKEN_ERROR,
29
- ID_LOCAL: 258,
30
- ID_GLOBAL: 259,
31
- ID_FUNCTION: 260,
32
- ID_PREDICATE: 261,
33
- ID_RADICAL: 262,
34
- LIT_INTEGER: 263,
35
- LIT_WHOLE_NUMBERS: 264,
36
- LIT_EMPTYSET: 265,
37
- // Arithmetic
38
- PLUS: 266,
39
- MINUS: 267,
40
- MULTIPLY: 268,
41
- // Integer predicate symbols
42
- GREATER: 269,
43
- LESSER: 270,
44
- GREATER_OR_EQ: 271,
45
- LESSER_OR_EQ: 272,
46
- // Equality comparison
47
- EQUAL: 273,
48
- NOTEQUAL: 274,
49
- // Logic predicate symbols
50
- QUANTOR_UNIVERSAL: 275,
51
- QUANTOR_EXISTS: 276,
52
- LOGIC_NOT: 277,
53
- LOGIC_EQUIVALENT: 278,
54
- LOGIC_IMPLICATION: 279,
55
- LOGIC_OR: 280,
56
- LOGIC_AND: 281,
57
- // Set theory predicate symbols
58
- SET_IN: 282,
59
- SET_NOT_IN: 283,
60
- SUBSET: 284,
61
- SUBSET_OR_EQ: 285,
62
- NOT_SUBSET: 286,
63
- // Set theory operators
64
- DECART: 287,
65
- SET_UNION: 288,
66
- SET_INTERSECTION: 289,
67
- SET_MINUS: 290,
68
- SET_SYMMETRIC_MINUS: 291,
69
- BOOLEAN: 292,
70
- // Structure operations
71
- BIGPR: 293,
72
- SMALLPR: 294,
73
- FILTER: 295,
74
- CARD: 296,
75
- BOOL: 297,
76
- DEBOOL: 298,
77
- REDUCE: 299,
78
- // Term constructions prefixes
79
- DECLARATIVE: 300,
80
- RECURSIVE: 301,
81
- IMPERATIVE: 302,
82
- ITERATE: 303,
83
- ASSIGN: 304,
84
- // Punctuation
85
- PUNCTUATION_DEFINE: 305,
86
- PUNCTUATION_STRUCT: 306,
87
- PUNCTUATION_PL: 307,
88
- PUNCTUATION_PR: 308,
89
- PUNCTUATION_CL: 309,
90
- PUNCTUATION_CR: 310,
91
- PUNCTUATION_SL: 311,
92
- PUNCTUATION_SR: 312,
93
- PUNCTUATION_BAR: 313,
94
- PUNCTUATION_COMMA: 314,
95
- PUNCTUATION_SEMICOLON: 315,
96
- // ======= Non-terminal tokens =========
97
- NT_ENUM_DECL: 316,
98
- NT_TUPLE: 317,
99
- NT_ENUMERATION: 318,
100
- NT_TUPLE_DECL: 319,
101
- NT_ARG_DECL: 320,
102
- NT_FUNC_DEFINITION: 321,
103
- NT_ARGUMENTS: 322,
104
- NT_FUNC_CALL: 323,
105
- NT_DECLARATIVE_EXPR: 324,
106
- NT_IMPERATIVE_EXPR: 325,
107
- NT_RECURSIVE_FULL: 326,
108
- NT_RECURSIVE_SHORT: 327,
109
- // ======= Helper tokens ========
110
- INTERRUPT: 328,
111
- END: 329
112
- };
113
-
114
- // src/rslang/semantic/arguments-extractor.ts
115
- var ArgumentsExtractor = class {
116
- locals = new LocalContext();
117
- result = [];
118
- run(ast) {
119
- if (ast.hasError) {
120
- return [];
121
- }
122
- this.result = [];
123
- this.locals.clear();
124
- this.dispatchVisit(ast);
125
- return this.result;
126
- }
127
- dispatchDeclare(node) {
128
- return this.processDeclare(node);
129
- }
130
- processDeclare(node) {
131
- switch (node.typeID) {
132
- case TokenID.ID_LOCAL:
133
- return this.declareLocal(node);
134
- case TokenID.NT_TUPLE_DECL:
135
- return this.declareTuple(node);
136
- case TokenID.NT_ENUM_DECL:
137
- return this.declareEnumeration(node);
138
- }
139
- return false;
140
- }
141
- declareLocal(node) {
142
- this.locals.pushLocal(node);
143
- return true;
144
- }
145
- declareTuple(node) {
146
- for (let child = 0; child < node.children.length; child++) {
147
- if (!this.visitChildDeclaration(node, child)) {
148
- return false;
149
- }
150
- }
151
- return true;
152
- }
153
- declareEnumeration(node) {
154
- for (const child of node.children) {
155
- if (!this.dispatchDeclare(child)) {
156
- return false;
157
- }
158
- }
159
- return true;
160
- }
161
- dispatchVisit(node) {
162
- return this.processVisit(node);
163
- }
164
- processVisit(node) {
165
- switch (node.typeID) {
166
- case TokenID.ID_GLOBAL:
167
- case TokenID.ID_FUNCTION:
168
- case TokenID.ID_PREDICATE:
169
- case TokenID.ID_RADICAL:
170
- case TokenID.LIT_INTEGER:
171
- case TokenID.LIT_WHOLE_NUMBERS:
172
- case TokenID.LIT_EMPTYSET:
173
- return true;
174
- case TokenID.CARD:
175
- case TokenID.FILTER:
176
- case TokenID.PLUS:
177
- case TokenID.MINUS:
178
- case TokenID.MULTIPLY:
179
- case TokenID.LOGIC_AND:
180
- case TokenID.LOGIC_OR:
181
- case TokenID.LOGIC_IMPLICATION:
182
- case TokenID.LOGIC_EQUIVALENT:
183
- case TokenID.EQUAL:
184
- case TokenID.NOTEQUAL:
185
- case TokenID.GREATER:
186
- case TokenID.LESSER:
187
- case TokenID.GREATER_OR_EQ:
188
- case TokenID.LESSER_OR_EQ:
189
- case TokenID.SET_IN:
190
- case TokenID.SET_NOT_IN:
191
- case TokenID.SUBSET:
192
- case TokenID.SUBSET_OR_EQ:
193
- case TokenID.NOT_SUBSET:
194
- case TokenID.DECART:
195
- case TokenID.BOOLEAN:
196
- case TokenID.BIGPR:
197
- case TokenID.SMALLPR:
198
- case TokenID.REDUCE:
199
- case TokenID.BOOL:
200
- case TokenID.DEBOOL:
201
- case TokenID.SET_UNION:
202
- case TokenID.SET_INTERSECTION:
203
- case TokenID.SET_MINUS:
204
- case TokenID.SET_SYMMETRIC_MINUS:
205
- case TokenID.LOGIC_NOT:
206
- case TokenID.NT_TUPLE:
207
- case TokenID.NT_ENUMERATION:
208
- case TokenID.NT_ARGUMENTS:
209
- return this.visitAllAndReturn(node);
210
- case TokenID.ID_LOCAL:
211
- return this.visitLocal(node);
212
- case TokenID.NT_ARG_DECL:
213
- return this.visitArgument(node);
214
- case TokenID.QUANTOR_UNIVERSAL:
215
- case TokenID.QUANTOR_EXISTS:
216
- case TokenID.NT_DECLARATIVE_EXPR:
217
- return this.visitQuantifier(node);
218
- case TokenID.NT_FUNC_DEFINITION:
219
- return this.visitFunctionDefinition(node);
220
- case TokenID.NT_FUNC_CALL:
221
- return this.visitFunctionCall(node);
222
- case TokenID.ITERATE:
223
- case TokenID.ASSIGN:
224
- return this.visitIterate(node);
225
- case TokenID.NT_IMPERATIVE_EXPR:
226
- return this.visitImperative(node);
227
- case TokenID.NT_RECURSIVE_FULL:
228
- case TokenID.NT_RECURSIVE_SHORT:
229
- return this.visitRecursion(node);
230
- }
231
- return false;
232
- }
233
- visitChild(node, index) {
234
- return index < node.children.length && this.dispatchVisit(node.children[index]);
235
- }
236
- visitChildDeclaration(node, index) {
237
- return index < node.children.length && this.dispatchDeclare(node.children[index]);
238
- }
239
- visitAllAndReturn(node) {
240
- for (const child of node.children) {
241
- if (!this.dispatchVisit(child)) {
242
- return false;
243
- }
244
- }
245
- return true;
246
- }
247
- visitLocal(node) {
248
- const alias = getNodeText(node);
249
- if (!this.locals.checkLocal(node) && this.result.find((arg) => arg.alias === alias) === void 0) {
250
- this.result.push({ alias, type: readTypeAnnotation(node) });
251
- }
252
- return true;
253
- }
254
- visitFunctionDefinition(node) {
255
- this.locals.startScope();
256
- if (!this.visitChild(node, 0)) {
257
- return false;
258
- }
259
- if (!this.visitChild(node, 1)) {
260
- return false;
261
- }
262
- this.locals.endScope();
263
- return true;
264
- }
265
- visitFunctionCall(node) {
266
- for (let child = 1; child < node.children.length; child++) {
267
- if (!this.visitChild(node, child)) {
268
- return false;
269
- }
270
- }
271
- return true;
272
- }
273
- visitArgument(node) {
274
- return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
275
- }
276
- visitQuantifier(node) {
277
- this.locals.startScope();
278
- if (!this.visitChild(node, 1)) {
279
- return false;
280
- }
281
- if (!this.visitChildDeclaration(node, 0)) {
282
- return false;
283
- }
284
- if (!this.visitChild(node, 2)) {
285
- return false;
286
- }
287
- this.locals.endScope();
288
- return true;
289
- }
290
- visitImperative(node) {
291
- this.locals.startScope();
292
- for (let child = 1; child < node.children.length; child++) {
293
- if (!this.visitChild(node, child)) {
294
- return false;
295
- }
296
- }
297
- if (!this.visitChild(node, 0)) {
298
- return false;
299
- }
300
- this.locals.endScope();
301
- return true;
302
- }
303
- visitIterate(node) {
304
- return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);
305
- }
306
- visitRecursion(node) {
307
- this.locals.startScope();
308
- if (!this.visitChild(node, 1)) {
309
- return false;
310
- }
311
- if (!this.visitChildDeclaration(node, 0)) {
312
- return false;
313
- }
314
- const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;
315
- const iterationIndex = isFull ? 3 : 2;
316
- if (!this.visitChild(node, iterationIndex)) {
317
- return false;
318
- }
319
- if (isFull) {
320
- if (!this.visitChild(node, 2)) {
321
- return false;
322
- }
323
- }
324
- this.locals.endScope();
325
- return true;
326
- }
327
- };
328
- var LocalContext = class {
329
- data = [];
330
- clear() {
331
- this.data = [];
332
- }
333
- startScope() {
334
- for (const local of this.data) {
335
- if (local.level > 0) {
336
- local.level = local.level + 1;
337
- }
338
- }
339
- }
340
- endScope() {
341
- for (const local of this.data) {
342
- local.level--;
343
- }
344
- }
345
- clearUnused() {
346
- this.data = this.data.filter((data) => data.level > 0);
347
- }
348
- pushLocal(node) {
349
- const alias = getNodeText(node);
350
- const existing = this.data.find((data) => data.alias === alias);
351
- if (existing) {
352
- if (existing.level > 0) {
353
- return;
354
- } else {
355
- const index = this.data.indexOf(existing);
356
- if (index !== -1) {
357
- this.data.splice(index, 1);
358
- }
359
- }
360
- }
361
- this.data.push({ alias, level: 1 });
362
- }
363
- checkLocal(node) {
364
- const alias = getNodeText(node);
365
- const local = this.data.find((data) => data.alias === alias);
366
- return local !== void 0;
367
- }
368
- };
369
-
370
- // src/rslang/parser/expression-generator.ts
371
- function generateExpressionFromAst(ast, options = {}) {
372
- return new ExpressionGenerator(options).run(ast);
373
- }
374
- var ExpressionGenerator = class {
375
- options;
376
- freeLocals = /* @__PURE__ */ new Map();
377
- radicals = /* @__PURE__ */ new Map();
378
- scopes = [];
379
- localCounter = 0;
380
- radicalCounter = 0;
381
- constructor(options) {
382
- this.options = options;
383
- }
384
- /** Run generator. Requires that the AST has no syntax errors. */
385
- run(ast) {
386
- if (ast.hasError) {
387
- throw new Error("Cannot generate expression: AST has error");
388
- }
389
- return this.visit(ast, { localDeclaration: false });
390
- }
391
- visit(node, context) {
392
- const shouldScope = this.shouldStartScope(node.typeID);
393
- if (shouldScope) {
394
- this.startScope();
395
- }
396
- const result = this.renderNode(node, context);
397
- if (shouldScope) {
398
- this.endScope();
399
- }
400
- return result;
401
- }
402
- renderNode(node, context) {
403
- switch (node.typeID) {
404
- case TokenID.ID_LOCAL: {
405
- const alias = getNodeText(node);
406
- return this.options.normalize ? context.localDeclaration ? this.declareLocal(alias) : this.resolveLocal(alias) : alias;
407
- }
408
- case TokenID.ID_GLOBAL:
409
- case TokenID.ID_FUNCTION:
410
- case TokenID.ID_PREDICATE:
411
- return getNodeText(node);
412
- case TokenID.ID_RADICAL: {
413
- const alias = getNodeText(node);
414
- return this.options.normalize ? this.resolveRadical(alias) : alias;
415
- }
416
- case TokenID.LIT_INTEGER:
417
- return String(node.data.value);
418
- case TokenID.LIT_WHOLE_NUMBERS:
419
- return "Z";
420
- case TokenID.LIT_EMPTYSET:
421
- return "\u2205";
422
- case TokenID.BIGPR:
423
- return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
424
- case TokenID.SMALLPR:
425
- return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
426
- case TokenID.FILTER: {
427
- const args = node.children.slice(0, -1).map((child) => this.visit(child, context)).join(", ");
428
- const body = this.visitChild(node, node.children.length - 1, context);
429
- return `Fi${this.formatIndices(node)}[${args}](${body})`;
430
- }
431
- case TokenID.CARD:
432
- return `card(${this.visitChild(node, 0, context)})`;
433
- case TokenID.BOOL:
434
- return `bool(${this.visitChild(node, 0, context)})`;
435
- case TokenID.DEBOOL:
436
- return `debool(${this.visitChild(node, 0, context)})`;
437
- case TokenID.REDUCE:
438
- return `red(${this.visitChild(node, 0, context)})`;
439
- case TokenID.BOOLEAN:
440
- return this.renderBoolean(node, context);
441
- case TokenID.NT_FUNC_CALL: {
442
- const callee = this.visitChild(node, 0, context);
443
- const args = node.children.slice(1).map((child) => this.visit(child, context)).join(", ");
444
- return `${callee}[${args}]`;
445
- }
446
- case TokenID.NT_TUPLE:
447
- return `(${node.children.map((child) => this.visit(child, context)).join(", ")})`;
448
- case TokenID.NT_ENUMERATION:
449
- return `{${node.children.map((child) => this.visit(child, context)).join(", ")}}`;
450
- case TokenID.NT_ARGUMENTS:
451
- case TokenID.NT_ENUM_DECL:
452
- return node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ");
453
- case TokenID.NT_TUPLE_DECL:
454
- return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ")})`;
455
- case TokenID.NT_ARG_DECL:
456
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}\u2208${this.visitChild(node, 1, context)}`;
457
- case TokenID.QUANTOR_UNIVERSAL:
458
- return this.renderQuantifier("\u2200", node, context);
459
- case TokenID.QUANTOR_EXISTS:
460
- return this.renderQuantifier("\u2203", node, context);
461
- case TokenID.NT_DECLARATIVE_EXPR:
462
- return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}\u2208${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
463
- case TokenID.NT_FUNC_DEFINITION:
464
- return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;
465
- case TokenID.ITERATE:
466
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:\u2208${this.visitChild(node, 1, context)}`;
467
- case TokenID.ASSIGN:
468
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;
469
- case TokenID.NT_IMPERATIVE_EXPR: {
470
- const statements = node.children.slice(1).map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));
471
- const target = this.visitChild(node, 0, context);
472
- return `I{${target} | ${statements.join("; ")}}`;
473
- }
474
- case TokenID.NT_RECURSIVE_SHORT:
475
- return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
476
- case TokenID.NT_RECURSIVE_FULL:
477
- return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)} | ${this.visitChild(node, 3, context)}}`;
478
- case TokenID.PLUS:
479
- return this.renderInfix("+", node, context);
480
- case TokenID.MINUS:
481
- return this.renderInfix("-", node, context);
482
- case TokenID.MULTIPLY:
483
- return this.renderInfix("*", node, context);
484
- case TokenID.GREATER:
485
- return this.renderInfix(">", node, context);
486
- case TokenID.LESSER:
487
- return this.renderInfix("<", node, context);
488
- case TokenID.GREATER_OR_EQ:
489
- return this.renderInfix("\u2265", node, context);
490
- case TokenID.LESSER_OR_EQ:
491
- return this.renderInfix("\u2264", node, context);
492
- case TokenID.EQUAL:
493
- return this.renderInfix("=", node, context);
494
- case TokenID.NOTEQUAL:
495
- return this.renderInfix("\u2260", node, context);
496
- case TokenID.LOGIC_AND:
497
- return this.renderInfix("&", node, context);
498
- case TokenID.LOGIC_OR:
499
- return this.renderInfix("\u2228", node, context);
500
- case TokenID.LOGIC_IMPLICATION:
501
- return this.renderInfix("\u21D2", node, context);
502
- case TokenID.LOGIC_EQUIVALENT:
503
- return this.renderInfix("\u21D4", node, context);
504
- case TokenID.SET_IN:
505
- return this.renderInfix("\u2208", node, context);
506
- case TokenID.SET_NOT_IN:
507
- return this.renderInfix("\u2209", node, context);
508
- case TokenID.SUBSET:
509
- return this.renderInfix("\u2282", node, context);
510
- case TokenID.SUBSET_OR_EQ:
511
- return this.renderInfix("\u2286", node, context);
512
- case TokenID.NOT_SUBSET:
513
- return this.renderInfix("\u2284", node, context);
514
- case TokenID.DECART:
515
- return this.renderInfix("\xD7", node, context);
516
- case TokenID.SET_UNION:
517
- return this.renderInfix("\u222A", node, context);
518
- case TokenID.SET_INTERSECTION:
519
- return this.renderInfix("\u2229", node, context);
520
- case TokenID.SET_MINUS:
521
- return this.renderInfix("\\", node, context);
522
- case TokenID.SET_SYMMETRIC_MINUS:
523
- return this.renderInfix("\u2206", node, context);
524
- case TokenID.LOGIC_NOT:
525
- return `\xAC${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;
526
- default:
527
- return node.children.map((child) => this.visit(child, context)).join("");
528
- }
529
- }
530
- visitChild(node, index, context) {
531
- const child = node.children[index];
532
- if (!child) {
533
- return "";
534
- }
535
- return this.visit(child, this.childContext(node.typeID, index, context));
536
- }
537
- renderQuantifier(symbol, node, context) {
538
- const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));
539
- const domain = this.visitChild(node, 1, context);
540
- const bodyNode = node.children[2];
541
- const bodyText = this.visitChild(node, 2, context);
542
- const body = bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText;
543
- return `${symbol}${declaration}\u2208${domain} ${body}`;
544
- }
545
- shouldWrapQuantifierBody(node) {
546
- const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);
547
- const bodyPrecedence = this.getPrecedence(node.typeID);
548
- if (quantifierPrecedence === null || bodyPrecedence === null) {
549
- return false;
550
- }
551
- return bodyPrecedence < quantifierPrecedence;
552
- }
553
- renderInfix(symbol, node, context) {
554
- if (this.isLogicBinary(node.typeID)) {
555
- const parts2 = node.children.map((child, index) => {
556
- const text = this.visit(child, context);
557
- return this.needParen(node, child, index) ? `(${text})` : text;
558
- });
559
- return parts2.join(` ${symbol} `);
560
- }
561
- const parts = node.children.map((child) => this.wrapIfNeeded(this.visit(child, context), child));
562
- return parts.join(symbol);
563
- }
564
- needParen(parent, child, childIndex) {
565
- if (this.isAtomic(child.typeID)) {
566
- return false;
567
- }
568
- const parentPrecedence = this.getPrecedence(parent.typeID);
569
- const childPrecedence = this.getPrecedence(child.typeID);
570
- if (parentPrecedence === null || childPrecedence === null) {
571
- return true;
572
- }
573
- if (childPrecedence > parentPrecedence) {
574
- return false;
575
- }
576
- if (childPrecedence < parentPrecedence) {
577
- return true;
578
- }
579
- if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) {
580
- return false;
581
- }
582
- if (this.isLeftAssociative(parent.typeID)) {
583
- return childIndex > 0;
584
- }
585
- return true;
586
- }
587
- getPrecedence(typeID) {
588
- switch (typeID) {
589
- case TokenID.LOGIC_EQUIVALENT:
590
- return 1;
591
- case TokenID.LOGIC_IMPLICATION:
592
- return 2;
593
- case TokenID.LOGIC_OR:
594
- return 3;
595
- case TokenID.LOGIC_AND:
596
- return 4;
597
- case TokenID.QUANTOR_UNIVERSAL:
598
- case TokenID.QUANTOR_EXISTS:
599
- return 5;
600
- case TokenID.EQUAL:
601
- case TokenID.NOTEQUAL:
602
- case TokenID.GREATER:
603
- case TokenID.LESSER:
604
- case TokenID.GREATER_OR_EQ:
605
- case TokenID.LESSER_OR_EQ:
606
- case TokenID.SET_IN:
607
- case TokenID.SET_NOT_IN:
608
- case TokenID.SUBSET:
609
- case TokenID.SUBSET_OR_EQ:
610
- case TokenID.NOT_SUBSET:
611
- return 6;
612
- case TokenID.PLUS:
613
- case TokenID.MINUS:
614
- case TokenID.SET_UNION:
615
- case TokenID.SET_SYMMETRIC_MINUS:
616
- return 7;
617
- case TokenID.MULTIPLY:
618
- case TokenID.DECART:
619
- case TokenID.SET_INTERSECTION:
620
- case TokenID.SET_MINUS:
621
- return 8;
622
- default:
623
- return null;
624
- }
625
- }
626
- isAssociative(typeID) {
627
- return typeID === TokenID.PLUS || typeID === TokenID.MULTIPLY || typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_EQUIVALENT || typeID === TokenID.SET_UNION || typeID === TokenID.SET_INTERSECTION || typeID === TokenID.DECART;
628
- }
629
- isLeftAssociative(typeID) {
630
- return typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.MINUS || typeID === TokenID.SET_MINUS || typeID === TokenID.SET_SYMMETRIC_MINUS;
631
- }
632
- renderBoolean(node, context) {
633
- let current = node;
634
- let depth = 0;
635
- while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {
636
- depth += 1;
637
- current = current.children[0];
638
- }
639
- return `${"\u212C".repeat(depth)}(${this.visit(current, context)})`;
640
- }
641
- wrapIfNeeded(text, node) {
642
- if (this.isAtomic(node.typeID)) {
643
- return text;
644
- }
645
- return `(${text})`;
646
- }
647
- isAtomic(typeID) {
648
- return typeID === TokenID.ID_LOCAL || typeID === TokenID.ID_GLOBAL || typeID === TokenID.ID_FUNCTION || typeID === TokenID.ID_PREDICATE || typeID === TokenID.ID_RADICAL || typeID === TokenID.LIT_INTEGER || typeID === TokenID.LIT_WHOLE_NUMBERS || typeID === TokenID.LIT_EMPTYSET || typeID === TokenID.NT_FUNC_CALL || typeID === TokenID.NT_TUPLE || typeID === TokenID.NT_ENUMERATION || typeID === TokenID.BIGPR || typeID === TokenID.SMALLPR || typeID === TokenID.FILTER || typeID === TokenID.REDUCE || typeID === TokenID.BOOL || typeID === TokenID.DEBOOL || typeID === TokenID.CARD || typeID === TokenID.BOOLEAN;
649
- }
650
- isLogicBinary(typeID) {
651
- return typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.LOGIC_EQUIVALENT;
652
- }
653
- formatIndices(node) {
654
- return getNodeIndices(node).join(",");
655
- }
656
- shouldStartScope(typeID) {
657
- return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.NT_FUNC_DEFINITION || typeID === TokenID.NT_IMPERATIVE_EXPR || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL;
658
- }
659
- childContext(typeID, index, parent) {
660
- if (!this.options.normalize) {
661
- return parent;
662
- }
663
- const isDeclaration = (typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS || typeID === TokenID.NT_DECLARATIVE_EXPR || typeID === TokenID.ITERATE || typeID === TokenID.ASSIGN || typeID === TokenID.NT_RECURSIVE_SHORT || typeID === TokenID.NT_RECURSIVE_FULL) && index === 0 || typeID === TokenID.NT_FUNC_DEFINITION && index === 0 || typeID === TokenID.NT_ARG_DECL && index === 0 || typeID === TokenID.NT_TUPLE_DECL || typeID === TokenID.NT_ENUM_DECL;
664
- return { localDeclaration: isDeclaration };
665
- }
666
- declareLocal(alias) {
667
- const scope = this.currentScope();
668
- const local = this.nextLocal();
669
- scope.set(alias, local);
670
- return local;
671
- }
672
- resolveLocal(alias) {
673
- for (let index = this.scopes.length - 1; index >= 0; index -= 1) {
674
- const local2 = this.scopes[index].get(alias);
675
- if (local2) {
676
- return local2;
677
- }
678
- }
679
- let local = this.freeLocals.get(alias);
680
- if (!local) {
681
- local = this.nextLocal();
682
- this.freeLocals.set(alias, local);
683
- }
684
- return local;
685
- }
686
- resolveRadical(alias) {
687
- let radical = this.radicals.get(alias);
688
- if (!radical) {
689
- this.radicalCounter += 1;
690
- radical = `R${this.radicalCounter}`;
691
- this.radicals.set(alias, radical);
692
- }
693
- return radical;
694
- }
695
- startScope() {
696
- this.scopes.push(/* @__PURE__ */ new Map());
697
- }
698
- endScope() {
699
- this.scopes.pop();
700
- }
701
- currentScope() {
702
- const scope = this.scopes.at(-1);
703
- if (!scope) {
704
- throw new Error("Attempted to declare local outside of scope");
705
- }
706
- return scope;
707
- }
708
- nextLocal() {
709
- this.localCounter += 1;
710
- return `a${this.localCounter}`;
711
- }
712
- };
713
-
714
- // src/rslang/api.ts
715
- var LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\d*/g;
716
- var GLOBALS_REGEXP = /[XCSADFPTN]\d+/g;
717
- var COMPLEX_SYMBOLS_REGEXP = /[∀∃×ℬ;|:]/g;
718
- var TYPIFICATION_SET = /^ℬ+\([ℬ\(((X|C)\d+|Z)\)×]*\)$/g;
1
+ import { ArgumentsExtractor } from "./semantic/arguments-extractor.js";
2
+ import { generateExpressionFromAst } from "./parser/expression-generator.js";
3
+ //#region src/rslang/api.ts
4
+ const LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\d*/g;
5
+ const GLOBALS_REGEXP = /[XCSADFPTN]\d+/g;
6
+ const COMPLEX_SYMBOLS_REGEXP = /[∀∃×ℬ;|:]/g;
7
+ const TYPIFICATION_SET = /^ℬ+\([ℬ\(((X|C)\d+|Z)\)×]*\)$/g;
8
+ /** Extract arguments from AST. */
719
9
  function extractArguments(ast) {
720
- return new ArgumentsExtractor().run(ast);
10
+ return new ArgumentsExtractor().run(ast);
721
11
  }
12
+ /** Extracts global variable names from a given expression. */
722
13
  function extractGlobals(expression) {
723
- return new Set(expression.match(GLOBALS_REGEXP) ?? []);
14
+ return new Set(expression.match(GLOBALS_REGEXP) ?? []);
724
15
  }
16
+ /** Check if expression is simple derivation. */
725
17
  function isSimpleExpression(text) {
726
- return !text.match(COMPLEX_SYMBOLS_REGEXP);
18
+ return !text.match(COMPLEX_SYMBOLS_REGEXP);
727
19
  }
20
+ /** Check if expression is set typification. */
728
21
  function isSetTypification(text) {
729
- return !!text.match(TYPIFICATION_SET);
22
+ return !!text.match(TYPIFICATION_SET);
730
23
  }
24
+ /**
25
+ * Splits a string containing a template definition into its head and body parts.
26
+ *
27
+ * A template definition is expected to have the following format: `[head] body`.
28
+ * If the input string does not contain the opening square bracket '[', the entire
29
+ * string is treated as the body, and an empty string is assigned to the head.
30
+ * If the opening bracket is present, the function attempts to find the matching
31
+ * closing bracket ']' to determine the head and body parts.
32
+ *
33
+ * @example
34
+ * const template = '[header] body content';
35
+ * const result = splitTemplateDefinition(template);
36
+ * // result: `{ head: 'header', body: 'body content' }`
37
+ */
731
38
  function splitTemplateDefinition(target) {
732
- let start = 0;
733
- for (; start < target.length && target[start] !== "["; ++start) ;
734
- if (start < target.length) {
735
- for (let counter = 0, end = start + 1; end < target.length; ++end) {
736
- if (target[end] === "[") {
737
- ++counter;
738
- } else if (target[end] === "]") {
739
- if (counter !== 0) {
740
- --counter;
741
- } else {
742
- return {
743
- head: target.substring(start + 1, end).trim(),
744
- body: target.substring(end + 1).trim()
745
- };
746
- }
747
- }
748
- }
749
- }
750
- return {
751
- head: "",
752
- body: target
753
- };
39
+ let start = 0;
40
+ for (; start < target.length && target[start] !== "["; ++start);
41
+ if (start < target.length) {
42
+ for (let counter = 0, end = start + 1; end < target.length; ++end) if (target[end] === "[") ++counter;
43
+ else if (target[end] === "]") if (counter !== 0) --counter;
44
+ else return {
45
+ head: target.substring(start + 1, end).trim(),
46
+ body: target.substring(end + 1).trim()
47
+ };
48
+ }
49
+ return {
50
+ head: "",
51
+ body: target
52
+ };
754
53
  }
54
+ /**
55
+ * Substitutes values for template arguments in a given expression.
56
+ *
57
+ * This function takes an input mathematical expression and a list of argument values.
58
+ * It replaces template argument placeholders in the expression with their corresponding values
59
+ * from the provided arguments.
60
+ */
755
61
  function substituteTemplateArgs(expression, mapping) {
756
- if (Object.keys(mapping).length === 0) {
757
- return expression;
758
- }
759
- let { head, body } = splitTemplateDefinition(expression);
760
- body = applyPattern(body, mapping, LOCALS_REGEXP);
761
- const argTexts = head.split(",").map((text) => text.trim());
762
- head = argTexts.filter((arg) => [...arg.matchAll(LOCALS_REGEXP)].every((local) => local.every((match) => !(match in mapping)))).join(", ");
763
- if (!head) {
764
- return body;
765
- } else {
766
- return `[${head}] ${body}`;
767
- }
62
+ if (Object.keys(mapping).length === 0) return expression;
63
+ let { head, body } = splitTemplateDefinition(expression);
64
+ body = applyPattern(body, mapping, LOCALS_REGEXP);
65
+ head = head.split(",").map((text) => text.trim()).filter((arg) => [...arg.matchAll(LOCALS_REGEXP)].every((local) => local.every((match) => !(match in mapping)))).join(", ");
66
+ if (!head) return body;
67
+ else return `[${head}] ${body}`;
768
68
  }
69
+ /** Apply alias mapping. */
769
70
  function applyAliasMapping(target, mapping) {
770
- return applyPattern(target, mapping, GLOBALS_REGEXP);
71
+ return applyPattern(target, mapping, GLOBALS_REGEXP);
771
72
  }
73
+ /** Apply alias typification mapping. */
772
74
  function applyTypificationMapping(target, mapping) {
773
- const modified = applyAliasMapping(target, mapping);
774
- if (modified === target) {
775
- return target;
776
- }
777
- const deleteBrackets = [];
778
- const positions = [];
779
- const booleans = [];
780
- let boolCount = 0;
781
- let stackSize = 0;
782
- for (let i = 0; i < modified.length; i++) {
783
- const char = modified[i];
784
- if (char === "\u212C") {
785
- boolCount++;
786
- continue;
787
- }
788
- if (char === "(") {
789
- stackSize++;
790
- positions.push(i);
791
- booleans.push(boolCount);
792
- }
793
- boolCount = 0;
794
- if (char === ")") {
795
- if (i < modified.length - 1 && modified[i + 1] === ")" && stackSize > 1 && positions[stackSize - 2] + booleans[stackSize - 1] + 1 === positions[stackSize - 1]) {
796
- deleteBrackets.push(i);
797
- deleteBrackets.push(positions[stackSize - 2]);
798
- }
799
- if (i === modified.length - 1 && stackSize === 1 && positions[0] === 0) {
800
- deleteBrackets.push(i);
801
- deleteBrackets.push(positions[0]);
802
- }
803
- stackSize--;
804
- positions.pop();
805
- booleans.pop();
806
- }
807
- }
808
- let result = "";
809
- for (let i = 0; i < modified.length; i++) {
810
- if (!deleteBrackets.includes(i)) {
811
- result += modified[i];
812
- }
813
- }
814
- return result;
75
+ const modified = applyAliasMapping(target, mapping);
76
+ if (modified === target) return target;
77
+ const deleteBrackets = [];
78
+ const positions = [];
79
+ const booleans = [];
80
+ let boolCount = 0;
81
+ let stackSize = 0;
82
+ for (let i = 0; i < modified.length; i++) {
83
+ const char = modified[i];
84
+ if (char === "ℬ") {
85
+ boolCount++;
86
+ continue;
87
+ }
88
+ if (char === "(") {
89
+ stackSize++;
90
+ positions.push(i);
91
+ booleans.push(boolCount);
92
+ }
93
+ boolCount = 0;
94
+ if (char === ")") {
95
+ if (i < modified.length - 1 && modified[i + 1] === ")" && stackSize > 1 && positions[stackSize - 2] + booleans[stackSize - 1] + 1 === positions[stackSize - 1]) {
96
+ deleteBrackets.push(i);
97
+ deleteBrackets.push(positions[stackSize - 2]);
98
+ }
99
+ if (i === modified.length - 1 && stackSize === 1 && positions[0] === 0) {
100
+ deleteBrackets.push(i);
101
+ deleteBrackets.push(positions[0]);
102
+ }
103
+ stackSize--;
104
+ positions.pop();
105
+ booleans.pop();
106
+ }
107
+ }
108
+ let result = "";
109
+ for (let i = 0; i < modified.length; i++) if (!deleteBrackets.includes(i)) result += modified[i];
110
+ return result;
815
111
  }
112
+ /** Text substitution guided by mapping and regular expression. */
816
113
  function applyPattern(text, mapping, pattern) {
817
- if (text === "" || pattern === null) {
818
- return text;
819
- }
820
- let posInput = 0;
821
- let output = "";
822
- const patternMatches = text.matchAll(pattern);
823
- for (const segment of patternMatches) {
824
- const entity = segment[0];
825
- const start = segment.index ?? 0;
826
- if (entity in mapping) {
827
- output += text.substring(posInput, start);
828
- output += mapping[entity];
829
- posInput = start + segment[0].length;
830
- }
831
- }
832
- output += text.substring(posInput);
833
- return output;
114
+ if (text === "" || pattern === null) return text;
115
+ let posInput = 0;
116
+ let output = "";
117
+ const patternMatches = text.matchAll(pattern);
118
+ for (const segment of patternMatches) {
119
+ const entity = segment[0];
120
+ const start = segment.index ?? 0;
121
+ if (entity in mapping) {
122
+ output += text.substring(posInput, start);
123
+ output += mapping[entity];
124
+ posInput = start + segment[0].length;
125
+ }
126
+ }
127
+ output += text.substring(posInput);
128
+ return output;
834
129
  }
835
- export {
836
- applyAliasMapping,
837
- applyTypificationMapping,
838
- extractArguments,
839
- extractGlobals,
840
- generateExpressionFromAst,
841
- isSetTypification,
842
- isSimpleExpression,
843
- splitTemplateDefinition,
844
- substituteTemplateArgs
845
- };
130
+ //#endregion
131
+ export { applyAliasMapping, applyTypificationMapping, extractArguments, extractGlobals, generateExpressionFromAst, isSetTypification, isSimpleExpression, splitTemplateDefinition, substituteTemplateArgs };
132
+
846
133
  //# sourceMappingURL=api.js.map