@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,451 +1,253 @@
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/parser/token.ts
17
- var TokenID = {
18
- // Global, local IDs and literals
19
- ERROR: TOKEN_ERROR,
20
- ID_LOCAL: 258,
21
- ID_GLOBAL: 259,
22
- ID_FUNCTION: 260,
23
- ID_PREDICATE: 261,
24
- ID_RADICAL: 262,
25
- LIT_INTEGER: 263,
26
- LIT_WHOLE_NUMBERS: 264,
27
- LIT_EMPTYSET: 265,
28
- // Arithmetic
29
- PLUS: 266,
30
- MINUS: 267,
31
- MULTIPLY: 268,
32
- // Integer predicate symbols
33
- GREATER: 269,
34
- LESSER: 270,
35
- GREATER_OR_EQ: 271,
36
- LESSER_OR_EQ: 272,
37
- // Equality comparison
38
- EQUAL: 273,
39
- NOTEQUAL: 274,
40
- // Logic predicate symbols
41
- QUANTOR_UNIVERSAL: 275,
42
- QUANTOR_EXISTS: 276,
43
- LOGIC_NOT: 277,
44
- LOGIC_EQUIVALENT: 278,
45
- LOGIC_IMPLICATION: 279,
46
- LOGIC_OR: 280,
47
- LOGIC_AND: 281,
48
- // Set theory predicate symbols
49
- SET_IN: 282,
50
- SET_NOT_IN: 283,
51
- SUBSET: 284,
52
- SUBSET_OR_EQ: 285,
53
- NOT_SUBSET: 286,
54
- // Set theory operators
55
- DECART: 287,
56
- SET_UNION: 288,
57
- SET_INTERSECTION: 289,
58
- SET_MINUS: 290,
59
- SET_SYMMETRIC_MINUS: 291,
60
- BOOLEAN: 292,
61
- // Structure operations
62
- BIGPR: 293,
63
- SMALLPR: 294,
64
- FILTER: 295,
65
- CARD: 296,
66
- BOOL: 297,
67
- DEBOOL: 298,
68
- REDUCE: 299,
69
- // Term constructions prefixes
70
- DECLARATIVE: 300,
71
- RECURSIVE: 301,
72
- IMPERATIVE: 302,
73
- ITERATE: 303,
74
- ASSIGN: 304,
75
- // Punctuation
76
- PUNCTUATION_DEFINE: 305,
77
- PUNCTUATION_STRUCT: 306,
78
- PUNCTUATION_PL: 307,
79
- PUNCTUATION_PR: 308,
80
- PUNCTUATION_CL: 309,
81
- PUNCTUATION_CR: 310,
82
- PUNCTUATION_SL: 311,
83
- PUNCTUATION_SR: 312,
84
- PUNCTUATION_BAR: 313,
85
- PUNCTUATION_COMMA: 314,
86
- PUNCTUATION_SEMICOLON: 315,
87
- // ======= Non-terminal tokens =========
88
- NT_ENUM_DECL: 316,
89
- NT_TUPLE: 317,
90
- NT_ENUMERATION: 318,
91
- NT_TUPLE_DECL: 319,
92
- NT_ARG_DECL: 320,
93
- NT_FUNC_DEFINITION: 321,
94
- NT_ARGUMENTS: 322,
95
- NT_FUNC_CALL: 323,
96
- NT_DECLARATIVE_EXPR: 324,
97
- NT_IMPERATIVE_EXPR: 325,
98
- NT_RECURSIVE_FULL: 326,
99
- NT_RECURSIVE_SHORT: 327,
100
- // ======= Helper tokens ========
101
- INTERRUPT: 328,
102
- END: 329
103
- };
104
-
105
- // src/rslang/parser/expression-generator.ts
1
+ import { getNodeIndices, getNodeText } from "../../parsing/ast.js";
2
+ import "../../parsing/index.js";
3
+ import { TokenID } from "./token.js";
4
+ //#region src/rslang/parser/expression-generator.ts
5
+ /** Generates Math-syntax RS expression from AST, with optional identifier normalization. */
106
6
  function generateExpressionFromAst(ast, options = {}) {
107
- return new ExpressionGenerator(options).run(ast);
7
+ return new ExpressionGenerator(options).run(ast);
108
8
  }
9
+ /** Generates Math-syntax RS expression from AST, with optional identifier normalization. */
109
10
  var ExpressionGenerator = class {
110
- options;
111
- freeLocals = /* @__PURE__ */ new Map();
112
- radicals = /* @__PURE__ */ new Map();
113
- scopes = [];
114
- localCounter = 0;
115
- radicalCounter = 0;
116
- constructor(options) {
117
- this.options = options;
118
- }
119
- /** Run generator. Requires that the AST has no syntax errors. */
120
- run(ast) {
121
- if (ast.hasError) {
122
- throw new Error("Cannot generate expression: AST has error");
123
- }
124
- return this.visit(ast, { localDeclaration: false });
125
- }
126
- visit(node, context) {
127
- const shouldScope = this.shouldStartScope(node.typeID);
128
- if (shouldScope) {
129
- this.startScope();
130
- }
131
- const result = this.renderNode(node, context);
132
- if (shouldScope) {
133
- this.endScope();
134
- }
135
- return result;
136
- }
137
- renderNode(node, context) {
138
- switch (node.typeID) {
139
- case TokenID.ID_LOCAL: {
140
- const alias = getNodeText(node);
141
- return this.options.normalize ? context.localDeclaration ? this.declareLocal(alias) : this.resolveLocal(alias) : alias;
142
- }
143
- case TokenID.ID_GLOBAL:
144
- case TokenID.ID_FUNCTION:
145
- case TokenID.ID_PREDICATE:
146
- return getNodeText(node);
147
- case TokenID.ID_RADICAL: {
148
- const alias = getNodeText(node);
149
- return this.options.normalize ? this.resolveRadical(alias) : alias;
150
- }
151
- case TokenID.LIT_INTEGER:
152
- return String(node.data.value);
153
- case TokenID.LIT_WHOLE_NUMBERS:
154
- return "Z";
155
- case TokenID.LIT_EMPTYSET:
156
- return "\u2205";
157
- case TokenID.BIGPR:
158
- return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
159
- case TokenID.SMALLPR:
160
- return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
161
- case TokenID.FILTER: {
162
- const args = node.children.slice(0, -1).map((child) => this.visit(child, context)).join(", ");
163
- const body = this.visitChild(node, node.children.length - 1, context);
164
- return `Fi${this.formatIndices(node)}[${args}](${body})`;
165
- }
166
- case TokenID.CARD:
167
- return `card(${this.visitChild(node, 0, context)})`;
168
- case TokenID.BOOL:
169
- return `bool(${this.visitChild(node, 0, context)})`;
170
- case TokenID.DEBOOL:
171
- return `debool(${this.visitChild(node, 0, context)})`;
172
- case TokenID.REDUCE:
173
- return `red(${this.visitChild(node, 0, context)})`;
174
- case TokenID.BOOLEAN:
175
- return this.renderBoolean(node, context);
176
- case TokenID.NT_FUNC_CALL: {
177
- const callee = this.visitChild(node, 0, context);
178
- const args = node.children.slice(1).map((child) => this.visit(child, context)).join(", ");
179
- return `${callee}[${args}]`;
180
- }
181
- case TokenID.NT_TUPLE:
182
- return `(${node.children.map((child) => this.visit(child, context)).join(", ")})`;
183
- case TokenID.NT_ENUMERATION:
184
- return `{${node.children.map((child) => this.visit(child, context)).join(", ")}}`;
185
- case TokenID.NT_ARGUMENTS:
186
- case TokenID.NT_ENUM_DECL:
187
- return node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ");
188
- case TokenID.NT_TUPLE_DECL:
189
- return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ")})`;
190
- case TokenID.NT_ARG_DECL:
191
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}\u2208${this.visitChild(node, 1, context)}`;
192
- case TokenID.QUANTOR_UNIVERSAL:
193
- return this.renderQuantifier("\u2200", node, context);
194
- case TokenID.QUANTOR_EXISTS:
195
- return this.renderQuantifier("\u2203", node, context);
196
- case TokenID.NT_DECLARATIVE_EXPR:
197
- return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}\u2208${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
198
- case TokenID.NT_FUNC_DEFINITION:
199
- return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;
200
- case TokenID.ITERATE:
201
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:\u2208${this.visitChild(node, 1, context)}`;
202
- case TokenID.ASSIGN:
203
- return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;
204
- case TokenID.NT_IMPERATIVE_EXPR: {
205
- const statements = node.children.slice(1).map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));
206
- const target = this.visitChild(node, 0, context);
207
- return `I{${target} | ${statements.join("; ")}}`;
208
- }
209
- case TokenID.NT_RECURSIVE_SHORT:
210
- return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
211
- case TokenID.NT_RECURSIVE_FULL:
212
- 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)}}`;
213
- case TokenID.PLUS:
214
- return this.renderInfix("+", node, context);
215
- case TokenID.MINUS:
216
- return this.renderInfix("-", node, context);
217
- case TokenID.MULTIPLY:
218
- return this.renderInfix("*", node, context);
219
- case TokenID.GREATER:
220
- return this.renderInfix(">", node, context);
221
- case TokenID.LESSER:
222
- return this.renderInfix("<", node, context);
223
- case TokenID.GREATER_OR_EQ:
224
- return this.renderInfix("\u2265", node, context);
225
- case TokenID.LESSER_OR_EQ:
226
- return this.renderInfix("\u2264", node, context);
227
- case TokenID.EQUAL:
228
- return this.renderInfix("=", node, context);
229
- case TokenID.NOTEQUAL:
230
- return this.renderInfix("\u2260", node, context);
231
- case TokenID.LOGIC_AND:
232
- return this.renderInfix("&", node, context);
233
- case TokenID.LOGIC_OR:
234
- return this.renderInfix("\u2228", node, context);
235
- case TokenID.LOGIC_IMPLICATION:
236
- return this.renderInfix("\u21D2", node, context);
237
- case TokenID.LOGIC_EQUIVALENT:
238
- return this.renderInfix("\u21D4", node, context);
239
- case TokenID.SET_IN:
240
- return this.renderInfix("\u2208", node, context);
241
- case TokenID.SET_NOT_IN:
242
- return this.renderInfix("\u2209", node, context);
243
- case TokenID.SUBSET:
244
- return this.renderInfix("\u2282", node, context);
245
- case TokenID.SUBSET_OR_EQ:
246
- return this.renderInfix("\u2286", node, context);
247
- case TokenID.NOT_SUBSET:
248
- return this.renderInfix("\u2284", node, context);
249
- case TokenID.DECART:
250
- return this.renderInfix("\xD7", node, context);
251
- case TokenID.SET_UNION:
252
- return this.renderInfix("\u222A", node, context);
253
- case TokenID.SET_INTERSECTION:
254
- return this.renderInfix("\u2229", node, context);
255
- case TokenID.SET_MINUS:
256
- return this.renderInfix("\\", node, context);
257
- case TokenID.SET_SYMMETRIC_MINUS:
258
- return this.renderInfix("\u2206", node, context);
259
- case TokenID.LOGIC_NOT:
260
- return `\xAC${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;
261
- default:
262
- return node.children.map((child) => this.visit(child, context)).join("");
263
- }
264
- }
265
- visitChild(node, index, context) {
266
- const child = node.children[index];
267
- if (!child) {
268
- return "";
269
- }
270
- return this.visit(child, this.childContext(node.typeID, index, context));
271
- }
272
- renderQuantifier(symbol, node, context) {
273
- const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));
274
- const domain = this.visitChild(node, 1, context);
275
- const bodyNode = node.children[2];
276
- const bodyText = this.visitChild(node, 2, context);
277
- const body = bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText;
278
- return `${symbol}${declaration}\u2208${domain} ${body}`;
279
- }
280
- shouldWrapQuantifierBody(node) {
281
- const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);
282
- const bodyPrecedence = this.getPrecedence(node.typeID);
283
- if (quantifierPrecedence === null || bodyPrecedence === null) {
284
- return false;
285
- }
286
- return bodyPrecedence < quantifierPrecedence;
287
- }
288
- renderInfix(symbol, node, context) {
289
- if (this.isLogicBinary(node.typeID)) {
290
- const parts2 = node.children.map((child, index) => {
291
- const text = this.visit(child, context);
292
- return this.needParen(node, child, index) ? `(${text})` : text;
293
- });
294
- return parts2.join(` ${symbol} `);
295
- }
296
- const parts = node.children.map((child) => this.wrapIfNeeded(this.visit(child, context), child));
297
- return parts.join(symbol);
298
- }
299
- needParen(parent, child, childIndex) {
300
- if (this.isAtomic(child.typeID)) {
301
- return false;
302
- }
303
- const parentPrecedence = this.getPrecedence(parent.typeID);
304
- const childPrecedence = this.getPrecedence(child.typeID);
305
- if (parentPrecedence === null || childPrecedence === null) {
306
- return true;
307
- }
308
- if (childPrecedence > parentPrecedence) {
309
- return false;
310
- }
311
- if (childPrecedence < parentPrecedence) {
312
- return true;
313
- }
314
- if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) {
315
- return false;
316
- }
317
- if (this.isLeftAssociative(parent.typeID)) {
318
- return childIndex > 0;
319
- }
320
- return true;
321
- }
322
- getPrecedence(typeID) {
323
- switch (typeID) {
324
- case TokenID.LOGIC_EQUIVALENT:
325
- return 1;
326
- case TokenID.LOGIC_IMPLICATION:
327
- return 2;
328
- case TokenID.LOGIC_OR:
329
- return 3;
330
- case TokenID.LOGIC_AND:
331
- return 4;
332
- case TokenID.QUANTOR_UNIVERSAL:
333
- case TokenID.QUANTOR_EXISTS:
334
- return 5;
335
- case TokenID.EQUAL:
336
- case TokenID.NOTEQUAL:
337
- case TokenID.GREATER:
338
- case TokenID.LESSER:
339
- case TokenID.GREATER_OR_EQ:
340
- case TokenID.LESSER_OR_EQ:
341
- case TokenID.SET_IN:
342
- case TokenID.SET_NOT_IN:
343
- case TokenID.SUBSET:
344
- case TokenID.SUBSET_OR_EQ:
345
- case TokenID.NOT_SUBSET:
346
- return 6;
347
- case TokenID.PLUS:
348
- case TokenID.MINUS:
349
- case TokenID.SET_UNION:
350
- case TokenID.SET_SYMMETRIC_MINUS:
351
- return 7;
352
- case TokenID.MULTIPLY:
353
- case TokenID.DECART:
354
- case TokenID.SET_INTERSECTION:
355
- case TokenID.SET_MINUS:
356
- return 8;
357
- default:
358
- return null;
359
- }
360
- }
361
- isAssociative(typeID) {
362
- 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;
363
- }
364
- isLeftAssociative(typeID) {
365
- return typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.MINUS || typeID === TokenID.SET_MINUS || typeID === TokenID.SET_SYMMETRIC_MINUS;
366
- }
367
- renderBoolean(node, context) {
368
- let current = node;
369
- let depth = 0;
370
- while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {
371
- depth += 1;
372
- current = current.children[0];
373
- }
374
- return `${"\u212C".repeat(depth)}(${this.visit(current, context)})`;
375
- }
376
- wrapIfNeeded(text, node) {
377
- if (this.isAtomic(node.typeID)) {
378
- return text;
379
- }
380
- return `(${text})`;
381
- }
382
- isAtomic(typeID) {
383
- 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;
384
- }
385
- isLogicBinary(typeID) {
386
- return typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.LOGIC_EQUIVALENT;
387
- }
388
- formatIndices(node) {
389
- return getNodeIndices(node).join(",");
390
- }
391
- shouldStartScope(typeID) {
392
- 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;
393
- }
394
- childContext(typeID, index, parent) {
395
- if (!this.options.normalize) {
396
- return parent;
397
- }
398
- 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;
399
- return { localDeclaration: isDeclaration };
400
- }
401
- declareLocal(alias) {
402
- const scope = this.currentScope();
403
- const local = this.nextLocal();
404
- scope.set(alias, local);
405
- return local;
406
- }
407
- resolveLocal(alias) {
408
- for (let index = this.scopes.length - 1; index >= 0; index -= 1) {
409
- const local2 = this.scopes[index].get(alias);
410
- if (local2) {
411
- return local2;
412
- }
413
- }
414
- let local = this.freeLocals.get(alias);
415
- if (!local) {
416
- local = this.nextLocal();
417
- this.freeLocals.set(alias, local);
418
- }
419
- return local;
420
- }
421
- resolveRadical(alias) {
422
- let radical = this.radicals.get(alias);
423
- if (!radical) {
424
- this.radicalCounter += 1;
425
- radical = `R${this.radicalCounter}`;
426
- this.radicals.set(alias, radical);
427
- }
428
- return radical;
429
- }
430
- startScope() {
431
- this.scopes.push(/* @__PURE__ */ new Map());
432
- }
433
- endScope() {
434
- this.scopes.pop();
435
- }
436
- currentScope() {
437
- const scope = this.scopes.at(-1);
438
- if (!scope) {
439
- throw new Error("Attempted to declare local outside of scope");
440
- }
441
- return scope;
442
- }
443
- nextLocal() {
444
- this.localCounter += 1;
445
- return `a${this.localCounter}`;
446
- }
447
- };
448
- export {
449
- generateExpressionFromAst
11
+ options;
12
+ freeLocals = /* @__PURE__ */ new Map();
13
+ radicals = /* @__PURE__ */ new Map();
14
+ scopes = [];
15
+ localCounter = 0;
16
+ radicalCounter = 0;
17
+ constructor(options) {
18
+ this.options = options;
19
+ }
20
+ /** Run generator. Requires that the AST has no syntax errors. */
21
+ run(ast) {
22
+ if (ast.hasError) throw new Error("Cannot generate expression: AST has error");
23
+ return this.visit(ast, { localDeclaration: false });
24
+ }
25
+ visit(node, context) {
26
+ const shouldScope = this.shouldStartScope(node.typeID);
27
+ if (shouldScope) this.startScope();
28
+ const result = this.renderNode(node, context);
29
+ if (shouldScope) this.endScope();
30
+ return result;
31
+ }
32
+ renderNode(node, context) {
33
+ switch (node.typeID) {
34
+ case TokenID.ID_LOCAL: {
35
+ const alias = getNodeText(node);
36
+ return this.options.normalize ? context.localDeclaration ? this.declareLocal(alias) : this.resolveLocal(alias) : alias;
37
+ }
38
+ case TokenID.ID_GLOBAL:
39
+ case TokenID.ID_FUNCTION:
40
+ case TokenID.ID_PREDICATE: return getNodeText(node);
41
+ case TokenID.ID_RADICAL: {
42
+ const alias = getNodeText(node);
43
+ return this.options.normalize ? this.resolveRadical(alias) : alias;
44
+ }
45
+ case TokenID.LIT_INTEGER: return String(node.data.value);
46
+ case TokenID.LIT_WHOLE_NUMBERS: return "Z";
47
+ case TokenID.LIT_EMPTYSET: return "∅";
48
+ case TokenID.BIGPR: return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
49
+ case TokenID.SMALLPR: return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;
50
+ case TokenID.FILTER: {
51
+ const args = node.children.slice(0, -1).map((child) => this.visit(child, context)).join(", ");
52
+ const body = this.visitChild(node, node.children.length - 1, context);
53
+ return `Fi${this.formatIndices(node)}[${args}](${body})`;
54
+ }
55
+ case TokenID.CARD: return `card(${this.visitChild(node, 0, context)})`;
56
+ case TokenID.BOOL: return `bool(${this.visitChild(node, 0, context)})`;
57
+ case TokenID.DEBOOL: return `debool(${this.visitChild(node, 0, context)})`;
58
+ case TokenID.REDUCE: return `red(${this.visitChild(node, 0, context)})`;
59
+ case TokenID.BOOLEAN: return this.renderBoolean(node, context);
60
+ case TokenID.NT_FUNC_CALL: return `${this.visitChild(node, 0, context)}[${node.children.slice(1).map((child) => this.visit(child, context)).join(", ")}]`;
61
+ case TokenID.NT_TUPLE: return `(${node.children.map((child) => this.visit(child, context)).join(", ")})`;
62
+ case TokenID.NT_ENUMERATION: return `{${node.children.map((child) => this.visit(child, context)).join(", ")}}`;
63
+ case TokenID.NT_ARGUMENTS:
64
+ case TokenID.NT_ENUM_DECL: return node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ");
65
+ case TokenID.NT_TUPLE_DECL: return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(", ")})`;
66
+ case TokenID.NT_ARG_DECL: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)}`;
67
+ case TokenID.QUANTOR_UNIVERSAL: return this.renderQuantifier("∀", node, context);
68
+ case TokenID.QUANTOR_EXISTS: return this.renderQuantifier("∃", node, context);
69
+ case TokenID.NT_DECLARATIVE_EXPR: return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
70
+ case TokenID.NT_FUNC_DEFINITION: return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;
71
+ case TokenID.ITERATE: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:∈${this.visitChild(node, 1, context)}`;
72
+ case TokenID.ASSIGN: return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;
73
+ case TokenID.NT_IMPERATIVE_EXPR: {
74
+ const statements = node.children.slice(1).map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));
75
+ return `I{${this.visitChild(node, 0, context)} | ${statements.join("; ")}}`;
76
+ }
77
+ case TokenID.NT_RECURSIVE_SHORT: return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;
78
+ case TokenID.NT_RECURSIVE_FULL: 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)}}`;
79
+ case TokenID.PLUS: return this.renderInfix("+", node, context);
80
+ case TokenID.MINUS: return this.renderInfix("-", node, context);
81
+ case TokenID.MULTIPLY: return this.renderInfix("*", node, context);
82
+ case TokenID.GREATER: return this.renderInfix(">", node, context);
83
+ case TokenID.LESSER: return this.renderInfix("<", node, context);
84
+ case TokenID.GREATER_OR_EQ: return this.renderInfix("≥", node, context);
85
+ case TokenID.LESSER_OR_EQ: return this.renderInfix("≤", node, context);
86
+ case TokenID.EQUAL: return this.renderInfix("=", node, context);
87
+ case TokenID.NOTEQUAL: return this.renderInfix("≠", node, context);
88
+ case TokenID.LOGIC_AND: return this.renderInfix("&", node, context);
89
+ case TokenID.LOGIC_OR: return this.renderInfix("∨", node, context);
90
+ case TokenID.LOGIC_IMPLICATION: return this.renderInfix("⇒", node, context);
91
+ case TokenID.LOGIC_EQUIVALENT: return this.renderInfix("⇔", node, context);
92
+ case TokenID.SET_IN: return this.renderInfix("∈", node, context);
93
+ case TokenID.SET_NOT_IN: return this.renderInfix("∉", node, context);
94
+ case TokenID.SUBSET: return this.renderInfix("", node, context);
95
+ case TokenID.SUBSET_OR_EQ: return this.renderInfix("⊆", node, context);
96
+ case TokenID.NOT_SUBSET: return this.renderInfix("", node, context);
97
+ case TokenID.DECART: return this.renderInfix("×", node, context);
98
+ case TokenID.SET_UNION: return this.renderInfix("∪", node, context);
99
+ case TokenID.SET_INTERSECTION: return this.renderInfix("∩", node, context);
100
+ case TokenID.SET_MINUS: return this.renderInfix("\\", node, context);
101
+ case TokenID.SET_SYMMETRIC_MINUS: return this.renderInfix("∆", node, context);
102
+ case TokenID.LOGIC_NOT: return `¬${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;
103
+ default: return node.children.map((child) => this.visit(child, context)).join("");
104
+ }
105
+ }
106
+ visitChild(node, index, context) {
107
+ const child = node.children[index];
108
+ if (!child) return "";
109
+ return this.visit(child, this.childContext(node.typeID, index, context));
110
+ }
111
+ renderQuantifier(symbol, node, context) {
112
+ const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));
113
+ const domain = this.visitChild(node, 1, context);
114
+ const bodyNode = node.children[2];
115
+ const bodyText = this.visitChild(node, 2, context);
116
+ return `${symbol}${declaration}∈${domain} ${bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText}`;
117
+ }
118
+ shouldWrapQuantifierBody(node) {
119
+ const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);
120
+ const bodyPrecedence = this.getPrecedence(node.typeID);
121
+ if (quantifierPrecedence === null || bodyPrecedence === null) return false;
122
+ return bodyPrecedence < quantifierPrecedence;
123
+ }
124
+ renderInfix(symbol, node, context) {
125
+ if (this.isLogicBinary(node.typeID)) return node.children.map((child, index) => {
126
+ const text = this.visit(child, context);
127
+ return this.needParen(node, child, index) ? `(${text})` : text;
128
+ }).join(` ${symbol} `);
129
+ return node.children.map((child) => this.wrapIfNeeded(this.visit(child, context), child)).join(symbol);
130
+ }
131
+ needParen(parent, child, childIndex) {
132
+ if (this.isAtomic(child.typeID)) return false;
133
+ const parentPrecedence = this.getPrecedence(parent.typeID);
134
+ const childPrecedence = this.getPrecedence(child.typeID);
135
+ if (parentPrecedence === null || childPrecedence === null) return true;
136
+ if (childPrecedence > parentPrecedence) return false;
137
+ if (childPrecedence < parentPrecedence) return true;
138
+ if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) return false;
139
+ if (this.isLeftAssociative(parent.typeID)) return childIndex > 0;
140
+ return true;
141
+ }
142
+ getPrecedence(typeID) {
143
+ switch (typeID) {
144
+ case TokenID.LOGIC_EQUIVALENT: return 1;
145
+ case TokenID.LOGIC_IMPLICATION: return 2;
146
+ case TokenID.LOGIC_OR: return 3;
147
+ case TokenID.LOGIC_AND: return 4;
148
+ case TokenID.QUANTOR_UNIVERSAL:
149
+ case TokenID.QUANTOR_EXISTS: return 5;
150
+ case TokenID.EQUAL:
151
+ case TokenID.NOTEQUAL:
152
+ case TokenID.GREATER:
153
+ case TokenID.LESSER:
154
+ case TokenID.GREATER_OR_EQ:
155
+ case TokenID.LESSER_OR_EQ:
156
+ case TokenID.SET_IN:
157
+ case TokenID.SET_NOT_IN:
158
+ case TokenID.SUBSET:
159
+ case TokenID.SUBSET_OR_EQ:
160
+ case TokenID.NOT_SUBSET: return 6;
161
+ case TokenID.PLUS:
162
+ case TokenID.MINUS:
163
+ case TokenID.SET_UNION:
164
+ case TokenID.SET_SYMMETRIC_MINUS: return 7;
165
+ case TokenID.MULTIPLY:
166
+ case TokenID.DECART:
167
+ case TokenID.SET_INTERSECTION:
168
+ case TokenID.SET_MINUS: return 8;
169
+ default: return null;
170
+ }
171
+ }
172
+ isAssociative(typeID) {
173
+ 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;
174
+ }
175
+ isLeftAssociative(typeID) {
176
+ return typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.MINUS || typeID === TokenID.SET_MINUS || typeID === TokenID.SET_SYMMETRIC_MINUS;
177
+ }
178
+ renderBoolean(node, context) {
179
+ let current = node;
180
+ let depth = 0;
181
+ while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {
182
+ depth += 1;
183
+ current = current.children[0];
184
+ }
185
+ return `${"ℬ".repeat(depth)}(${this.visit(current, context)})`;
186
+ }
187
+ wrapIfNeeded(text, node) {
188
+ if (this.isAtomic(node.typeID)) return text;
189
+ return `(${text})`;
190
+ }
191
+ isAtomic(typeID) {
192
+ 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;
193
+ }
194
+ isLogicBinary(typeID) {
195
+ return typeID === TokenID.LOGIC_AND || typeID === TokenID.LOGIC_OR || typeID === TokenID.LOGIC_IMPLICATION || typeID === TokenID.LOGIC_EQUIVALENT;
196
+ }
197
+ formatIndices(node) {
198
+ return getNodeIndices(node).join(",");
199
+ }
200
+ shouldStartScope(typeID) {
201
+ 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;
202
+ }
203
+ childContext(typeID, index, parent) {
204
+ if (!this.options.normalize) return parent;
205
+ return { localDeclaration: (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 };
206
+ }
207
+ declareLocal(alias) {
208
+ const scope = this.currentScope();
209
+ const local = this.nextLocal();
210
+ scope.set(alias, local);
211
+ return local;
212
+ }
213
+ resolveLocal(alias) {
214
+ for (let index = this.scopes.length - 1; index >= 0; index -= 1) {
215
+ const local = this.scopes[index].get(alias);
216
+ if (local) return local;
217
+ }
218
+ let local = this.freeLocals.get(alias);
219
+ if (!local) {
220
+ local = this.nextLocal();
221
+ this.freeLocals.set(alias, local);
222
+ }
223
+ return local;
224
+ }
225
+ resolveRadical(alias) {
226
+ let radical = this.radicals.get(alias);
227
+ if (!radical) {
228
+ this.radicalCounter += 1;
229
+ radical = `R${this.radicalCounter}`;
230
+ this.radicals.set(alias, radical);
231
+ }
232
+ return radical;
233
+ }
234
+ startScope() {
235
+ this.scopes.push(/* @__PURE__ */ new Map());
236
+ }
237
+ endScope() {
238
+ this.scopes.pop();
239
+ }
240
+ currentScope() {
241
+ const scope = this.scopes.at(-1);
242
+ if (!scope) throw new Error("Attempted to declare local outside of scope");
243
+ return scope;
244
+ }
245
+ nextLocal() {
246
+ this.localCounter += 1;
247
+ return `a${this.localCounter}`;
248
+ }
450
249
  };
250
+ //#endregion
251
+ export { generateExpressionFromAst };
252
+
451
253
  //# sourceMappingURL=expression-generator.js.map