@rsconcept/domain 1.0.0 → 1.1.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/README.md +3 -3
- package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
- package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
- package/dist/ast-C8sIpKdL.d.ts +51 -0
- package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
- package/dist/branded-ZlzIcxzu.d.ts +9 -0
- package/dist/calculator-C9W2jkSx.d.ts +39 -0
- package/dist/cctext/index.d.ts +2 -1
- package/dist/cctext/index.js +2 -42
- package/dist/cctext/language-api.d.ts +10 -12
- package/dist/cctext/language-api.js +157 -227
- package/dist/cctext/language-api.js.map +1 -1
- package/dist/cctext/language.d.ts +24 -22
- package/dist/cctext/language.js +43 -39
- package/dist/cctext/language.js.map +1 -1
- package/dist/error-E1LVq_3w.d.ts +87 -0
- package/dist/graph/graph.d.ts +2 -62
- package/dist/graph/graph.js +339 -382
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +2 -1
- package/dist/graph/index.js +2 -384
- package/dist/graph-DR8rL2o3.d.ts +64 -0
- package/dist/hash-Y8I4c6Al.d.ts +8 -0
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-DmtQKWjk.d.ts +1 -0
- package/dist/index-_6s0AX1B.d.ts +1 -0
- package/dist/index.d.ts +27 -28
- package/dist/index.js +23 -5851
- package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
- package/dist/library/folder-tree.d.ts +22 -20
- package/dist/library/folder-tree.js +108 -130
- package/dist/library/folder-tree.js.map +1 -1
- package/dist/library/index.d.ts +8 -17
- package/dist/library/index.js +7 -2800
- package/dist/library/library-api.d.ts +3 -1
- package/dist/library/library-api.js +9 -8
- package/dist/library/library-api.js.map +1 -1
- package/dist/library/library.d.ts +2 -56
- package/dist/library/library.js +23 -19
- package/dist/library/library.js.map +1 -1
- package/dist/library/oss-api.d.ts +26 -37
- package/dist/library/oss-api.js +257 -1096
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss-layout-api.d.ts +28 -28
- package/dist/library/oss-layout-api.js +239 -316
- package/dist/library/oss-layout-api.js.map +1 -1
- package/dist/library/oss-layout.d.ts +2 -25
- package/dist/library/oss-layout.js +1 -1
- package/dist/library/oss.d.ts +87 -89
- package/dist/library/oss.js +27 -26
- package/dist/library/oss.js.map +1 -1
- package/dist/library/rsengine.d.ts +100 -106
- package/dist/library/rsengine.js +439 -2599
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api.d.ts +11 -16
- package/dist/library/rsform-api.js +313 -825
- package/dist/library/rsform-api.js.map +1 -1
- package/dist/library/rsform.d.ts +159 -167
- package/dist/library/rsform.js +29 -28
- package/dist/library/rsform.js.map +1 -1
- package/dist/library/rsmodel-api.d.ts +8 -15
- package/dist/library/rsmodel-api.js +172 -813
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/rsmodel.d.ts +27 -33
- package/dist/library/rsmodel.js +16 -23
- package/dist/library/rsmodel.js.map +1 -1
- package/dist/library/structure-planner.d.ts +20 -26
- package/dist/library/structure-planner.js +106 -474
- package/dist/library/structure-planner.js.map +1 -1
- package/dist/library-CYun28Xz.d.ts +58 -0
- package/dist/oss-layout-3glgAqfn.d.ts +27 -0
- package/dist/parser-Bwd8LxJ1.d.ts +7 -0
- package/dist/parsing/ast.d.ts +2 -49
- package/dist/parsing/ast.js +68 -76
- package/dist/parsing/ast.js.map +1 -1
- package/dist/parsing/index.d.ts +3 -3
- package/dist/parsing/index.js +3 -141
- package/dist/parsing/lezer-tree.d.ts +2 -13
- package/dist/parsing/lezer-tree.js +50 -43
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.d.ts +9 -14
- package/dist/rslang/api.js +114 -827
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/ast-annotations.d.ts +2 -18
- package/dist/rslang/ast-annotations.js +34 -45
- package/dist/rslang/ast-annotations.js.map +1 -1
- package/dist/rslang/error.d.ts +2 -85
- package/dist/rslang/error.js +88 -150
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +2 -43
- package/dist/rslang/eval/calculator.js +81 -1636
- package/dist/rslang/eval/calculator.js.map +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
- package/dist/rslang/eval/evaluation-cache.js +168 -287
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.d.ts +59 -63
- package/dist/rslang/eval/evaluator.js +602 -1509
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.d.ts +2 -48
- package/dist/rslang/eval/value-api.js +2 -490
- package/dist/rslang/eval/value.d.ts +2 -36
- package/dist/rslang/eval/value.js +2 -118
- package/dist/rslang/index.d.ts +14 -17
- package/dist/rslang/index.js +12 -4314
- package/dist/rslang/labels.d.ts +6 -6
- package/dist/rslang/labels.js +139 -305
- package/dist/rslang/labels.js.map +1 -1
- package/dist/rslang/parser/expression-generator.d.ts +5 -5
- package/dist/rslang/parser/expression-generator.js +248 -446
- package/dist/rslang/parser/expression-generator.js.map +1 -1
- package/dist/rslang/parser/normalize.d.ts +4 -8
- package/dist/rslang/parser/normalize.js +286 -481
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.d.ts +2 -5
- package/dist/rslang/parser/parser.js +30 -21
- package/dist/rslang/parser/parser.js.map +1 -1
- package/dist/rslang/parser/parser.terms.d.ts +43 -41
- package/dist/rslang/parser/parser.terms.js +44 -83
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/parser/syntax-errors.d.ts +5 -8
- package/dist/rslang/parser/syntax-errors.js +113 -382
- package/dist/rslang/parser/syntax-errors.js.map +1 -1
- package/dist/rslang/parser/token.d.ts +2 -79
- package/dist/rslang/parser/token.js +81 -93
- package/dist/rslang/parser/token.js.map +1 -1
- package/dist/rslang/semantic/analyzer.d.ts +2 -39
- package/dist/rslang/semantic/analyzer.js +186 -2600
- package/dist/rslang/semantic/analyzer.js.map +1 -1
- package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
- package/dist/rslang/semantic/arguments-extractor.js +202 -361
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +64 -68
- package/dist/rslang/semantic/type-auditor.js +594 -1564
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.d.ts +4 -7
- package/dist/rslang/semantic/typification-api.js +162 -303
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.d.ts +2 -12
- package/dist/rslang/semantic/typification-parser.js +165 -219
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/rslang/semantic/typification.d.ts +2 -119
- package/dist/rslang/semantic/typification.js +66 -52
- package/dist/rslang/semantic/typification.js.map +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +32 -38
- package/dist/rslang/semantic/value-auditor.js +206 -518
- package/dist/rslang/semantic/value-auditor.js.map +1 -1
- package/dist/rslang/semantic/value-class.d.ts +2 -10
- package/dist/rslang/semantic/value-class.js +8 -7
- package/dist/rslang/semantic/value-class.js.map +1 -1
- package/dist/rslang/typification-graph.d.ts +2 -33
- package/dist/rslang/typification-graph.js +94 -306
- package/dist/rslang/typification-graph.js.map +1 -1
- package/dist/shared/branded.d.ts +2 -7
- package/dist/shared/branded.js +1 -1
- package/dist/shared/hash.d.ts +2 -6
- package/dist/shared/hash.js +13 -13
- package/dist/shared/hash.js.map +1 -1
- package/dist/shared/index.d.ts +3 -2
- package/dist/shared/index.js +2 -18
- package/dist/token-DeXAmzwr.d.ts +81 -0
- package/dist/typification-Dk-fisgO.d.ts +120 -0
- package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
- package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
- package/dist/value-B8UtCqaK.js +366 -0
- package/dist/value-B8UtCqaK.js.map +1 -0
- package/dist/value-CTjX6825.d.ts +33 -0
- package/dist/value-api-Bw-SgaYY.d.ts +49 -0
- package/dist/value-class-CNI-lqXJ.d.ts +12 -0
- package/package.json +8 -8
- package/src/library/rsform-api.test.ts +24 -0
- package/src/library/rsform-api.ts +12 -4
- package/dist/cctext/index.js.map +0 -1
- package/dist/graph/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/library/index.js.map +0 -1
- package/dist/library/oss-layout.js.map +0 -1
- package/dist/parsing/index.js.map +0 -1
- package/dist/rslang/eval/value-api.js.map +0 -1
- package/dist/rslang/eval/value.js.map +0 -1
- package/dist/rslang/index.js.map +0 -1
- package/dist/shared/branded.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
|
@@ -1,310 +1,191 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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/eval/evaluation-cache.ts
|
|
1
|
+
import { getNodeIndices, getNodeText } from "../../parsing/ast.js";
|
|
2
|
+
import "../../parsing/index.js";
|
|
3
|
+
import { TokenID } from "../parser/token.js";
|
|
4
|
+
//#region src/rslang/eval/evaluation-cache.ts
|
|
5
|
+
/**
|
|
6
|
+
* Module: Dependency metadata and per-run memoization for RSLang evaluation.
|
|
7
|
+
*/
|
|
8
|
+
/** Per-evaluator cache of immutable AST dependency metadata (no runtime values). */
|
|
106
9
|
var EvaluationMetadata = class {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
10
|
+
byNode = /* @__PURE__ */ new WeakMap();
|
|
11
|
+
get(node) {
|
|
12
|
+
let info = this.byNode.get(node);
|
|
13
|
+
if (!info) {
|
|
14
|
+
info = analyzeNode(node, /* @__PURE__ */ new Set());
|
|
15
|
+
this.byNode.set(node, info);
|
|
16
|
+
}
|
|
17
|
+
return info;
|
|
18
|
+
}
|
|
116
19
|
};
|
|
20
|
+
/** Per-run memo of computed values (cleared on each {@link Evaluator.run}). */
|
|
117
21
|
var EvaluationCache = class {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
22
|
+
entries = /* @__PURE__ */ new Map();
|
|
23
|
+
/** Cache hits in the current evaluation run (for tests/diagnostics). */
|
|
24
|
+
hits = 0;
|
|
25
|
+
/** Returns cached value, or `undefined` on miss or stamp mismatch. */
|
|
26
|
+
lookup(structuralKey, stamp) {
|
|
27
|
+
const entry = this.entries.get(structuralKey);
|
|
28
|
+
if (entry?.stamp !== stamp) return;
|
|
29
|
+
this.hits++;
|
|
30
|
+
return entry.value;
|
|
31
|
+
}
|
|
32
|
+
/** Stores one value per structural key (replaces previous stamp). */
|
|
33
|
+
store(structuralKey, stamp, value) {
|
|
34
|
+
this.entries.set(structuralKey, {
|
|
35
|
+
stamp,
|
|
36
|
+
value
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
clear() {
|
|
40
|
+
this.entries.clear();
|
|
41
|
+
this.hits = 0;
|
|
42
|
+
}
|
|
138
43
|
};
|
|
139
44
|
function analyzeNode(node, bound) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
45
|
+
return {
|
|
46
|
+
reads: collectReads(node, bound),
|
|
47
|
+
structuralKey: buildStructuralKey(node),
|
|
48
|
+
cacheable: isCacheableNode(node)
|
|
49
|
+
};
|
|
144
50
|
}
|
|
145
51
|
function isCacheableNode(node) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return !node.hasError;
|
|
168
|
-
}
|
|
52
|
+
switch (node.typeID) {
|
|
53
|
+
case TokenID.ASSIGN:
|
|
54
|
+
case TokenID.ITERATE:
|
|
55
|
+
case TokenID.NT_IMPERATIVE_EXPR:
|
|
56
|
+
case TokenID.NT_DECLARATIVE_EXPR:
|
|
57
|
+
case TokenID.NT_RECURSIVE_FULL:
|
|
58
|
+
case TokenID.NT_RECURSIVE_SHORT:
|
|
59
|
+
case TokenID.QUANTOR_UNIVERSAL:
|
|
60
|
+
case TokenID.QUANTOR_EXISTS:
|
|
61
|
+
case TokenID.LOGIC_AND:
|
|
62
|
+
case TokenID.LOGIC_OR:
|
|
63
|
+
case TokenID.LOGIC_IMPLICATION:
|
|
64
|
+
case TokenID.NT_FUNC_DEFINITION:
|
|
65
|
+
case TokenID.LIT_INTEGER:
|
|
66
|
+
case TokenID.LIT_EMPTYSET:
|
|
67
|
+
case TokenID.LIT_WHOLE_NUMBERS:
|
|
68
|
+
case TokenID.ID_LOCAL:
|
|
69
|
+
case TokenID.ID_RADICAL:
|
|
70
|
+
case TokenID.ID_GLOBAL: return false;
|
|
71
|
+
default: return !node.hasError;
|
|
72
|
+
}
|
|
169
73
|
}
|
|
170
74
|
function buildStructuralKey(node) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(",")})`;
|
|
185
|
-
default:
|
|
186
|
-
return `${node.typeID}(${node.children.map(buildStructuralKey).join(",")})`;
|
|
187
|
-
}
|
|
75
|
+
switch (node.typeID) {
|
|
76
|
+
case TokenID.ID_GLOBAL:
|
|
77
|
+
case TokenID.ID_LOCAL:
|
|
78
|
+
case TokenID.ID_RADICAL:
|
|
79
|
+
case TokenID.LIT_INTEGER:
|
|
80
|
+
case TokenID.LIT_EMPTYSET:
|
|
81
|
+
case TokenID.LIT_WHOLE_NUMBERS: return `${node.typeID}:${nodeTextKey(node)}`;
|
|
82
|
+
case TokenID.NT_FUNC_CALL: return `${node.typeID}:${nodeTextKey(node.children[0])}(${node.children.slice(1).map(buildStructuralKey).join(",")})`;
|
|
83
|
+
case TokenID.BIGPR:
|
|
84
|
+
case TokenID.SMALLPR:
|
|
85
|
+
case TokenID.FILTER: return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(",")})`;
|
|
86
|
+
default: return `${node.typeID}(${node.children.map(buildStructuralKey).join(",")})`;
|
|
87
|
+
}
|
|
188
88
|
}
|
|
189
89
|
function nodeTextKey(node) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
return getNodeText(node);
|
|
90
|
+
if (node.data.dataType === "number") return String(node.data.value);
|
|
91
|
+
return getNodeText(node);
|
|
194
92
|
}
|
|
195
93
|
function indicesKey(node) {
|
|
196
|
-
|
|
94
|
+
return getNodeIndices(node).join(".");
|
|
197
95
|
}
|
|
198
96
|
function collectReads(node, bound) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
97
|
+
const reads = /* @__PURE__ */ new Set();
|
|
98
|
+
collectReadsImpl(node, bound, reads);
|
|
99
|
+
return reads;
|
|
202
100
|
}
|
|
203
101
|
function collectReadsImpl(node, bound, reads) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
case TokenID.LOGIC_AND:
|
|
272
|
-
case TokenID.LOGIC_OR:
|
|
273
|
-
case TokenID.LOGIC_IMPLICATION: {
|
|
274
|
-
collectReadsImpl(node.children[0], bound, reads);
|
|
275
|
-
collectReadsImpl(node.children[1], bound, reads);
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
default:
|
|
279
|
-
for (const child of node.children) {
|
|
280
|
-
collectReadsImpl(child, bound, reads);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
102
|
+
switch (node.typeID) {
|
|
103
|
+
case TokenID.ID_LOCAL:
|
|
104
|
+
case TokenID.ID_RADICAL:
|
|
105
|
+
reads.add(getNodeText(node));
|
|
106
|
+
return;
|
|
107
|
+
case TokenID.QUANTOR_UNIVERSAL:
|
|
108
|
+
case TokenID.QUANTOR_EXISTS: {
|
|
109
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
110
|
+
const innerBound = extendBound(bound, node.children[0]);
|
|
111
|
+
collectReadsImpl(node.children[2], innerBound, reads);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
case TokenID.NT_DECLARATIVE_EXPR: {
|
|
115
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
116
|
+
const innerBound = extendBound(bound, node.children[0]);
|
|
117
|
+
collectReadsImpl(node.children[2], innerBound, reads);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
case TokenID.ITERATE:
|
|
121
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
122
|
+
return;
|
|
123
|
+
case TokenID.ASSIGN:
|
|
124
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
125
|
+
return;
|
|
126
|
+
case TokenID.NT_IMPERATIVE_EXPR: {
|
|
127
|
+
const innerBound = new Set(bound);
|
|
128
|
+
collectReadsImpl(node.children[0], innerBound, reads);
|
|
129
|
+
for (let i = 1; i < node.children.length; i++) {
|
|
130
|
+
const child = node.children[i];
|
|
131
|
+
if (child.typeID === TokenID.ITERATE) {
|
|
132
|
+
extendBoundInPlace(innerBound, child.children[0]);
|
|
133
|
+
collectReadsImpl(child.children[1], innerBound, reads);
|
|
134
|
+
} else if (child.typeID === TokenID.ASSIGN) {
|
|
135
|
+
collectReadsImpl(child.children[1], innerBound, reads);
|
|
136
|
+
extendBoundInPlace(innerBound, child.children[0]);
|
|
137
|
+
} else collectReadsImpl(child, innerBound, reads);
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
case TokenID.NT_RECURSIVE_FULL:
|
|
142
|
+
case TokenID.NT_RECURSIVE_SHORT: {
|
|
143
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
144
|
+
const innerBound = extendBound(bound, node.children[0]);
|
|
145
|
+
if (node.typeID === TokenID.NT_RECURSIVE_FULL) {
|
|
146
|
+
collectReadsImpl(node.children[2], innerBound, reads);
|
|
147
|
+
collectReadsImpl(node.children[3], innerBound, reads);
|
|
148
|
+
} else collectReadsImpl(node.children[2], innerBound, reads);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
case TokenID.NT_FUNC_DEFINITION: {
|
|
152
|
+
const innerBound = extendBound(bound, node.children[0]);
|
|
153
|
+
collectReadsImpl(node.children[1], innerBound, reads);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
case TokenID.NT_FUNC_CALL:
|
|
157
|
+
for (let i = 1; i < node.children.length; i++) collectReadsImpl(node.children[i], bound, reads);
|
|
158
|
+
return;
|
|
159
|
+
case TokenID.LOGIC_AND:
|
|
160
|
+
case TokenID.LOGIC_OR:
|
|
161
|
+
case TokenID.LOGIC_IMPLICATION:
|
|
162
|
+
collectReadsImpl(node.children[0], bound, reads);
|
|
163
|
+
collectReadsImpl(node.children[1], bound, reads);
|
|
164
|
+
return;
|
|
165
|
+
default: for (const child of node.children) collectReadsImpl(child, bound, reads);
|
|
166
|
+
}
|
|
283
167
|
}
|
|
284
168
|
function extendBound(bound, declNode) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
169
|
+
const next = new Set(bound);
|
|
170
|
+
extendBoundInPlace(next, declNode);
|
|
171
|
+
return next;
|
|
288
172
|
}
|
|
289
173
|
function extendBoundInPlace(bound, declNode) {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
174
|
+
switch (declNode.typeID) {
|
|
175
|
+
case TokenID.ID_LOCAL:
|
|
176
|
+
case TokenID.ID_RADICAL:
|
|
177
|
+
bound.add(getNodeText(declNode));
|
|
178
|
+
break;
|
|
179
|
+
case TokenID.NT_TUPLE_DECL:
|
|
180
|
+
case TokenID.NT_ENUM_DECL:
|
|
181
|
+
for (const child of declNode.children) extendBoundInPlace(bound, child);
|
|
182
|
+
break;
|
|
183
|
+
case TokenID.NT_ARG_DECL:
|
|
184
|
+
extendBoundInPlace(bound, declNode.children[0]);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
305
187
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
};
|
|
188
|
+
//#endregion
|
|
189
|
+
export { EvaluationCache, EvaluationMetadata };
|
|
190
|
+
|
|
310
191
|
//# sourceMappingURL=evaluation-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/parsing/ast.ts","../../../src/rslang/parser/token.ts","../../../src/rslang/eval/evaluation-cache.ts"],"sourcesContent":["import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","/**\n * Module: Dependency metadata and per-run memoization for RSLang evaluation.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { TokenID } from '../parser/token';\n\nimport { type Value } from './value';\n\n/** Static metadata for one AST node. */\nexport interface EvalNodeInfo {\n /** Local aliases this expression reads (for dependency stamping). */\n reads: ReadonlySet<string>;\n /** Stable key shared by structurally equivalent expressions. */\n structuralKey: string;\n /** Whether the node may be memoized for the current evaluation run. */\n cacheable: boolean;\n}\n\n/** Per-evaluator cache of immutable AST dependency metadata (no runtime values). */\nexport class EvaluationMetadata {\n private readonly byNode = new WeakMap<AstNode, EvalNodeInfo>();\n\n get(node: AstNode): EvalNodeInfo {\n let info = this.byNode.get(node);\n if (!info) {\n info = analyzeNode(node, new Set());\n this.byNode.set(node, info);\n }\n return info;\n }\n}\n\n/** Per-run memo of computed values (cleared on each {@link Evaluator.run}). */\nexport class EvaluationCache {\n private entries = new Map<string, CacheEntry>();\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n hits = 0;\n\n /** Returns cached value, or `undefined` on miss or stamp mismatch. */\n lookup(structuralKey: string, stamp: string): Value | undefined {\n const entry = this.entries.get(structuralKey);\n if (entry?.stamp !== stamp) {\n return undefined;\n }\n this.hits++;\n return entry.value;\n }\n\n /** Stores one value per structural key (replaces previous stamp). */\n store(structuralKey: string, stamp: string, value: Value): void {\n this.entries.set(structuralKey, { stamp, value });\n }\n\n clear(): void {\n this.entries.clear();\n this.hits = 0;\n }\n}\n\ninterface CacheEntry {\n stamp: string;\n value: Value;\n}\n\nfunction analyzeNode(node: AstNode, bound: Set<string>): EvalNodeInfo {\n const reads = collectReads(node, bound);\n const structuralKey = buildStructuralKey(node);\n const cacheable = isCacheableNode(node);\n return { reads, structuralKey, cacheable };\n}\n\nfunction isCacheableNode(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ASSIGN:\n case TokenID.ITERATE:\n case TokenID.NT_IMPERATIVE_EXPR:\n case TokenID.NT_DECLARATIVE_EXPR:\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.NT_FUNC_DEFINITION:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.ID_GLOBAL:\n return false;\n default:\n return !node.hasError;\n }\n}\n\nfunction buildStructuralKey(node: AstNode): string {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n return `${node.typeID}:${nodeTextKey(node)}`;\n\n case TokenID.NT_FUNC_CALL:\n return `${node.typeID}:${nodeTextKey(node.children[0])}(${node.children\n .slice(1)\n .map(buildStructuralKey)\n .join(',')})`;\n\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.FILTER:\n return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(',')})`;\n\n default:\n return `${node.typeID}(${node.children.map(buildStructuralKey).join(',')})`;\n }\n}\n\nfunction nodeTextKey(node: AstNode): string {\n if (node.data.dataType === 'number') {\n return String(node.data.value);\n }\n return getNodeText(node);\n}\n\nfunction indicesKey(node: AstNode): string {\n return getNodeIndices(node).join('.');\n}\n\nfunction collectReads(node: AstNode, bound: Set<string>): Set<string> {\n const reads = new Set<string>();\n collectReadsImpl(node, bound, reads);\n return reads;\n}\n\nfunction collectReadsImpl(node: AstNode, bound: Set<string>, reads: Set<string>): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL: {\n reads.add(getNodeText(node));\n return;\n }\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.NT_DECLARATIVE_EXPR: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.ITERATE: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.ASSIGN: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.NT_IMPERATIVE_EXPR: {\n const innerBound = new Set(bound);\n collectReadsImpl(node.children[0], innerBound, reads);\n for (let i = 1; i < node.children.length; i++) {\n const child = node.children[i];\n if (child.typeID === TokenID.ITERATE) {\n extendBoundInPlace(innerBound, child.children[0]);\n collectReadsImpl(child.children[1], innerBound, reads);\n } else if (child.typeID === TokenID.ASSIGN) {\n collectReadsImpl(child.children[1], innerBound, reads);\n extendBoundInPlace(innerBound, child.children[0]);\n } else {\n collectReadsImpl(child, innerBound, reads);\n }\n }\n return;\n }\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n collectReadsImpl(node.children[2], innerBound, reads);\n collectReadsImpl(node.children[3], innerBound, reads);\n } else {\n collectReadsImpl(node.children[2], innerBound, reads);\n }\n return;\n }\n\n case TokenID.NT_FUNC_DEFINITION: {\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[1], innerBound, reads);\n return;\n }\n\n case TokenID.NT_FUNC_CALL: {\n for (let i = 1; i < node.children.length; i++) {\n collectReadsImpl(node.children[i], bound, reads);\n }\n return;\n }\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION: {\n collectReadsImpl(node.children[0], bound, reads);\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n default:\n for (const child of node.children) {\n collectReadsImpl(child, bound, reads);\n }\n }\n}\n\nfunction extendBound(bound: Set<string>, declNode: AstNode): Set<string> {\n const next = new Set(bound);\n extendBoundInPlace(next, declNode);\n return next;\n}\n\nfunction extendBoundInPlace(bound: Set<string>, declNode: AstNode): void {\n switch (declNode.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n bound.add(getNodeText(declNode));\n break;\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n for (const child of declNode.children) {\n extendBoundInPlace(bound, child);\n }\n break;\n case TokenID.NT_ARG_DECL:\n extendBoundInPlace(bound, declNode.children[0]);\n break;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"file":"evaluation-cache.js","names":[],"sources":["../../../src/rslang/eval/evaluation-cache.ts"],"sourcesContent":["/**\n * Module: Dependency metadata and per-run memoization for RSLang evaluation.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { TokenID } from '../parser/token';\n\nimport { type Value } from './value';\n\n/** Static metadata for one AST node. */\nexport interface EvalNodeInfo {\n /** Local aliases this expression reads (for dependency stamping). */\n reads: ReadonlySet<string>;\n /** Stable key shared by structurally equivalent expressions. */\n structuralKey: string;\n /** Whether the node may be memoized for the current evaluation run. */\n cacheable: boolean;\n}\n\n/** Per-evaluator cache of immutable AST dependency metadata (no runtime values). */\nexport class EvaluationMetadata {\n private readonly byNode = new WeakMap<AstNode, EvalNodeInfo>();\n\n get(node: AstNode): EvalNodeInfo {\n let info = this.byNode.get(node);\n if (!info) {\n info = analyzeNode(node, new Set());\n this.byNode.set(node, info);\n }\n return info;\n }\n}\n\n/** Per-run memo of computed values (cleared on each {@link Evaluator.run}). */\nexport class EvaluationCache {\n private entries = new Map<string, CacheEntry>();\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n hits = 0;\n\n /** Returns cached value, or `undefined` on miss or stamp mismatch. */\n lookup(structuralKey: string, stamp: string): Value | undefined {\n const entry = this.entries.get(structuralKey);\n if (entry?.stamp !== stamp) {\n return undefined;\n }\n this.hits++;\n return entry.value;\n }\n\n /** Stores one value per structural key (replaces previous stamp). */\n store(structuralKey: string, stamp: string, value: Value): void {\n this.entries.set(structuralKey, { stamp, value });\n }\n\n clear(): void {\n this.entries.clear();\n this.hits = 0;\n }\n}\n\ninterface CacheEntry {\n stamp: string;\n value: Value;\n}\n\nfunction analyzeNode(node: AstNode, bound: Set<string>): EvalNodeInfo {\n const reads = collectReads(node, bound);\n const structuralKey = buildStructuralKey(node);\n const cacheable = isCacheableNode(node);\n return { reads, structuralKey, cacheable };\n}\n\nfunction isCacheableNode(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ASSIGN:\n case TokenID.ITERATE:\n case TokenID.NT_IMPERATIVE_EXPR:\n case TokenID.NT_DECLARATIVE_EXPR:\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.NT_FUNC_DEFINITION:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.ID_GLOBAL:\n return false;\n default:\n return !node.hasError;\n }\n}\n\nfunction buildStructuralKey(node: AstNode): string {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n return `${node.typeID}:${nodeTextKey(node)}`;\n\n case TokenID.NT_FUNC_CALL:\n return `${node.typeID}:${nodeTextKey(node.children[0])}(${node.children\n .slice(1)\n .map(buildStructuralKey)\n .join(',')})`;\n\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.FILTER:\n return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(',')})`;\n\n default:\n return `${node.typeID}(${node.children.map(buildStructuralKey).join(',')})`;\n }\n}\n\nfunction nodeTextKey(node: AstNode): string {\n if (node.data.dataType === 'number') {\n return String(node.data.value);\n }\n return getNodeText(node);\n}\n\nfunction indicesKey(node: AstNode): string {\n return getNodeIndices(node).join('.');\n}\n\nfunction collectReads(node: AstNode, bound: Set<string>): Set<string> {\n const reads = new Set<string>();\n collectReadsImpl(node, bound, reads);\n return reads;\n}\n\nfunction collectReadsImpl(node: AstNode, bound: Set<string>, reads: Set<string>): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL: {\n reads.add(getNodeText(node));\n return;\n }\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.NT_DECLARATIVE_EXPR: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.ITERATE: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.ASSIGN: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.NT_IMPERATIVE_EXPR: {\n const innerBound = new Set(bound);\n collectReadsImpl(node.children[0], innerBound, reads);\n for (let i = 1; i < node.children.length; i++) {\n const child = node.children[i];\n if (child.typeID === TokenID.ITERATE) {\n extendBoundInPlace(innerBound, child.children[0]);\n collectReadsImpl(child.children[1], innerBound, reads);\n } else if (child.typeID === TokenID.ASSIGN) {\n collectReadsImpl(child.children[1], innerBound, reads);\n extendBoundInPlace(innerBound, child.children[0]);\n } else {\n collectReadsImpl(child, innerBound, reads);\n }\n }\n return;\n }\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n collectReadsImpl(node.children[2], innerBound, reads);\n collectReadsImpl(node.children[3], innerBound, reads);\n } else {\n collectReadsImpl(node.children[2], innerBound, reads);\n }\n return;\n }\n\n case TokenID.NT_FUNC_DEFINITION: {\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[1], innerBound, reads);\n return;\n }\n\n case TokenID.NT_FUNC_CALL: {\n for (let i = 1; i < node.children.length; i++) {\n collectReadsImpl(node.children[i], bound, reads);\n }\n return;\n }\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION: {\n collectReadsImpl(node.children[0], bound, reads);\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n default:\n for (const child of node.children) {\n collectReadsImpl(child, bound, reads);\n }\n }\n}\n\nfunction extendBound(bound: Set<string>, declNode: AstNode): Set<string> {\n const next = new Set(bound);\n extendBoundInPlace(next, declNode);\n return next;\n}\n\nfunction extendBoundInPlace(bound: Set<string>, declNode: AstNode): void {\n switch (declNode.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n bound.add(getNodeText(declNode));\n break;\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n for (const child of declNode.children) {\n extendBoundInPlace(bound, child);\n }\n break;\n case TokenID.NT_ARG_DECL:\n extendBoundInPlace(bound, declNode.children[0]);\n break;\n }\n}\n"],"mappings":"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"}
|