@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.
- package/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/cctext/index.d.ts +1 -0
- package/dist/cctext/index.js +42 -0
- package/dist/cctext/index.js.map +1 -0
- package/dist/cctext/language-api.d.ts +43 -0
- package/dist/cctext/language-api.js +252 -0
- package/dist/cctext/language-api.js.map +1 -0
- package/dist/cctext/language.d.ts +58 -0
- package/dist/cctext/language.js +44 -0
- package/dist/cctext/language.js.map +1 -0
- package/dist/graph/graph.d.ts +62 -0
- package/dist/graph/graph.js +385 -0
- package/dist/graph/graph.js.map +1 -0
- package/dist/graph/index.d.ts +1 -0
- package/dist/graph/index.js +384 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +5851 -0
- package/dist/index.js.map +1 -0
- package/dist/library/folder-tree.d.ts +32 -0
- package/dist/library/folder-tree.js +136 -0
- package/dist/library/folder-tree.js.map +1 -0
- package/dist/library/index.d.ts +17 -0
- package/dist/library/index.js +2800 -0
- package/dist/library/index.js.map +1 -0
- package/dist/library/library-api.d.ts +6 -0
- package/dist/library/library-api.js +13 -0
- package/dist/library/library-api.js.map +1 -0
- package/dist/library/library.d.ts +56 -0
- package/dist/library/library.js +23 -0
- package/dist/library/library.js.map +1 -0
- package/dist/library/oss-api.d.ts +47 -0
- package/dist/library/oss-api.js +1105 -0
- package/dist/library/oss-api.js.map +1 -0
- package/dist/library/oss-layout-api.d.ts +36 -0
- package/dist/library/oss-layout-api.js +330 -0
- package/dist/library/oss-layout-api.js.map +1 -0
- package/dist/library/oss-layout.d.ts +25 -0
- package/dist/library/oss-layout.js +1 -0
- package/dist/library/oss-layout.js.map +1 -0
- package/dist/library/oss.d.ts +136 -0
- package/dist/library/oss.js +30 -0
- package/dist/library/oss.js.map +1 -0
- package/dist/library/rsengine.d.ts +116 -0
- package/dist/library/rsengine.js +2604 -0
- package/dist/library/rsengine.js.map +1 -0
- package/dist/library/rsform-api.d.ts +74 -0
- package/dist/library/rsform-api.js +879 -0
- package/dist/library/rsform-api.js.map +1 -0
- package/dist/library/rsform.d.ts +206 -0
- package/dist/library/rsform.js +32 -0
- package/dist/library/rsform.js.map +1 -0
- package/dist/library/rsmodel-api.d.ts +43 -0
- package/dist/library/rsmodel-api.js +836 -0
- package/dist/library/rsmodel-api.js.map +1 -0
- package/dist/library/rsmodel.d.ts +52 -0
- package/dist/library/rsmodel.js +25 -0
- package/dist/library/rsmodel.js.map +1 -0
- package/dist/library/structure-planner.d.ts +33 -0
- package/dist/library/structure-planner.js +481 -0
- package/dist/library/structure-planner.js.map +1 -0
- package/dist/parsing/ast.d.ts +49 -0
- package/dist/parsing/ast.js +93 -0
- package/dist/parsing/ast.js.map +1 -0
- package/dist/parsing/index.d.ts +3 -0
- package/dist/parsing/index.js +141 -0
- package/dist/parsing/index.js.map +1 -0
- package/dist/parsing/lezer-tree.d.ts +13 -0
- package/dist/parsing/lezer-tree.js +50 -0
- package/dist/parsing/lezer-tree.js.map +1 -0
- package/dist/rslang/api.d.ts +53 -0
- package/dist/rslang/api.js +846 -0
- package/dist/rslang/api.js.map +1 -0
- package/dist/rslang/ast-annotations.d.ts +18 -0
- package/dist/rslang/ast-annotations.js +56 -0
- package/dist/rslang/ast-annotations.js.map +1 -0
- package/dist/rslang/error.d.ts +85 -0
- package/dist/rslang/error.js +159 -0
- package/dist/rslang/error.js.map +1 -0
- package/dist/rslang/eval/calculator.d.ts +43 -0
- package/dist/rslang/eval/calculator.js +1639 -0
- package/dist/rslang/eval/calculator.js.map +1 -0
- package/dist/rslang/eval/evaluation-cache.d.ts +36 -0
- package/dist/rslang/eval/evaluation-cache.js +310 -0
- package/dist/rslang/eval/evaluation-cache.js.map +1 -0
- package/dist/rslang/eval/evaluator.d.ts +70 -0
- package/dist/rslang/eval/evaluator.js +1514 -0
- package/dist/rslang/eval/evaluator.js.map +1 -0
- package/dist/rslang/eval/value-api.d.ts +48 -0
- package/dist/rslang/eval/value-api.js +490 -0
- package/dist/rslang/eval/value-api.js.map +1 -0
- package/dist/rslang/eval/value.d.ts +36 -0
- package/dist/rslang/eval/value.js +118 -0
- package/dist/rslang/eval/value.js.map +1 -0
- package/dist/rslang/index.d.ts +17 -0
- package/dist/rslang/index.js +4314 -0
- package/dist/rslang/index.js.map +1 -0
- package/dist/rslang/labels.d.ts +16 -0
- package/dist/rslang/labels.js +315 -0
- package/dist/rslang/labels.js.map +1 -0
- package/dist/rslang/parser/expression-generator.d.ts +10 -0
- package/dist/rslang/parser/expression-generator.js +451 -0
- package/dist/rslang/parser/expression-generator.js.map +1 -0
- package/dist/rslang/parser/normalize.d.ts +11 -0
- package/dist/rslang/parser/normalize.js +507 -0
- package/dist/rslang/parser/normalize.js.map +1 -0
- package/dist/rslang/parser/parser.d.ts +5 -0
- package/dist/rslang/parser/parser.js +24 -0
- package/dist/rslang/parser/parser.js.map +1 -0
- package/dist/rslang/parser/parser.terms.d.ts +42 -0
- package/dist/rslang/parser/parser.terms.js +84 -0
- package/dist/rslang/parser/parser.terms.js.map +1 -0
- package/dist/rslang/parser/syntax-errors.d.ts +11 -0
- package/dist/rslang/parser/syntax-errors.js +403 -0
- package/dist/rslang/parser/syntax-errors.js.map +1 -0
- package/dist/rslang/parser/token.d.ts +79 -0
- package/dist/rslang/parser/token.js +95 -0
- package/dist/rslang/parser/token.js.map +1 -0
- package/dist/rslang/semantic/analyzer.d.ts +39 -0
- package/dist/rslang/semantic/analyzer.js +2604 -0
- package/dist/rslang/semantic/analyzer.js.map +1 -0
- package/dist/rslang/semantic/arguments-extractor.d.ts +42 -0
- package/dist/rslang/semantic/arguments-extractor.js +366 -0
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -0
- package/dist/rslang/semantic/type-auditor.d.ts +73 -0
- package/dist/rslang/semantic/type-auditor.js +1570 -0
- package/dist/rslang/semantic/type-auditor.js.map +1 -0
- package/dist/rslang/semantic/typification-api.d.ts +27 -0
- package/dist/rslang/semantic/typification-api.js +320 -0
- package/dist/rslang/semantic/typification-api.js.map +1 -0
- package/dist/rslang/semantic/typification-parser.d.ts +12 -0
- package/dist/rslang/semantic/typification-parser.js +226 -0
- package/dist/rslang/semantic/typification-parser.js.map +1 -0
- package/dist/rslang/semantic/typification.d.ts +119 -0
- package/dist/rslang/semantic/typification.js +74 -0
- package/dist/rslang/semantic/typification.js.map +1 -0
- package/dist/rslang/semantic/value-auditor.d.ts +43 -0
- package/dist/rslang/semantic/value-auditor.js +523 -0
- package/dist/rslang/semantic/value-auditor.js.map +1 -0
- package/dist/rslang/semantic/value-class.d.ts +10 -0
- package/dist/rslang/semantic/value-class.js +9 -0
- package/dist/rslang/semantic/value-class.js.map +1 -0
- package/dist/rslang/typification-graph.d.ts +33 -0
- package/dist/rslang/typification-graph.js +311 -0
- package/dist/rslang/typification-graph.js.map +1 -0
- package/dist/shared/branded.d.ts +7 -0
- package/dist/shared/branded.js +1 -0
- package/dist/shared/branded.js.map +1 -0
- package/dist/shared/hash.d.ts +6 -0
- package/dist/shared/hash.js +18 -0
- package/dist/shared/hash.js.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.js +18 -0
- package/dist/shared/index.js.map +1 -0
- package/package.json +184 -0
- package/src/cctext/index.ts +9 -0
- package/src/cctext/language-api.test.ts +149 -0
- package/src/cctext/language-api.ts +285 -0
- package/src/cctext/language.ts +80 -0
- package/src/graph/graph.test.ts +392 -0
- package/src/graph/graph.ts +433 -0
- package/src/graph/index.ts +1 -0
- package/src/index.ts +96 -0
- package/src/library/folder-tree.test.ts +47 -0
- package/src/library/folder-tree.ts +156 -0
- package/src/library/index.ts +46 -0
- package/src/library/library-api.test.ts +32 -0
- package/src/library/library-api.ts +11 -0
- package/src/library/library.ts +61 -0
- package/src/library/oss-api.ts +449 -0
- package/src/library/oss-layout-api.ts +377 -0
- package/src/library/oss-layout.ts +27 -0
- package/src/library/oss.ts +150 -0
- package/src/library/rsengine.ts +593 -0
- package/src/library/rsform-api.ts +533 -0
- package/src/library/rsform.ts +228 -0
- package/src/library/rsmodel-api.ts +340 -0
- package/src/library/rsmodel.ts +50 -0
- package/src/library/structure-planner.ts +143 -0
- package/src/parsing/ast.ts +136 -0
- package/src/parsing/index.ts +15 -0
- package/src/parsing/lezer-tree.ts +69 -0
- package/src/rslang/api.test.ts +116 -0
- package/src/rslang/api.ts +183 -0
- package/src/rslang/ast-annotations.ts +70 -0
- package/src/rslang/error.ts +129 -0
- package/src/rslang/eval/calculator.test.ts +124 -0
- package/src/rslang/eval/calculator.ts +121 -0
- package/src/rslang/eval/evaluation-cache.ts +257 -0
- package/src/rslang/eval/evaluator.test.ts +352 -0
- package/src/rslang/eval/evaluator.ts +935 -0
- package/src/rslang/eval/value-api.test.ts +105 -0
- package/src/rslang/eval/value-api.ts +444 -0
- package/src/rslang/eval/value.ts +102 -0
- package/src/rslang/index.ts +23 -0
- package/src/rslang/labels.ts +191 -0
- package/src/rslang/parser/expression-generator.test.ts +100 -0
- package/src/rslang/parser/expression-generator.ts +466 -0
- package/src/rslang/parser/normalize.test.ts +99 -0
- package/src/rslang/parser/normalize.ts +462 -0
- package/src/rslang/parser/parser.terms.ts +42 -0
- package/src/rslang/parser/parser.test.ts +153 -0
- package/src/rslang/parser/parser.ts +20 -0
- package/src/rslang/parser/rslang.grammar +251 -0
- package/src/rslang/parser/syntax-errors.ts +209 -0
- package/src/rslang/parser/token.ts +106 -0
- package/src/rslang/semantic/analyzer.test.ts +59 -0
- package/src/rslang/semantic/analyzer.ts +179 -0
- package/src/rslang/semantic/arguments-extractor.ts +327 -0
- package/src/rslang/semantic/type-auditor.test.ts +326 -0
- package/src/rslang/semantic/type-auditor.ts +1049 -0
- package/src/rslang/semantic/typification-api.test.ts +46 -0
- package/src/rslang/semantic/typification-api.ts +321 -0
- package/src/rslang/semantic/typification-parser.test.ts +50 -0
- package/src/rslang/semantic/typification-parser.ts +220 -0
- package/src/rslang/semantic/typification.ts +180 -0
- package/src/rslang/semantic/value-auditor.test.ts +206 -0
- package/src/rslang/semantic/value-auditor.ts +332 -0
- package/src/rslang/semantic/value-class.ts +11 -0
- package/src/rslang/typification-graph.ts +155 -0
- package/src/shared/branded.ts +6 -0
- package/src/shared/hash.ts +17 -0
- package/src/shared/index.ts +2 -0
|
@@ -0,0 +1,846 @@
|
|
|
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;
|
|
719
|
+
function extractArguments(ast) {
|
|
720
|
+
return new ArgumentsExtractor().run(ast);
|
|
721
|
+
}
|
|
722
|
+
function extractGlobals(expression) {
|
|
723
|
+
return new Set(expression.match(GLOBALS_REGEXP) ?? []);
|
|
724
|
+
}
|
|
725
|
+
function isSimpleExpression(text) {
|
|
726
|
+
return !text.match(COMPLEX_SYMBOLS_REGEXP);
|
|
727
|
+
}
|
|
728
|
+
function isSetTypification(text) {
|
|
729
|
+
return !!text.match(TYPIFICATION_SET);
|
|
730
|
+
}
|
|
731
|
+
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
|
+
};
|
|
754
|
+
}
|
|
755
|
+
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
|
+
}
|
|
768
|
+
}
|
|
769
|
+
function applyAliasMapping(target, mapping) {
|
|
770
|
+
return applyPattern(target, mapping, GLOBALS_REGEXP);
|
|
771
|
+
}
|
|
772
|
+
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;
|
|
815
|
+
}
|
|
816
|
+
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;
|
|
834
|
+
}
|
|
835
|
+
export {
|
|
836
|
+
applyAliasMapping,
|
|
837
|
+
applyTypificationMapping,
|
|
838
|
+
extractArguments,
|
|
839
|
+
extractGlobals,
|
|
840
|
+
generateExpressionFromAst,
|
|
841
|
+
isSetTypification,
|
|
842
|
+
isSimpleExpression,
|
|
843
|
+
splitTemplateDefinition,
|
|
844
|
+
substituteTemplateArgs
|
|
845
|
+
};
|
|
846
|
+
//# sourceMappingURL=api.js.map
|