@rsconcept/domain 3.1.0 → 3.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.
- package/dist/{analyzer-B35QsI3L.d.ts → analyzer-BcPMzR38.d.ts} +2 -2
- package/dist/{api-DgecYHjR.d.ts → api-BRrnB6yd.d.ts} +4 -2
- package/dist/{ast-annotations-DclU1Ser.d.ts → ast-annotations-B0XO6380.d.ts} +2 -2
- package/dist/{calculator-B-1p712X.d.ts → calculator-SVf1trzN.d.ts} +2 -2
- package/dist/cctext/index.js +1 -2
- package/dist/cctext/language-api.d.ts +11 -12
- package/dist/cctext/language.d.ts +13 -14
- package/dist/{diagnostics-D4_B7rt2.d.ts → diagnostics-DC6QECex.d.ts} +3 -3
- package/dist/{diagnostics-D1Cp21nP.js → diagnostics-D_4TpAH4.js} +4 -5
- package/dist/{diagnostics-D1Cp21nP.js.map → diagnostics-D_4TpAH4.js.map} +1 -1
- package/dist/{error-S1JghCNN.d.ts → error-DBbO_NIg.d.ts} +2 -1
- package/dist/graph/index.js +1 -2
- package/dist/{index-DzvllU3P.d.ts → index-CEOeehqz.d.ts} +5 -5
- package/dist/{index-D-w-bgei.d.ts → index-CEUOBGLn.d.ts} +6 -5
- package/dist/index.d.ts +8 -7
- package/dist/index.js +4 -3
- package/dist/library/diagnostics.d.ts +1 -1
- package/dist/library/diagnostics.js +1 -2
- package/dist/library/folder-tree.d.ts +2 -3
- package/dist/library/index.d.ts +5 -5
- package/dist/library/index.js +1 -1
- package/dist/library/library-api.d.ts +2 -3
- package/dist/library/oss-api.d.ts +5 -6
- package/dist/library/oss-api.js +2 -4
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss-layout-api.d.ts +4 -5
- package/dist/library/oss.d.ts +16 -16
- package/dist/library/oss.js +1 -1
- package/dist/library/rsengine.d.ts +6 -7
- package/dist/library/rsengine.js +23 -24
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api/index.d.ts +1 -1
- package/dist/library/rsform-api/index.js +1 -2
- package/dist/library/rsform.d.ts +1 -1
- package/dist/library/rsmodel-api.d.ts +17 -18
- package/dist/library/rsmodel-api.js +6 -4
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/rsmodel.d.ts +1 -1
- package/dist/library/structure-planner.d.ts +4 -5
- package/dist/library/structure-planner.js +1 -1
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.d.ts +2 -2
- package/dist/rslang/api.js +12 -7
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/ast-annotations.d.ts +1 -1
- package/dist/rslang/error.d.ts +1 -1
- package/dist/rslang/error.js +1 -0
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +1 -1
- package/dist/rslang/eval/calculator.js +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +3 -4
- package/dist/rslang/eval/evaluation-cache.js +1 -3
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.d.ts +3 -4
- package/dist/rslang/eval/evaluator.js +5 -3
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.js +1 -2
- package/dist/rslang/eval/value.js +1 -2
- package/dist/rslang/index.d.ts +8 -7
- package/dist/rslang/index.js +3 -2
- package/dist/rslang/labels.d.ts +5 -6
- package/dist/rslang/parser/normalize.d.ts +1 -2
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.terms.d.ts +1 -2
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/parser/syntax-errors/index.d.ts +3 -4
- package/dist/rslang/parser/syntax-errors/index.js +1 -2
- package/dist/rslang/semantic/analyzer.d.ts +1 -1
- package/dist/rslang/semantic/analyzer.js +1 -1
- package/dist/rslang/semantic/arguments-extractor.js +6 -4
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +2 -3
- package/dist/rslang/semantic/type-auditor.js +20 -16
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.d.ts +10 -11
- package/dist/rslang/semantic/typification-api.js +10 -9
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.js +4 -1
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +2 -3
- package/dist/shared/index.js +1 -2
- package/dist/{syntax-errors-BN_bqTaX.js → syntax-errors-WGLQNaNe.js} +19 -4
- package/dist/{syntax-errors-BN_bqTaX.js.map → syntax-errors-WGLQNaNe.js.map} +1 -1
- package/dist/{value-COprb2Je.js → value-BDISzQqI.js} +3 -2
- package/dist/{value-COprb2Je.js.map → value-BDISzQqI.js.map} +1 -1
- package/package.json +24 -25
- package/src/index.ts +2 -1
- package/src/library/rsengine.test.ts +164 -0
- package/src/library/rsengine.ts +25 -24
- package/src/rslang/api.ts +3 -0
- package/src/rslang/error.ts +1 -0
- package/src/rslang/index.ts +2 -1
- package/src/rslang/parser/parser.test.ts +38 -0
- package/src/rslang/parser/syntax-errors/README.md +2 -2
- package/src/rslang/parser/syntax-errors/expression-errors.ts +18 -0
- package/src/rslang/parser/syntax-errors/index.ts +11 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { annotateError } from "../ast-annotations.js";
|
|
2
2
|
import { RSErrorCode } from "../error.js";
|
|
3
|
-
import { M as validateValue } from "../../value-
|
|
3
|
+
import { M as validateValue } from "../../value-BDISzQqI.js";
|
|
4
4
|
import { Evaluator } from "./evaluator.js";
|
|
5
5
|
//#region src/rslang/eval/calculator.ts
|
|
6
6
|
/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners. */
|
|
@@ -3,7 +3,7 @@ import "../../index-D5RahF1K.js";
|
|
|
3
3
|
import { l as Value } from "../../value-XpJOVzMP.js";
|
|
4
4
|
//#region src/rslang/eval/evaluation-cache.d.ts
|
|
5
5
|
/** Static metadata for one AST node. */
|
|
6
|
-
interface EvalNodeInfo {
|
|
6
|
+
export interface EvalNodeInfo {
|
|
7
7
|
/** Local aliases this expression reads (for dependency stamping). */
|
|
8
8
|
reads: ReadonlySet<string>;
|
|
9
9
|
/** Stable key shared by structurally equivalent expressions. */
|
|
@@ -12,12 +12,12 @@ interface EvalNodeInfo {
|
|
|
12
12
|
cacheable: boolean;
|
|
13
13
|
}
|
|
14
14
|
/** Per-evaluator cache of immutable AST dependency metadata (no runtime values). */
|
|
15
|
-
declare class EvaluationMetadata {
|
|
15
|
+
export declare class EvaluationMetadata {
|
|
16
16
|
private readonly byNode;
|
|
17
17
|
get(node: AstNode): EvalNodeInfo;
|
|
18
18
|
}
|
|
19
19
|
/** Per-run memo of computed values (cleared on each {@link Evaluator.run}). */
|
|
20
|
-
declare class EvaluationCache {
|
|
20
|
+
export declare class EvaluationCache {
|
|
21
21
|
private entries;
|
|
22
22
|
/** Cache hits in the current evaluation run (for tests/diagnostics). */
|
|
23
23
|
hits: number;
|
|
@@ -28,5 +28,4 @@ declare class EvaluationCache {
|
|
|
28
28
|
clear(): void;
|
|
29
29
|
}
|
|
30
30
|
//#endregion
|
|
31
|
-
export { EvalNodeInfo, EvaluationCache, EvaluationMetadata };
|
|
32
31
|
//# sourceMappingURL=evaluation-cache.d.ts.map
|
|
@@ -180,9 +180,7 @@ function extendBoundInPlace(bound, declNode) {
|
|
|
180
180
|
case TokenID.NT_ENUM_DECL:
|
|
181
181
|
for (const child of declNode.children) extendBoundInPlace(bound, child);
|
|
182
182
|
break;
|
|
183
|
-
case TokenID.NT_ARG_DECL:
|
|
184
|
-
extendBoundInPlace(bound, declNode.children[0]);
|
|
185
|
-
break;
|
|
183
|
+
case TokenID.NT_ARG_DECL: extendBoundInPlace(bound, declNode.children[0]);
|
|
186
184
|
}
|
|
187
185
|
}
|
|
188
186
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { t as AstNode } from "../../ast-D-D6Rq3T.js";
|
|
2
2
|
import "../../index-D5RahF1K.js";
|
|
3
|
-
import { t as ErrorReporter } from "../../error-
|
|
3
|
+
import { t as ErrorReporter } from "../../error-DBbO_NIg.js";
|
|
4
4
|
import { l as Value, u as ValueContext } from "../../value-XpJOVzMP.js";
|
|
5
5
|
//#region src/rslang/eval/evaluator.d.ts
|
|
6
6
|
/** AST context. */
|
|
7
|
-
type ASTContext = Map<string, AstNode>;
|
|
7
|
+
export type ASTContext = Map<string, AstNode>;
|
|
8
8
|
/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners.
|
|
9
9
|
* Not safe for concurrent {@link run} calls on the same instance; use separate evaluators instead. */
|
|
10
|
-
declare class Evaluator {
|
|
10
|
+
export declare class Evaluator {
|
|
11
11
|
private reporter?;
|
|
12
12
|
private annotateErrors;
|
|
13
13
|
private disableCache;
|
|
@@ -72,5 +72,4 @@ declare class Evaluator {
|
|
|
72
72
|
private visitRecursion;
|
|
73
73
|
}
|
|
74
74
|
//#endregion
|
|
75
|
-
export { ASTContext, Evaluator };
|
|
76
75
|
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -5,7 +5,7 @@ import { labelRSLangNode } from "../labels.js";
|
|
|
5
5
|
import { annotateError } from "../ast-annotations.js";
|
|
6
6
|
import { RSErrorCode } from "../error.js";
|
|
7
7
|
import { EvaluationCache, EvaluationMetadata } from "./evaluation-cache.js";
|
|
8
|
-
import { A as setUnion, D as setIntersection, E as setDiff, T as reduce, a as SET_INFINITY, d as set, f as tuple, h as contains, k as setSymDiff, l as compare, m as cartesianProduct, n as CalcInvalidDataError, p as boolean, r as EmptySetV, w as projection, y as isSubsetOrEq } from "../../value-
|
|
8
|
+
import { A as setUnion, D as setIntersection, E as setDiff, T as reduce, a as SET_INFINITY, d as set, f as tuple, h as contains, k as setSymDiff, l as compare, m as cartesianProduct, n as CalcInvalidDataError, p as boolean, r as EmptySetV, w as projection, y as isSubsetOrEq } from "../../value-BDISzQqI.js";
|
|
9
9
|
//#region src/rslang/eval/evaluator.ts
|
|
10
10
|
/**
|
|
11
11
|
* Module: AST evaluation - visitor-pattern evaluator for RS expressions.
|
|
@@ -459,7 +459,8 @@ var Evaluator = class {
|
|
|
459
459
|
visitProjectSet(node) {
|
|
460
460
|
const target = this.visitChild(node, 0);
|
|
461
461
|
if (target === null) return null;
|
|
462
|
-
|
|
462
|
+
const indices = getNodeIndices(node);
|
|
463
|
+
return projection(target, indices);
|
|
463
464
|
}
|
|
464
465
|
visitProjectTuple(node) {
|
|
465
466
|
const target = this.visitChild(node, 0);
|
|
@@ -502,7 +503,8 @@ var Evaluator = class {
|
|
|
502
503
|
const result = [];
|
|
503
504
|
for (const element of argVal) {
|
|
504
505
|
const comps = indices.map((i) => element[i]);
|
|
505
|
-
|
|
506
|
+
const testElement = comps.length === 1 ? comps[0] : tuple(comps);
|
|
507
|
+
if (contains(paramVal, testElement)) result.push(element);
|
|
506
508
|
}
|
|
507
509
|
return result;
|
|
508
510
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","names":[],"sources":["../../../src/rslang/eval/evaluator.ts"],"sourcesContent":["/**\n * Module: AST evaluation - visitor-pattern evaluator for RS expressions.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, type EvalStackFrame, RSErrorCode } from '../error';\nimport { labelRSLangNode } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport { EvaluationCache, EvaluationMetadata } from './evaluation-cache';\nimport {\n BOOL_INFINITY,\n CalcInvalidDataError,\n compare,\n EmptySetV,\n set,\n SET_INFINITY,\n tuple,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext\n} from './value';\nimport {\n boolean,\n cartesianProduct,\n contains,\n isSubsetOrEq,\n projection,\n reduce,\n setDiff,\n setIntersection,\n setSymDiff,\n setUnion\n} from './value-api';\n\n/** Maximum iterations to prevent infinite loops (recursion, quantifiers, etc.). */\nconst MAX_ITERATIONS = 1_000_000;\n\nconst TICK_PER_FUNCTION = 3;\nconst TICK_PER_RECURSION = 3;\nconst TICK_PER_IMPERATIVE = 1;\nconst TICK_PER_DECLARATIVE = 1;\nconst TICK_PER_QUANTIFIER = 1;\n\n/** AST context. */\nexport type ASTContext = Map<string, AstNode>;\n\n/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners.\n * Not safe for concurrent {@link run} calls on the same instance; use separate evaluators instead. */\nexport class Evaluator {\n private reporter?: ErrorReporter;\n private annotateErrors = false;\n private disableCache = false;\n private locals: LocalContext = new LocalContext();\n private nodeMetadata: EvaluationMetadata = new EvaluationMetadata();\n private evalCache: EvaluationCache = new EvaluationCache();\n private callSiteStack: AstNode[] = [];\n private context: ValueContext;\n private treeContext: ASTContext;\n\n public iterationCounter = 0;\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n public get cacheHits(): number {\n return this.evalCache.hits;\n }\n\n constructor(context: ValueContext, astContext: ASTContext) {\n this.treeContext = astContext;\n this.context = context;\n }\n\n public run(\n ast: AstNode,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false,\n disableCache: boolean = false\n ): Value | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n this.disableCache = disableCache;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext();\n this.evalCache.clear();\n this.callSiteStack = [];\n this.iterationCounter = 0;\n }\n\n /**\n * Surface highlight target in the root expression under evaluation.\n * Nested call sites live in callee ASTs — only the outermost call is in the root.\n */\n private surfaceErrorNode(fault: AstNode): AstNode {\n return this.callSiteStack[0] ?? fault;\n }\n\n /**\n * Builds innermost-first frames for called `F#`/`P#` bodies only.\n * The root expression is represented by the surface `from`/`to`, not a stack frame.\n * Returns `undefined` when the fault is in the root expression (no function call).\n */\n private buildEvalStack(fault: AstNode): readonly EvalStackFrame[] | undefined {\n if (this.callSiteStack.length === 0) {\n return undefined;\n }\n const frames: EvalStackFrame[] = [];\n const innermostCall = this.callSiteStack[this.callSiteStack.length - 1];\n if (!innermostCall) {\n return undefined;\n }\n frames.push({\n alias: getNodeText(innermostCall.children[0]),\n from: fault.from,\n to: fault.to\n });\n // Call sites at index ≥ 1 live in a callee body; index 0 is the root call site.\n for (let index = this.callSiteStack.length - 1; index >= 1; index--) {\n const callSite = this.callSiteStack[index];\n const outerCall = this.callSiteStack[index - 1];\n if (!callSite || !outerCall) {\n continue;\n }\n frames.push({\n alias: getNodeText(outerCall.children[0]),\n from: callSite.from,\n to: callSite.to\n });\n }\n return frames;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n const target = this.surfaceErrorNode(node);\n const stack = this.buildEvalStack(node);\n this.reporter?.({\n code,\n from: target.from,\n to: target.to,\n ...(params !== undefined ? { params } : {}),\n ...(stack !== undefined ? { stack } : {})\n });\n if (this.annotateErrors) {\n annotateError(target, code, params);\n }\n return null;\n }\n\n private tick(node: AstNode, counter: number = 1): boolean {\n this.iterationCounter += counter;\n if (this.iterationCounter > MAX_ITERATIONS) {\n this.onError(RSErrorCode.iterationsLimit, node, [String(MAX_ITERATIONS)]);\n return false;\n }\n return true;\n }\n\n private dispatchDeclare(node: AstNode, value: Value): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, value);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, value as Value[]);\n case TokenID.NT_ARG_DECL:\n return this.dispatchDeclare(node.children[0], value);\n }\n }\n\n private declareLocal(node: AstNode, value: Value): void {\n const alias = getNodeText(node);\n this.locals.setLocal(alias, value);\n }\n\n private declareTuple(node: AstNode, value: Value[]): void {\n for (let child = 0; child < node.children.length; child++) {\n this.dispatchDeclare(node.children[child], value[child + 1]);\n }\n }\n\n private dispatchVisit(node: AstNode): Value | null {\n const info = this.nodeMetadata.get(node);\n let stamp: string | null = null;\n if (info.cacheable && !this.disableCache) {\n stamp = this.locals.buildDependencyStamp(info.reads);\n if (stamp !== null) {\n const cached = this.evalCache.lookup(info.structuralKey, stamp);\n if (cached !== undefined) {\n return cached;\n }\n }\n }\n\n try {\n const result = this.dispatchVisitImpl(node);\n if (!this.disableCache && result !== null && info.cacheable && stamp !== null) {\n this.evalCache.store(info.structuralKey, stamp, result);\n }\n return result;\n } catch (error) {\n if (error instanceof CalcInvalidDataError) {\n return this.onError(RSErrorCode.calcInvalidData, node, [error.left, error.right, labelRSLangNode(node)]);\n }\n this.onError(RSErrorCode.calcUnknownError, node);\n return null;\n }\n }\n\n private dispatchVisitImpl(node: AstNode): Value | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n return this.visitGlobal(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n return this.visitLocal(node);\n\n case TokenID.LIT_INTEGER:\n return this.visitInteger(node);\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return this.onError(RSErrorCode.iterateInfinity, node);\n\n case TokenID.LIT_EMPTYSET:\n return EmptySetV;\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BOOL:\n return this.visitBool(node);\n\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.REDUCE:\n return this.visitReduce(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.onError(RSErrorCode.calculationNotSupported, node);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): Value | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitGlobal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n const value = this.context.get(alias) ?? null;\n if (value === null) {\n return this.onError(RSErrorCode.calcGlobalMissing, node, [alias]);\n }\n return value;\n }\n\n private visitLocal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n const value = this.locals.findLocal(alias);\n if (value === null) {\n return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n }\n return value;\n }\n\n private visitFunctionCall(node: AstNode): Value | null {\n const funcName = getNodeText(node.children[0]);\n const ast = this.treeContext.get(funcName);\n if (!ast) {\n return this.onError(RSErrorCode.calcGlobalMissing, node.children[0], [funcName]);\n }\n if (!this.tick(node, TICK_PER_FUNCTION)) {\n return null;\n }\n\n const args: Value[] = [];\n for (let i = 1; i < node.children.length; i++) {\n const arg = this.visitChild(node, i);\n if (arg === null) {\n return null;\n }\n args.push(arg);\n }\n\n this.locals.startScope();\n for (let i = 0; i < args.length; i++) {\n this.dispatchDeclare(ast.children[0].children[i], args[i]);\n }\n this.callSiteStack.push(node);\n let result: Value | null;\n try {\n result = this.visitChild(ast, 1);\n } finally {\n this.callSiteStack.pop();\n }\n this.locals.endScope();\n return result;\n }\n\n private visitInteger(node: AstNode): Value | null {\n const value = node.data.dataType === 'number' ? (node.data.value as number) : Number(node.data.value);\n return Math.floor(value);\n }\n\n private visitArithmetic(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n const v2 = this.visitChild(node, 1);\n if (v1 === null || v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n switch (node.typeID) {\n case TokenID.PLUS:\n return a + b;\n case TokenID.MINUS:\n return a - b;\n case TokenID.MULTIPLY:\n return a * b;\n }\n return null;\n }\n\n private visitCard(node: AstNode): Value | null {\n const base = this.visitChild(node, 0);\n if (base === null || !Array.isArray(base)) {\n return null;\n }\n return base.length;\n }\n\n private visitQuantifier(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1) as Value[];\n if (domain === null) {\n return null;\n }\n const isUniversal = node.typeID === TokenID.QUANTOR_UNIVERSAL;\n if (domain.length === 0) {\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n const varNodes = node.children[0].typeID === TokenID.NT_ENUM_DECL ? node.children[0].children : [node.children[0]];\n const count = domain.length;\n const iterators: number[] = [];\n for (const declaration of varNodes) {\n iterators.push(0);\n this.dispatchDeclare(declaration, domain[0]);\n }\n let finishIteration = false;\n while (!finishIteration) {\n const iterationValue = this.visitChild(node, 2);\n if (iterationValue === null) {\n return null;\n }\n if ((iterationValue === VALUE_TRUE) !== isUniversal) {\n return !isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n let incrementIndex = iterators.length - 1;\n while (true) {\n if (iterators[incrementIndex] < count - 1) {\n iterators[incrementIndex]++;\n if (!this.tick(node, TICK_PER_QUANTIFIER)) {\n return null;\n }\n this.dispatchDeclare(varNodes[incrementIndex], domain[iterators[incrementIndex]]);\n incrementIndex = iterators.length - 1;\n break;\n } else if (incrementIndex === 0) {\n finishIteration = true;\n break;\n } else {\n iterators[incrementIndex] = 0;\n this.dispatchDeclare(varNodes[incrementIndex], domain[0]);\n incrementIndex--;\n }\n }\n }\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitNegation(node: AstNode): Value | null {\n const value = this.visitChild(node, 0);\n if (value === null) {\n return null;\n }\n return (value as number) === VALUE_TRUE ? VALUE_FALSE : VALUE_TRUE;\n }\n\n private tryEvaluateFromFirstArg(op: number, first: boolean): Value | null {\n if ((op === TokenID.LOGIC_AND && !first) || (op === TokenID.LOGIC_OR && first)) {\n return first ? VALUE_TRUE : VALUE_FALSE;\n }\n if (op === TokenID.LOGIC_IMPLICATION && !first) {\n return VALUE_TRUE;\n }\n return null;\n }\n\n private visitLogicBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const b1 = v1 === VALUE_TRUE;\n const attempt = this.tryEvaluateFromFirstArg(node.typeID, b1);\n if (attempt !== null) {\n return attempt;\n }\n\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const b2 = v2 === VALUE_TRUE;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.LOGIC_AND:\n result = b1 && b2;\n break;\n case TokenID.LOGIC_OR:\n result = b1 || b2;\n break;\n case TokenID.LOGIC_IMPLICATION:\n result = !b1 || b2;\n break;\n case TokenID.LOGIC_EQUIVALENT:\n result = b1 === b2;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitEquals(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const areEqual = compare(v1, v2) === 0;\n return areEqual === (node.typeID !== TokenID.NOTEQUAL) ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitIntegerPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.GREATER:\n result = a > b;\n break;\n case TokenID.LESSER:\n result = a < b;\n break;\n case TokenID.GREATER_OR_EQ:\n result = a >= b;\n break;\n case TokenID.LESSER_OR_EQ:\n result = a <= b;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitSetexprPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n let result: boolean;\n switch (node.typeID) {\n case TokenID.SET_IN:\n result = contains(v2 as Value[], v1);\n break;\n case TokenID.SET_NOT_IN:\n result = !contains(v2 as Value[], v1);\n break;\n case TokenID.SUBSET:\n result = compare(v1, v2) !== 0 && isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.NOT_SUBSET:\n result = compare(v1, v2) === 0 || !isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.SUBSET_OR_EQ:\n result = isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitDecart(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i) as Value[];\n if (component === null) {\n return null;\n }\n if (component.length === 0) {\n return EmptySetV;\n }\n args.push(component);\n }\n const result = cartesianProduct(args as Value[][]);\n if (result === null) {\n this.onError(RSErrorCode.setOverflow, node, [String(SET_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): Value | null {\n const base = this.visitChild(node, 0) as Value[];\n if (base === null) {\n return null;\n }\n const result = boolean(base);\n if (result === null) {\n this.onError(RSErrorCode.booleanBaseLimit, node.children[0], [String(BOOL_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitTuple(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i);\n if (component === null) {\n return null;\n }\n args.push(component);\n }\n return tuple(args);\n }\n\n private visitEnumeration(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const element = this.visitChild(node, i);\n if (element === null) {\n return null;\n }\n args.push(element);\n }\n return set(args);\n }\n\n private visitBool(node: AstNode): Value | null {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n return [element];\n }\n\n private visitDebool(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n if (target.length !== 1) {\n return this.onError(RSErrorCode.calcInvalidDebool, node.children[0]);\n }\n return target[0];\n }\n\n private visitSetexprBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n switch (node.typeID) {\n case TokenID.SET_UNION:\n return setUnion(v1 as Value[], v2 as Value[]);\n case TokenID.SET_INTERSECTION:\n return setIntersection(v1 as Value[], v2 as Value[]);\n case TokenID.SET_MINUS:\n return setDiff(v1 as Value[], v2 as Value[]);\n case TokenID.SET_SYMMETRIC_MINUS:\n return setSymDiff(v1 as Value[], v2 as Value[]);\n }\n return null;\n }\n\n private visitProjectSet(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n return projection(target as Value[][], indices);\n }\n\n private visitProjectTuple(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n const components = indices.map(i => target[i]);\n return components.length === 1 ? components[0] : tuple(components);\n }\n\n private visitFilter(node: AstNode): Value | null {\n const lastIdx = node.children.length - 1;\n const argVal = this.visitChild(node, lastIdx) as Value[][];\n if (argVal === null) {\n return null;\n }\n if (argVal.length === 0) {\n return EmptySetV;\n }\n\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === lastIdx;\n if (tupleParam) {\n const params: Value[] = [];\n for (let i = 0; i < lastIdx; i++) {\n const param = this.visitChild(node, i) as Value[];\n if (param === null) {\n return null;\n }\n if (param.length === 0) {\n return EmptySetV;\n }\n params.push(param);\n }\n const result: Value[] = [];\n for (const element of argVal) {\n let valid = true;\n for (let j = 0; j < indices.length; j++) {\n const comp = element[indices[j]];\n const paramSet = params[j] as Value[];\n if (!contains(paramSet, comp)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n result.push(element);\n }\n }\n return result;\n } else {\n const paramVal = this.visitChild(node, 0) as Value[];\n if (paramVal === null) {\n return null;\n }\n if (paramVal.length === 0) {\n return EmptySetV;\n }\n\n const result: Value[] = [];\n for (const element of argVal) {\n const comps = indices.map(i => element[i]);\n const testElement = comps.length === 1 ? comps[0] : tuple(comps);\n if (contains(paramVal, testElement)) result.push(element);\n }\n return result;\n }\n }\n\n private visitReduce(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n return reduce(target as Value[][]);\n }\n\n private visitDeclarative(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1);\n if (domain === null) {\n return null;\n }\n\n const elements = [];\n for (const element of domain as Value[]) {\n if (!this.tick(node, TICK_PER_DECLARATIVE)) {\n return null;\n }\n this.dispatchDeclare(node.children[0], element);\n const value = this.visitChild(node, 2);\n if (value === null) {\n return null;\n }\n if (value === VALUE_TRUE) {\n elements.push(element);\n }\n }\n return elements.length === 0 ? EmptySetV : elements;\n }\n\n private visitImperative(node: AstNode): Value | null {\n const result: Value[] = [];\n const frames: IterationFrame[] = [];\n\n let currentChild = 1;\n\n // Advance to next iteration\n const advanceIterator = (): boolean => {\n while (frames.length > 0) {\n const top = frames[frames.length - 1];\n if (top.valueID < top.domain.length - 1) {\n top.valueID++;\n const nextValue = top.domain[top.valueID];\n if (!this.tick(node.children[top.childID], TICK_PER_IMPERATIVE)) {\n return false;\n }\n this.dispatchDeclare(node.children[top.childID].children[0], nextValue);\n currentChild = top.childID + 1;\n return true;\n }\n frames.pop();\n }\n return false;\n };\n\n while (true) {\n // Iteration end - create element and pop up stack\n if (currentChild >= node.children.length) {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n result.push(element);\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n\n // Iteration node\n const child = node.children[currentChild];\n if (child.typeID === TokenID.ITERATE) {\n const domain = this.visitChild(child, 1) as Value[];\n if (domain === null) {\n return null;\n }\n if (domain.length === 0) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n if (!this.tick(child, TICK_PER_IMPERATIVE)) {\n return null;\n }\n frames.push({\n childID: currentChild,\n domain,\n valueID: 0\n });\n this.dispatchDeclare(child.children[0], domain[0]);\n currentChild++;\n continue;\n }\n\n // Guard expression\n const value = this.dispatchVisit(child);\n if (value === null) {\n return null;\n }\n if (value === VALUE_FALSE) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n currentChild++;\n }\n return set(result);\n }\n\n private visitAssign(node: AstNode): Value | null {\n const value = this.visitChild(node, 1);\n if (value === null) {\n return null;\n }\n this.dispatchDeclare(node.children[0], value);\n return VALUE_TRUE;\n }\n\n private visitRecursion(node: AstNode): Value | null {\n const initialValue = this.visitChild(node, 1);\n if (initialValue === null) {\n return null;\n }\n const bodyIndex = node.typeID === TokenID.NT_RECURSIVE_FULL ? 3 : 2;\n let current: Value = initialValue;\n while (true) {\n if (!this.tick(node, TICK_PER_RECURSION)) {\n return null;\n }\n\n this.dispatchDeclare(node.children[0], current);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n const pred = this.visitChild(node, 2);\n if (pred === null) {\n return null;\n }\n if (pred !== VALUE_TRUE) {\n break;\n }\n }\n\n const next = this.visitChild(node, bodyIndex);\n if (next === null) {\n return null;\n }\n if (compare(current, next) === 0) {\n break;\n }\n current = next;\n }\n\n return current;\n }\n}\n\n/** Imperative iteration block data. */\ninterface IterationFrame {\n childID: number;\n domain: Value[];\n valueID: number;\n}\n\n/** Local variable binding with version for cache invalidation. */\ninterface LocalBinding {\n id: number;\n version: number;\n value: Value;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private nextBindingId = 1;\n private data = new Map<string, LocalBinding>();\n private callStack: Map<string, LocalBinding>[] = [];\n\n startScope(): void {\n this.callStack.push(this.data);\n this.data = new Map();\n }\n\n endScope(): void {\n this.data = this.callStack.pop()!;\n }\n\n setLocal(alias: string, value: Value): void {\n const existing = this.data.get(alias);\n if (existing) {\n existing.value = value;\n existing.version++;\n } else {\n this.data.set(alias, { id: this.nextBindingId++, version: 0, value });\n }\n }\n\n findLocal(alias: string): Value | null {\n return this.data.get(alias)?.value ?? null;\n }\n\n buildDependencyStamp(reads: ReadonlySet<string>): string | null {\n if (reads.size === 0) {\n return '';\n }\n const parts: string[] = [];\n for (const alias of [...reads].sort()) {\n const binding = this.data.get(alias);\n if (binding === undefined) {\n return null;\n }\n parts.push(`${binding.id}:${binding.version}`);\n }\n return parts.join('|');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluator.js","names":[],"sources":["../../../src/rslang/eval/evaluator.ts"],"sourcesContent":["/**\n * Module: AST evaluation - visitor-pattern evaluator for RS expressions.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, type EvalStackFrame, RSErrorCode } from '../error';\nimport { labelRSLangNode } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport { EvaluationCache, EvaluationMetadata } from './evaluation-cache';\nimport {\n BOOL_INFINITY,\n CalcInvalidDataError,\n compare,\n EmptySetV,\n set,\n SET_INFINITY,\n tuple,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext\n} from './value';\nimport {\n boolean,\n cartesianProduct,\n contains,\n isSubsetOrEq,\n projection,\n reduce,\n setDiff,\n setIntersection,\n setSymDiff,\n setUnion\n} from './value-api';\n\n/** Maximum iterations to prevent infinite loops (recursion, quantifiers, etc.). */\nconst MAX_ITERATIONS = 1_000_000;\n\nconst TICK_PER_FUNCTION = 3;\nconst TICK_PER_RECURSION = 3;\nconst TICK_PER_IMPERATIVE = 1;\nconst TICK_PER_DECLARATIVE = 1;\nconst TICK_PER_QUANTIFIER = 1;\n\n/** AST context. */\nexport type ASTContext = Map<string, AstNode>;\n\n/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners.\n * Not safe for concurrent {@link run} calls on the same instance; use separate evaluators instead. */\nexport class Evaluator {\n private reporter?: ErrorReporter;\n private annotateErrors = false;\n private disableCache = false;\n private locals: LocalContext = new LocalContext();\n private nodeMetadata: EvaluationMetadata = new EvaluationMetadata();\n private evalCache: EvaluationCache = new EvaluationCache();\n private callSiteStack: AstNode[] = [];\n private context: ValueContext;\n private treeContext: ASTContext;\n\n public iterationCounter = 0;\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n public get cacheHits(): number {\n return this.evalCache.hits;\n }\n\n constructor(context: ValueContext, astContext: ASTContext) {\n this.treeContext = astContext;\n this.context = context;\n }\n\n public run(\n ast: AstNode,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false,\n disableCache: boolean = false\n ): Value | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n this.disableCache = disableCache;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext();\n this.evalCache.clear();\n this.callSiteStack = [];\n this.iterationCounter = 0;\n }\n\n /**\n * Surface highlight target in the root expression under evaluation.\n * Nested call sites live in callee ASTs — only the outermost call is in the root.\n */\n private surfaceErrorNode(fault: AstNode): AstNode {\n return this.callSiteStack[0] ?? fault;\n }\n\n /**\n * Builds innermost-first frames for called `F#`/`P#` bodies only.\n * The root expression is represented by the surface `from`/`to`, not a stack frame.\n * Returns `undefined` when the fault is in the root expression (no function call).\n */\n private buildEvalStack(fault: AstNode): readonly EvalStackFrame[] | undefined {\n if (this.callSiteStack.length === 0) {\n return undefined;\n }\n const frames: EvalStackFrame[] = [];\n const innermostCall = this.callSiteStack[this.callSiteStack.length - 1];\n if (!innermostCall) {\n return undefined;\n }\n frames.push({\n alias: getNodeText(innermostCall.children[0]),\n from: fault.from,\n to: fault.to\n });\n // Call sites at index ≥ 1 live in a callee body; index 0 is the root call site.\n for (let index = this.callSiteStack.length - 1; index >= 1; index--) {\n const callSite = this.callSiteStack[index];\n const outerCall = this.callSiteStack[index - 1];\n if (!callSite || !outerCall) {\n continue;\n }\n frames.push({\n alias: getNodeText(outerCall.children[0]),\n from: callSite.from,\n to: callSite.to\n });\n }\n return frames;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n const target = this.surfaceErrorNode(node);\n const stack = this.buildEvalStack(node);\n this.reporter?.({\n code,\n from: target.from,\n to: target.to,\n ...(params !== undefined ? { params } : {}),\n ...(stack !== undefined ? { stack } : {})\n });\n if (this.annotateErrors) {\n annotateError(target, code, params);\n }\n return null;\n }\n\n private tick(node: AstNode, counter: number = 1): boolean {\n this.iterationCounter += counter;\n if (this.iterationCounter > MAX_ITERATIONS) {\n this.onError(RSErrorCode.iterationsLimit, node, [String(MAX_ITERATIONS)]);\n return false;\n }\n return true;\n }\n\n private dispatchDeclare(node: AstNode, value: Value): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, value);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, value as Value[]);\n case TokenID.NT_ARG_DECL:\n return this.dispatchDeclare(node.children[0], value);\n }\n }\n\n private declareLocal(node: AstNode, value: Value): void {\n const alias = getNodeText(node);\n this.locals.setLocal(alias, value);\n }\n\n private declareTuple(node: AstNode, value: Value[]): void {\n for (let child = 0; child < node.children.length; child++) {\n this.dispatchDeclare(node.children[child], value[child + 1]);\n }\n }\n\n private dispatchVisit(node: AstNode): Value | null {\n const info = this.nodeMetadata.get(node);\n let stamp: string | null = null;\n if (info.cacheable && !this.disableCache) {\n stamp = this.locals.buildDependencyStamp(info.reads);\n if (stamp !== null) {\n const cached = this.evalCache.lookup(info.structuralKey, stamp);\n if (cached !== undefined) {\n return cached;\n }\n }\n }\n\n try {\n const result = this.dispatchVisitImpl(node);\n if (!this.disableCache && result !== null && info.cacheable && stamp !== null) {\n this.evalCache.store(info.structuralKey, stamp, result);\n }\n return result;\n } catch (error) {\n if (error instanceof CalcInvalidDataError) {\n return this.onError(RSErrorCode.calcInvalidData, node, [error.left, error.right, labelRSLangNode(node)]);\n }\n this.onError(RSErrorCode.calcUnknownError, node);\n return null;\n }\n }\n\n private dispatchVisitImpl(node: AstNode): Value | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n return this.visitGlobal(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n return this.visitLocal(node);\n\n case TokenID.LIT_INTEGER:\n return this.visitInteger(node);\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return this.onError(RSErrorCode.iterateInfinity, node);\n\n case TokenID.LIT_EMPTYSET:\n return EmptySetV;\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BOOL:\n return this.visitBool(node);\n\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.REDUCE:\n return this.visitReduce(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.onError(RSErrorCode.calculationNotSupported, node);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): Value | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitGlobal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n const value = this.context.get(alias) ?? null;\n if (value === null) {\n return this.onError(RSErrorCode.calcGlobalMissing, node, [alias]);\n }\n return value;\n }\n\n private visitLocal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n const value = this.locals.findLocal(alias);\n if (value === null) {\n return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n }\n return value;\n }\n\n private visitFunctionCall(node: AstNode): Value | null {\n const funcName = getNodeText(node.children[0]);\n const ast = this.treeContext.get(funcName);\n if (!ast) {\n return this.onError(RSErrorCode.calcGlobalMissing, node.children[0], [funcName]);\n }\n if (!this.tick(node, TICK_PER_FUNCTION)) {\n return null;\n }\n\n const args: Value[] = [];\n for (let i = 1; i < node.children.length; i++) {\n const arg = this.visitChild(node, i);\n if (arg === null) {\n return null;\n }\n args.push(arg);\n }\n\n this.locals.startScope();\n for (let i = 0; i < args.length; i++) {\n this.dispatchDeclare(ast.children[0].children[i], args[i]);\n }\n this.callSiteStack.push(node);\n let result: Value | null;\n try {\n result = this.visitChild(ast, 1);\n } finally {\n this.callSiteStack.pop();\n }\n this.locals.endScope();\n return result;\n }\n\n private visitInteger(node: AstNode): Value | null {\n const value = node.data.dataType === 'number' ? (node.data.value as number) : Number(node.data.value);\n return Math.floor(value);\n }\n\n private visitArithmetic(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n const v2 = this.visitChild(node, 1);\n if (v1 === null || v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n switch (node.typeID) {\n case TokenID.PLUS:\n return a + b;\n case TokenID.MINUS:\n return a - b;\n case TokenID.MULTIPLY:\n return a * b;\n }\n return null;\n }\n\n private visitCard(node: AstNode): Value | null {\n const base = this.visitChild(node, 0);\n if (base === null || !Array.isArray(base)) {\n return null;\n }\n return base.length;\n }\n\n private visitQuantifier(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1) as Value[];\n if (domain === null) {\n return null;\n }\n const isUniversal = node.typeID === TokenID.QUANTOR_UNIVERSAL;\n if (domain.length === 0) {\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n const varNodes = node.children[0].typeID === TokenID.NT_ENUM_DECL ? node.children[0].children : [node.children[0]];\n const count = domain.length;\n const iterators: number[] = [];\n for (const declaration of varNodes) {\n iterators.push(0);\n this.dispatchDeclare(declaration, domain[0]);\n }\n let finishIteration = false;\n while (!finishIteration) {\n const iterationValue = this.visitChild(node, 2);\n if (iterationValue === null) {\n return null;\n }\n if ((iterationValue === VALUE_TRUE) !== isUniversal) {\n return !isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n let incrementIndex = iterators.length - 1;\n while (true) {\n if (iterators[incrementIndex] < count - 1) {\n iterators[incrementIndex]++;\n if (!this.tick(node, TICK_PER_QUANTIFIER)) {\n return null;\n }\n this.dispatchDeclare(varNodes[incrementIndex], domain[iterators[incrementIndex]]);\n incrementIndex = iterators.length - 1;\n break;\n } else if (incrementIndex === 0) {\n finishIteration = true;\n break;\n } else {\n iterators[incrementIndex] = 0;\n this.dispatchDeclare(varNodes[incrementIndex], domain[0]);\n incrementIndex--;\n }\n }\n }\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitNegation(node: AstNode): Value | null {\n const value = this.visitChild(node, 0);\n if (value === null) {\n return null;\n }\n return (value as number) === VALUE_TRUE ? VALUE_FALSE : VALUE_TRUE;\n }\n\n private tryEvaluateFromFirstArg(op: number, first: boolean): Value | null {\n if ((op === TokenID.LOGIC_AND && !first) || (op === TokenID.LOGIC_OR && first)) {\n return first ? VALUE_TRUE : VALUE_FALSE;\n }\n if (op === TokenID.LOGIC_IMPLICATION && !first) {\n return VALUE_TRUE;\n }\n return null;\n }\n\n private visitLogicBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const b1 = v1 === VALUE_TRUE;\n const attempt = this.tryEvaluateFromFirstArg(node.typeID, b1);\n if (attempt !== null) {\n return attempt;\n }\n\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const b2 = v2 === VALUE_TRUE;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.LOGIC_AND:\n result = b1 && b2;\n break;\n case TokenID.LOGIC_OR:\n result = b1 || b2;\n break;\n case TokenID.LOGIC_IMPLICATION:\n result = !b1 || b2;\n break;\n case TokenID.LOGIC_EQUIVALENT:\n result = b1 === b2;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitEquals(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const areEqual = compare(v1, v2) === 0;\n return areEqual === (node.typeID !== TokenID.NOTEQUAL) ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitIntegerPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.GREATER:\n result = a > b;\n break;\n case TokenID.LESSER:\n result = a < b;\n break;\n case TokenID.GREATER_OR_EQ:\n result = a >= b;\n break;\n case TokenID.LESSER_OR_EQ:\n result = a <= b;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitSetexprPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n let result: boolean;\n switch (node.typeID) {\n case TokenID.SET_IN:\n result = contains(v2 as Value[], v1);\n break;\n case TokenID.SET_NOT_IN:\n result = !contains(v2 as Value[], v1);\n break;\n case TokenID.SUBSET:\n result = compare(v1, v2) !== 0 && isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.NOT_SUBSET:\n result = compare(v1, v2) === 0 || !isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.SUBSET_OR_EQ:\n result = isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitDecart(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i) as Value[];\n if (component === null) {\n return null;\n }\n if (component.length === 0) {\n return EmptySetV;\n }\n args.push(component);\n }\n const result = cartesianProduct(args as Value[][]);\n if (result === null) {\n this.onError(RSErrorCode.setOverflow, node, [String(SET_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): Value | null {\n const base = this.visitChild(node, 0) as Value[];\n if (base === null) {\n return null;\n }\n const result = boolean(base);\n if (result === null) {\n this.onError(RSErrorCode.booleanBaseLimit, node.children[0], [String(BOOL_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitTuple(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i);\n if (component === null) {\n return null;\n }\n args.push(component);\n }\n return tuple(args);\n }\n\n private visitEnumeration(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const element = this.visitChild(node, i);\n if (element === null) {\n return null;\n }\n args.push(element);\n }\n return set(args);\n }\n\n private visitBool(node: AstNode): Value | null {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n return [element];\n }\n\n private visitDebool(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n if (target.length !== 1) {\n return this.onError(RSErrorCode.calcInvalidDebool, node.children[0]);\n }\n return target[0];\n }\n\n private visitSetexprBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n switch (node.typeID) {\n case TokenID.SET_UNION:\n return setUnion(v1 as Value[], v2 as Value[]);\n case TokenID.SET_INTERSECTION:\n return setIntersection(v1 as Value[], v2 as Value[]);\n case TokenID.SET_MINUS:\n return setDiff(v1 as Value[], v2 as Value[]);\n case TokenID.SET_SYMMETRIC_MINUS:\n return setSymDiff(v1 as Value[], v2 as Value[]);\n }\n return null;\n }\n\n private visitProjectSet(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n return projection(target as Value[][], indices);\n }\n\n private visitProjectTuple(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n const components = indices.map(i => target[i]);\n return components.length === 1 ? components[0] : tuple(components);\n }\n\n private visitFilter(node: AstNode): Value | null {\n const lastIdx = node.children.length - 1;\n const argVal = this.visitChild(node, lastIdx) as Value[][];\n if (argVal === null) {\n return null;\n }\n if (argVal.length === 0) {\n return EmptySetV;\n }\n\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === lastIdx;\n if (tupleParam) {\n const params: Value[] = [];\n for (let i = 0; i < lastIdx; i++) {\n const param = this.visitChild(node, i) as Value[];\n if (param === null) {\n return null;\n }\n if (param.length === 0) {\n return EmptySetV;\n }\n params.push(param);\n }\n const result: Value[] = [];\n for (const element of argVal) {\n let valid = true;\n for (let j = 0; j < indices.length; j++) {\n const comp = element[indices[j]];\n const paramSet = params[j] as Value[];\n if (!contains(paramSet, comp)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n result.push(element);\n }\n }\n return result;\n } else {\n const paramVal = this.visitChild(node, 0) as Value[];\n if (paramVal === null) {\n return null;\n }\n if (paramVal.length === 0) {\n return EmptySetV;\n }\n\n const result: Value[] = [];\n for (const element of argVal) {\n const comps = indices.map(i => element[i]);\n const testElement = comps.length === 1 ? comps[0] : tuple(comps);\n if (contains(paramVal, testElement)) result.push(element);\n }\n return result;\n }\n }\n\n private visitReduce(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n return reduce(target as Value[][]);\n }\n\n private visitDeclarative(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1);\n if (domain === null) {\n return null;\n }\n\n const elements = [];\n for (const element of domain as Value[]) {\n if (!this.tick(node, TICK_PER_DECLARATIVE)) {\n return null;\n }\n this.dispatchDeclare(node.children[0], element);\n const value = this.visitChild(node, 2);\n if (value === null) {\n return null;\n }\n if (value === VALUE_TRUE) {\n elements.push(element);\n }\n }\n return elements.length === 0 ? EmptySetV : elements;\n }\n\n private visitImperative(node: AstNode): Value | null {\n const result: Value[] = [];\n const frames: IterationFrame[] = [];\n\n let currentChild = 1;\n\n // Advance to next iteration\n const advanceIterator = (): boolean => {\n while (frames.length > 0) {\n const top = frames[frames.length - 1];\n if (top.valueID < top.domain.length - 1) {\n top.valueID++;\n const nextValue = top.domain[top.valueID];\n if (!this.tick(node.children[top.childID], TICK_PER_IMPERATIVE)) {\n return false;\n }\n this.dispatchDeclare(node.children[top.childID].children[0], nextValue);\n currentChild = top.childID + 1;\n return true;\n }\n frames.pop();\n }\n return false;\n };\n\n while (true) {\n // Iteration end - create element and pop up stack\n if (currentChild >= node.children.length) {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n result.push(element);\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n\n // Iteration node\n const child = node.children[currentChild];\n if (child.typeID === TokenID.ITERATE) {\n const domain = this.visitChild(child, 1) as Value[];\n if (domain === null) {\n return null;\n }\n if (domain.length === 0) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n if (!this.tick(child, TICK_PER_IMPERATIVE)) {\n return null;\n }\n frames.push({\n childID: currentChild,\n domain,\n valueID: 0\n });\n this.dispatchDeclare(child.children[0], domain[0]);\n currentChild++;\n continue;\n }\n\n // Guard expression\n const value = this.dispatchVisit(child);\n if (value === null) {\n return null;\n }\n if (value === VALUE_FALSE) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n currentChild++;\n }\n return set(result);\n }\n\n private visitAssign(node: AstNode): Value | null {\n const value = this.visitChild(node, 1);\n if (value === null) {\n return null;\n }\n this.dispatchDeclare(node.children[0], value);\n return VALUE_TRUE;\n }\n\n private visitRecursion(node: AstNode): Value | null {\n const initialValue = this.visitChild(node, 1);\n if (initialValue === null) {\n return null;\n }\n const bodyIndex = node.typeID === TokenID.NT_RECURSIVE_FULL ? 3 : 2;\n let current: Value = initialValue;\n while (true) {\n if (!this.tick(node, TICK_PER_RECURSION)) {\n return null;\n }\n\n this.dispatchDeclare(node.children[0], current);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n const pred = this.visitChild(node, 2);\n if (pred === null) {\n return null;\n }\n if (pred !== VALUE_TRUE) {\n break;\n }\n }\n\n const next = this.visitChild(node, bodyIndex);\n if (next === null) {\n return null;\n }\n if (compare(current, next) === 0) {\n break;\n }\n current = next;\n }\n\n return current;\n }\n}\n\n/** Imperative iteration block data. */\ninterface IterationFrame {\n childID: number;\n domain: Value[];\n valueID: number;\n}\n\n/** Local variable binding with version for cache invalidation. */\ninterface LocalBinding {\n id: number;\n version: number;\n value: Value;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private nextBindingId = 1;\n private data = new Map<string, LocalBinding>();\n private callStack: Map<string, LocalBinding>[] = [];\n\n startScope(): void {\n this.callStack.push(this.data);\n this.data = new Map();\n }\n\n endScope(): void {\n this.data = this.callStack.pop()!;\n }\n\n setLocal(alias: string, value: Value): void {\n const existing = this.data.get(alias);\n if (existing) {\n existing.value = value;\n existing.version++;\n } else {\n this.data.set(alias, { id: this.nextBindingId++, version: 0, value });\n }\n }\n\n findLocal(alias: string): Value | null {\n return this.data.get(alias)?.value ?? null;\n }\n\n buildDependencyStamp(reads: ReadonlySet<string>): string | null {\n if (reads.size === 0) {\n return '';\n }\n const parts: string[] = [];\n for (const alias of [...reads].sort()) {\n const binding = this.data.get(alias);\n if (binding === undefined) {\n return null;\n }\n parts.push(`${binding.id}:${binding.version}`);\n }\n return parts.join('|');\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { boolean, cartesianProduct, contains, convertPathToType, extractValue, isSetValue, isSubsetOrEq, isTupleValue, makeDefaultValue, normalizeValue, printValue, projection, reduce, setDiff, setIntersection, setNestedValue, setSymDiff, setUnion, testInvalid, validateValue, valueStub };
|
|
1
|
+
export { p as boolean, m as cartesianProduct, h as contains, g as convertPathToType, _ as extractValue, v as isSetValue, y as isSubsetOrEq, b as isTupleValue, x as makeDefaultValue, S as normalizeValue, C as printValue, w as projection, T as reduce, E as setDiff, D as setIntersection, O as setNestedValue, k as setSymDiff, A as setUnion, j as testInvalid, M as validateValue, N as valueStub } from "../../value-BDISzQqI.js";
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { BOOL_INFINITY, CalcInvalidDataError, EmptySetV, INVALID_ELEMENT, SET_INFINITY, TUPLE_ID, VALUE_FALSE, VALUE_TRUE, compare, makeValuePath, set, tuple };
|
|
1
|
+
export { t as BOOL_INFINITY, n as CalcInvalidDataError, r as EmptySetV, i as INVALID_ELEMENT, a as SET_INFINITY, o as TUPLE_ID, s as VALUE_FALSE, c as VALUE_TRUE, l as compare, u as makeValuePath, d as set, f as tuple } from "../../value-BDISzQqI.js";
|
package/dist/rslang/index.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { A as makeTypePath, b as Typification, d as EmptySetT, f as ExpressionType, g as TypeClass, m as LogicT, t as AnyTypificationT, v as TypeID, y as TypePath } from "../typification-hWUoWCba.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { n as ArgumentsType } from "../arguments-extractor-CXWRT5Ou.js";
|
|
3
|
+
import { n as DELETED_ALIAS } from "../api-BRrnB6yd.js";
|
|
4
|
+
import { a as RSErrorDescription, i as RSErrorCode, n as EvalStackFrame, s as formatEvalCallStack } from "../error-DBbO_NIg.js";
|
|
5
|
+
import { i as readTypeAnnotation, r as readErrorAnnotation } from "../ast-annotations-B0XO6380.js";
|
|
4
6
|
import { d as ValuePath, l as Value, p as makeValuePath } from "../value-XpJOVzMP.js";
|
|
5
|
-
import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-
|
|
7
|
+
import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-SVf1trzN.js";
|
|
6
8
|
import { d as printValue } from "../value-api-Dw8UkwCD.js";
|
|
7
9
|
import { t as parser } from "../parser-DkejtiOR.js";
|
|
8
10
|
import { t as TokenID } from "../token-DeXAmzwr.js";
|
|
9
11
|
import { t as ValueClass } from "../value-class-CNI-lqXJ.js";
|
|
10
|
-
import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-
|
|
11
|
-
import { n as ArgumentsType } from "../arguments-extractor-CXWRT5Ou.js";
|
|
12
|
+
import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-BcPMzR38.js";
|
|
12
13
|
import { n as applyAsciiTypeSubstitutions, r as parseTypeText } from "../typification-parser-DFxj4JiQ.js";
|
|
13
14
|
import { n as TypificationNodeData, t as TypificationGraph } from "../typification-graph-CSxDt18X.js";
|
|
14
|
-
import "../index-
|
|
15
|
-
export { type AnalysisBase, type AnalysisFast, type AnalysisFull, AnyTypificationT, type ArgumentsType, type CalculatorEvaluateOptions, type CalculatorResult, EmptySetT, type EvalStackFrame, type ExpressionType, LogicT, RSCalculator, RSErrorCode, type RSErrorDescription, RSLangAnalyzer, TokenID, TypeClass, TypeID, type TypePath, type Typification, TypificationGraph, type TypificationNodeData, type Value, ValueClass, type ValuePath, applyAsciiTypeSubstitutions, formatEvalCallStack, makeTypePath, makeValuePath, parseTypeText, printValue, readErrorAnnotation, readTypeAnnotation, parser as rslangParser };
|
|
15
|
+
import "../index-CEUOBGLn.js";
|
|
16
|
+
export { type AnalysisBase, type AnalysisFast, type AnalysisFull, AnyTypificationT, type ArgumentsType, type CalculatorEvaluateOptions, type CalculatorResult, DELETED_ALIAS, EmptySetT, type EvalStackFrame, type ExpressionType, LogicT, RSCalculator, RSErrorCode, type RSErrorDescription, RSLangAnalyzer, TokenID, TypeClass, TypeID, type TypePath, type Typification, TypificationGraph, type TypificationNodeData, type Value, ValueClass, type ValuePath, applyAsciiTypeSubstitutions, formatEvalCallStack, makeTypePath, makeValuePath, parseTypeText, printValue, readErrorAnnotation, readTypeAnnotation, parser as rslangParser };
|
package/dist/rslang/index.js
CHANGED
|
@@ -2,11 +2,12 @@ import { TokenID } from "./parser/token.js";
|
|
|
2
2
|
import { AnyTypificationT, EmptySetT, LogicT, TypeClass, TypeID, makeTypePath } from "./semantic/typification.js";
|
|
3
3
|
import { parser } from "./parser/parser.js";
|
|
4
4
|
import { readErrorAnnotation, readTypeAnnotation } from "./ast-annotations.js";
|
|
5
|
+
import { DELETED_ALIAS } from "./api.js";
|
|
5
6
|
import { RSErrorCode, formatEvalCallStack } from "./error.js";
|
|
6
|
-
import { C as printValue, u as makeValuePath } from "../value-
|
|
7
|
+
import { C as printValue, u as makeValuePath } from "../value-BDISzQqI.js";
|
|
7
8
|
import { RSCalculator } from "./eval/calculator.js";
|
|
8
9
|
import { ValueClass } from "./semantic/value-class.js";
|
|
9
10
|
import { RSLangAnalyzer } from "./semantic/analyzer.js";
|
|
10
11
|
import { applyAsciiTypeSubstitutions, parseTypeText } from "./semantic/typification-parser.js";
|
|
11
12
|
import { TypificationGraph } from "./typification-graph.js";
|
|
12
|
-
export { AnyTypificationT, EmptySetT, LogicT, RSCalculator, RSErrorCode, RSLangAnalyzer, TokenID, TypeClass, TypeID, TypificationGraph, ValueClass, applyAsciiTypeSubstitutions, formatEvalCallStack, makeTypePath, makeValuePath, parseTypeText, printValue, readErrorAnnotation, readTypeAnnotation, parser as rslangParser };
|
|
13
|
+
export { AnyTypificationT, DELETED_ALIAS, EmptySetT, LogicT, RSCalculator, RSErrorCode, RSLangAnalyzer, TokenID, TypeClass, TypeID, TypificationGraph, ValueClass, applyAsciiTypeSubstitutions, formatEvalCallStack, makeTypePath, makeValuePath, parseTypeText, printValue, readErrorAnnotation, readTypeAnnotation, parser as rslangParser };
|
package/dist/rslang/labels.d.ts
CHANGED
|
@@ -4,15 +4,14 @@ import { f as ExpressionType } from "../typification-hWUoWCba.js";
|
|
|
4
4
|
import { t as TokenID } from "../token-DeXAmzwr.js";
|
|
5
5
|
//#region src/rslang/labels.d.ts
|
|
6
6
|
/** Retrieves label for {@link TokenID}. */
|
|
7
|
-
declare function labelToken(id: TokenID): string;
|
|
7
|
+
export declare function labelToken(id: TokenID): string;
|
|
8
8
|
/** Generates label for {@link AstNodeBase}. Unnormalized grammar nodes fall through to `node.data.value` (Lezer name). */
|
|
9
|
-
declare function labelRSLangNode(node: AstNodeBase): string;
|
|
9
|
+
export declare function labelRSLangNode(node: AstNodeBase): string;
|
|
10
10
|
/** Formats a base-set alias for display (mangled radicals `func<R#>` → `<func>R#`). */
|
|
11
|
-
declare function labelBaseId(baseID: string): string;
|
|
11
|
+
export declare function labelBaseId(baseID: string): string;
|
|
12
12
|
/** Converts expression type to string. */
|
|
13
|
-
declare function labelType(type: ExpressionType | null): string;
|
|
13
|
+
export declare function labelType(type: ExpressionType | null): string;
|
|
14
14
|
/** Converts expression type to normalized string. */
|
|
15
|
-
declare function normalizeType(type: ExpressionType | null): string;
|
|
15
|
+
export declare function normalizeType(type: ExpressionType | null): string;
|
|
16
16
|
//#endregion
|
|
17
|
-
export { labelBaseId, labelRSLangNode, labelToken, labelType, normalizeType };
|
|
18
17
|
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -2,7 +2,6 @@ import { t as AstNode } from "../../ast-D-D6Rq3T.js";
|
|
|
2
2
|
import "../../index-D5RahF1K.js";
|
|
3
3
|
//#region src/rslang/parser/normalize.d.ts
|
|
4
4
|
/** Normalizes AST to a simple form. */
|
|
5
|
-
declare function normalizeAST(ast: AstNode, input: string): void;
|
|
5
|
+
export declare function normalizeAST(ast: AstNode, input: string): void;
|
|
6
6
|
//#endregion
|
|
7
|
-
export { normalizeAST };
|
|
8
7
|
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","names":[],"sources":["../../../src/rslang/parser/normalize.ts"],"sourcesContent":["/**\n * Rewrites the Lezer parse tree into semantic {@link TokenID} nodes.\n *\n * Skips any node with `hasError` (subtree contains a parse `ERROR`). Those branches keep grammar\n * `typeID`s from `parser.terms` — the tree becomes **hybrid** until the expression is valid.\n * See `parser/README.md` (hybrid AST) and `syntax-errors/README.md`.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\n\nimport {\n Arguments,\n BigPr,\n Bool,\n Boolean,\n Card,\n Debool,\n Declaration,\n Declarative,\n EmptySet,\n Enumeration,\n Expr_enum_min2,\n Expression,\n Filter,\n Filter_expression,\n Function,\n Function_decl,\n Global,\n Imp_blocks,\n Imperative,\n Integer,\n IntegerSet,\n Local,\n Logic,\n Logic_binary,\n Logic_predicates,\n Logic_quantor,\n Logic_unary,\n Predicate,\n PrefixD,\n Radical,\n Recursion,\n Red,\n Setexpr,\n Setexpr_binary,\n SmallPr,\n Tuple,\n Variable,\n Variable_pack\n} from './parser.terms';\nimport { TokenID } from './token';\n\n/** Normalizes AST to a simple form. */\nexport function normalizeAST(ast: AstNode, input: string) {\n visitAstDFS(ast, node => normalizeNode(node, input));\n}\n\n// ====== Internals =========\nconst idRecord: Record<number, TokenID> = {\n [Global]: TokenID.ID_GLOBAL,\n [Local]: TokenID.ID_LOCAL,\n [Radical]: TokenID.ID_RADICAL,\n [Function]: TokenID.ID_FUNCTION,\n [Predicate]: TokenID.ID_PREDICATE,\n [Integer]: TokenID.LIT_INTEGER,\n [EmptySet]: TokenID.LIT_EMPTYSET,\n [IntegerSet]: TokenID.LIT_WHOLE_NUMBERS,\n\n [Boolean]: TokenID.BOOLEAN,\n\n [BigPr]: TokenID.BIGPR,\n [SmallPr]: TokenID.SMALLPR,\n [Filter]: TokenID.FILTER,\n\n [Bool]: TokenID.BOOL,\n [Debool]: TokenID.DEBOOL,\n [Red]: TokenID.REDUCE,\n [Card]: TokenID.CARD,\n\n [Enumeration]: TokenID.NT_ENUMERATION,\n [Tuple]: TokenID.NT_TUPLE,\n [Arguments]: TokenID.NT_ARGUMENTS,\n [Declaration]: TokenID.NT_ARG_DECL,\n [Function_decl]: TokenID.NT_FUNC_DEFINITION,\n [Variable_pack]: TokenID.NT_ENUM_DECL,\n [Declarative]: TokenID.NT_DECLARATIVE_EXPR,\n [Imperative]: TokenID.NT_IMPERATIVE_EXPR\n};\n\nfunction normalizeNode(node: AstNode, input: string) {\n if (node.hasError) {\n return;\n }\n switch (node.typeID) {\n case 0:\n return;\n\n case Expression:\n promoteSingleChild(node);\n return;\n\n case EmptySet:\n case IntegerSet:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'number';\n node.data.value = Number(input.slice(node.from, node.to));\n return;\n\n case Function:\n case Predicate:\n case Global:\n case Local:\n case Radical:\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string';\n node.data.value = input.slice(node.from, node.to);\n return;\n\n case Boolean:\n node.typeID = idRecord[node.typeID];\n if (node.children.length === 4) {\n node.children = [node.children[2]];\n } else {\n node.children = [node.children[1]];\n }\n clearData(node);\n return;\n\n case Filter:\n case BigPr:\n case SmallPr:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string[]';\n node.data.value = parseIndex(input.slice(node.from + 2, node.to));\n return;\n\n case Red:\n case Debool:\n case Bool:\n case Card:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Function_decl:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[1], node.children[3]];\n return;\n case Declaration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[0], node.children[2]];\n return;\n\n case Arguments:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children.length === 3) {\n processLeftEnum(node);\n }\n return;\n\n case Expr_enum_min2:\n processLeftEnum(node);\n return;\n\n case Setexpr:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else if (node.children.length === 4) {\n processTextFunction(node);\n }\n return;\n\n case Tuple:\n case Enumeration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[1].typeID === Expr_enum_min2) {\n for (const child of node.children[1].children) {\n child.parent = node;\n }\n node.children = node.children[1].children;\n } else {\n node.children = [node.children[1]];\n }\n return;\n\n case Logic_binary:\n case Logic_predicates:\n case Setexpr_binary:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n clearData(node);\n node.typeID = symbolToToken(node.children[1].data.value as string);\n if (node.typeID === TokenID.DECART) {\n processDecartChildren(node);\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n }\n return;\n\n case Filter_expression:\n processFilter(node);\n return;\n\n case Logic:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_unary:\n if (node.children[0].data.value === '¬') {\n clearData(node);\n node.typeID = TokenID.LOGIC_NOT;\n node.children = [node.children[1]];\n } else if (node.children[0].typeID === TokenID.ID_PREDICATE) {\n processTextFunction(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_quantor:\n clearData(node);\n node.typeID = symbolToToken(node.children[0].data.value as string);\n node.children = [node.children[1], node.children[3], node.children[4]];\n return;\n\n case Variable:\n convertTupleDeclaration(node.children[0]);\n promoteSingleChild(node);\n return;\n\n case Variable_pack:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else {\n node.typeID = idRecord[node.typeID];\n processLeftEnum(node);\n }\n return;\n\n case Declarative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[0].typeID === PrefixD) {\n node.children = [node.children[2], node.children[4], node.children[6]];\n } else {\n node.children = [node.children[1], node.children[3], node.children[5]];\n }\n return;\n\n case Imp_blocks:\n if (node.children.length === 1) {\n if (node.parent?.typeID === Imp_blocks) {\n promoteSingleChild(node);\n }\n } else {\n processLeftEnum(node);\n }\n return;\n\n case Imperative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n for (const child of node.children[4].children) {\n child.parent = node;\n }\n node.children = [node.children[2], ...node.children[4].children];\n return;\n\n case Recursion:\n if (node.children.length > 9) {\n node.typeID = TokenID.NT_RECURSIVE_FULL;\n node.children = [node.children[2], node.children[4], node.children[6], node.children[8]];\n } else {\n node.typeID = TokenID.NT_RECURSIVE_SHORT;\n node.children = [node.children[2], node.children[4], node.children[6]];\n }\n return;\n }\n}\n\nfunction convertTupleDeclaration(node: AstNode) {\n if (node.typeID !== TokenID.NT_TUPLE) {\n return;\n }\n node.typeID = TokenID.NT_TUPLE_DECL;\n for (const child of node.children) {\n convertTupleDeclaration(child);\n }\n}\n\nfunction clearData(node: AstNode) {\n node.data.value = null;\n node.data.dataType = 'null';\n}\n\nfunction promoteSingleChild(node: AstNode, index: number = 0) {\n for (const child of node.children[index].children) {\n child.parent = node;\n }\n node.typeID = node.children[index].typeID;\n node.data = node.children[index].data;\n node.parenthesis = node.children[index].parenthesis;\n node.children = node.children[index].children;\n}\n\nfunction parseIndex(text: string): string[] {\n return text.split(',');\n}\n\nfunction symbolToToken(symbol: string): TokenID {\n switch (symbol) {\n case '+':\n return TokenID.PLUS;\n case '-':\n return TokenID.MINUS;\n case '*':\n return TokenID.MULTIPLY;\n\n case '∪':\n return TokenID.SET_UNION;\n case '\\\\':\n return TokenID.SET_MINUS;\n case '∆':\n return TokenID.SET_SYMMETRIC_MINUS;\n case '∩':\n return TokenID.SET_INTERSECTION;\n case '×':\n return TokenID.DECART;\n\n case '∈':\n return TokenID.SET_IN;\n case '∉':\n return TokenID.SET_NOT_IN;\n case '⊆':\n return TokenID.SUBSET_OR_EQ;\n case '⊄':\n return TokenID.NOT_SUBSET;\n case '⊂':\n return TokenID.SUBSET;\n\n case '>':\n return TokenID.GREATER;\n case '≥':\n return TokenID.GREATER_OR_EQ;\n case '<':\n return TokenID.LESSER;\n case '≤':\n return TokenID.LESSER_OR_EQ;\n\n case '≠':\n return TokenID.NOTEQUAL;\n case '=':\n return TokenID.EQUAL;\n\n case ':∈':\n return TokenID.ITERATE;\n case ':=':\n return TokenID.ASSIGN;\n\n case '¬':\n return TokenID.LOGIC_NOT;\n\n case '⇔':\n return TokenID.LOGIC_EQUIVALENT;\n case '⇒':\n return TokenID.LOGIC_IMPLICATION;\n case '∨':\n return TokenID.LOGIC_OR;\n case '&':\n return TokenID.LOGIC_AND;\n\n case '∀':\n return TokenID.QUANTOR_UNIVERSAL;\n case '∃':\n return TokenID.QUANTOR_EXISTS;\n }\n return TokenID.ERROR;\n}\n\nfunction processParenthesis(node: AstNode) {\n promoteSingleChild(node, 1);\n node.parenthesis = true;\n}\n\nfunction processLeftEnum(node: AstNode) {\n if (node.children[0].typeID === node.typeID) {\n for (const child of node.children[0].children) {\n child.parent = node;\n }\n node.children = [...node.children[0].children, node.children[2]];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n}\n\nfunction processDecartChildren(node: AstNode) {\n const newChildren: AstNode[] = [];\n if (node.children[0].typeID === TokenID.DECART && !node.children[0].parenthesis) {\n for (const child of node.children[0].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[0]);\n }\n\n if (node.children[2].typeID === TokenID.DECART && !node.children[2].parenthesis) {\n for (const child of node.children[2].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[2]);\n }\n node.children = newChildren;\n}\n\nfunction processTextFunction(node: AstNode) {\n if (node.children[0].typeID === TokenID.ID_FUNCTION || node.children[0].typeID === TokenID.ID_PREDICATE) {\n node.typeID = TokenID.NT_FUNC_CALL;\n clearData(node);\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n }\n node.children = [node.children[0], ...node.children[2].children];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n } else {\n node.typeID = node.children[0].typeID;\n node.data = node.children[0].data;\n node.children = [node.children[2]];\n }\n}\n\nfunction processFilter(node: AstNode) {\n const children: AstNode[] = [];\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n children.push(child);\n }\n } else {\n children.push(node.children[2]);\n }\n children.push(node.children[5]);\n promoteSingleChild(node);\n node.children = children;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"normalize.js","names":[],"sources":["../../../src/rslang/parser/normalize.ts"],"sourcesContent":["/**\n * Rewrites the Lezer parse tree into semantic {@link TokenID} nodes.\n *\n * Skips any node with `hasError` (subtree contains a parse `ERROR`). Those branches keep grammar\n * `typeID`s from `parser.terms` — the tree becomes **hybrid** until the expression is valid.\n * See `parser/README.md` (hybrid AST) and `syntax-errors/README.md`.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\n\nimport {\n Arguments,\n BigPr,\n Bool,\n Boolean,\n Card,\n Debool,\n Declaration,\n Declarative,\n EmptySet,\n Enumeration,\n Expr_enum_min2,\n Expression,\n Filter,\n Filter_expression,\n Function,\n Function_decl,\n Global,\n Imp_blocks,\n Imperative,\n Integer,\n IntegerSet,\n Local,\n Logic,\n Logic_binary,\n Logic_predicates,\n Logic_quantor,\n Logic_unary,\n Predicate,\n PrefixD,\n Radical,\n Recursion,\n Red,\n Setexpr,\n Setexpr_binary,\n SmallPr,\n Tuple,\n Variable,\n Variable_pack\n} from './parser.terms';\nimport { TokenID } from './token';\n\n/** Normalizes AST to a simple form. */\nexport function normalizeAST(ast: AstNode, input: string) {\n visitAstDFS(ast, node => normalizeNode(node, input));\n}\n\n// ====== Internals =========\nconst idRecord: Record<number, TokenID> = {\n [Global]: TokenID.ID_GLOBAL,\n [Local]: TokenID.ID_LOCAL,\n [Radical]: TokenID.ID_RADICAL,\n [Function]: TokenID.ID_FUNCTION,\n [Predicate]: TokenID.ID_PREDICATE,\n [Integer]: TokenID.LIT_INTEGER,\n [EmptySet]: TokenID.LIT_EMPTYSET,\n [IntegerSet]: TokenID.LIT_WHOLE_NUMBERS,\n\n [Boolean]: TokenID.BOOLEAN,\n\n [BigPr]: TokenID.BIGPR,\n [SmallPr]: TokenID.SMALLPR,\n [Filter]: TokenID.FILTER,\n\n [Bool]: TokenID.BOOL,\n [Debool]: TokenID.DEBOOL,\n [Red]: TokenID.REDUCE,\n [Card]: TokenID.CARD,\n\n [Enumeration]: TokenID.NT_ENUMERATION,\n [Tuple]: TokenID.NT_TUPLE,\n [Arguments]: TokenID.NT_ARGUMENTS,\n [Declaration]: TokenID.NT_ARG_DECL,\n [Function_decl]: TokenID.NT_FUNC_DEFINITION,\n [Variable_pack]: TokenID.NT_ENUM_DECL,\n [Declarative]: TokenID.NT_DECLARATIVE_EXPR,\n [Imperative]: TokenID.NT_IMPERATIVE_EXPR\n};\n\nfunction normalizeNode(node: AstNode, input: string) {\n if (node.hasError) {\n return;\n }\n switch (node.typeID) {\n case 0:\n return;\n\n case Expression:\n promoteSingleChild(node);\n return;\n\n case EmptySet:\n case IntegerSet:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'number';\n node.data.value = Number(input.slice(node.from, node.to));\n return;\n\n case Function:\n case Predicate:\n case Global:\n case Local:\n case Radical:\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string';\n node.data.value = input.slice(node.from, node.to);\n return;\n\n case Boolean:\n node.typeID = idRecord[node.typeID];\n if (node.children.length === 4) {\n node.children = [node.children[2]];\n } else {\n node.children = [node.children[1]];\n }\n clearData(node);\n return;\n\n case Filter:\n case BigPr:\n case SmallPr:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string[]';\n node.data.value = parseIndex(input.slice(node.from + 2, node.to));\n return;\n\n case Red:\n case Debool:\n case Bool:\n case Card:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Function_decl:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[1], node.children[3]];\n return;\n case Declaration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[0], node.children[2]];\n return;\n\n case Arguments:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children.length === 3) {\n processLeftEnum(node);\n }\n return;\n\n case Expr_enum_min2:\n processLeftEnum(node);\n return;\n\n case Setexpr:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else if (node.children.length === 4) {\n processTextFunction(node);\n }\n return;\n\n case Tuple:\n case Enumeration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[1].typeID === Expr_enum_min2) {\n for (const child of node.children[1].children) {\n child.parent = node;\n }\n node.children = node.children[1].children;\n } else {\n node.children = [node.children[1]];\n }\n return;\n\n case Logic_binary:\n case Logic_predicates:\n case Setexpr_binary:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n clearData(node);\n node.typeID = symbolToToken(node.children[1].data.value as string);\n if (node.typeID === TokenID.DECART) {\n processDecartChildren(node);\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n }\n return;\n\n case Filter_expression:\n processFilter(node);\n return;\n\n case Logic:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_unary:\n if (node.children[0].data.value === '¬') {\n clearData(node);\n node.typeID = TokenID.LOGIC_NOT;\n node.children = [node.children[1]];\n } else if (node.children[0].typeID === TokenID.ID_PREDICATE) {\n processTextFunction(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_quantor:\n clearData(node);\n node.typeID = symbolToToken(node.children[0].data.value as string);\n node.children = [node.children[1], node.children[3], node.children[4]];\n return;\n\n case Variable:\n convertTupleDeclaration(node.children[0]);\n promoteSingleChild(node);\n return;\n\n case Variable_pack:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else {\n node.typeID = idRecord[node.typeID];\n processLeftEnum(node);\n }\n return;\n\n case Declarative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[0].typeID === PrefixD) {\n node.children = [node.children[2], node.children[4], node.children[6]];\n } else {\n node.children = [node.children[1], node.children[3], node.children[5]];\n }\n return;\n\n case Imp_blocks:\n if (node.children.length === 1) {\n if (node.parent?.typeID === Imp_blocks) {\n promoteSingleChild(node);\n }\n } else {\n processLeftEnum(node);\n }\n return;\n\n case Imperative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n for (const child of node.children[4].children) {\n child.parent = node;\n }\n node.children = [node.children[2], ...node.children[4].children];\n return;\n\n case Recursion:\n if (node.children.length > 9) {\n node.typeID = TokenID.NT_RECURSIVE_FULL;\n node.children = [node.children[2], node.children[4], node.children[6], node.children[8]];\n } else {\n node.typeID = TokenID.NT_RECURSIVE_SHORT;\n node.children = [node.children[2], node.children[4], node.children[6]];\n }\n return;\n }\n}\n\nfunction convertTupleDeclaration(node: AstNode) {\n if (node.typeID !== TokenID.NT_TUPLE) {\n return;\n }\n node.typeID = TokenID.NT_TUPLE_DECL;\n for (const child of node.children) {\n convertTupleDeclaration(child);\n }\n}\n\nfunction clearData(node: AstNode) {\n node.data.value = null;\n node.data.dataType = 'null';\n}\n\nfunction promoteSingleChild(node: AstNode, index: number = 0) {\n for (const child of node.children[index].children) {\n child.parent = node;\n }\n node.typeID = node.children[index].typeID;\n node.data = node.children[index].data;\n node.parenthesis = node.children[index].parenthesis;\n node.children = node.children[index].children;\n}\n\nfunction parseIndex(text: string): string[] {\n return text.split(',');\n}\n\nfunction symbolToToken(symbol: string): TokenID {\n switch (symbol) {\n case '+':\n return TokenID.PLUS;\n case '-':\n return TokenID.MINUS;\n case '*':\n return TokenID.MULTIPLY;\n\n case '∪':\n return TokenID.SET_UNION;\n case '\\\\':\n return TokenID.SET_MINUS;\n case '∆':\n return TokenID.SET_SYMMETRIC_MINUS;\n case '∩':\n return TokenID.SET_INTERSECTION;\n case '×':\n return TokenID.DECART;\n\n case '∈':\n return TokenID.SET_IN;\n case '∉':\n return TokenID.SET_NOT_IN;\n case '⊆':\n return TokenID.SUBSET_OR_EQ;\n case '⊄':\n return TokenID.NOT_SUBSET;\n case '⊂':\n return TokenID.SUBSET;\n\n case '>':\n return TokenID.GREATER;\n case '≥':\n return TokenID.GREATER_OR_EQ;\n case '<':\n return TokenID.LESSER;\n case '≤':\n return TokenID.LESSER_OR_EQ;\n\n case '≠':\n return TokenID.NOTEQUAL;\n case '=':\n return TokenID.EQUAL;\n\n case ':∈':\n return TokenID.ITERATE;\n case ':=':\n return TokenID.ASSIGN;\n\n case '¬':\n return TokenID.LOGIC_NOT;\n\n case '⇔':\n return TokenID.LOGIC_EQUIVALENT;\n case '⇒':\n return TokenID.LOGIC_IMPLICATION;\n case '∨':\n return TokenID.LOGIC_OR;\n case '&':\n return TokenID.LOGIC_AND;\n\n case '∀':\n return TokenID.QUANTOR_UNIVERSAL;\n case '∃':\n return TokenID.QUANTOR_EXISTS;\n }\n return TokenID.ERROR;\n}\n\nfunction processParenthesis(node: AstNode) {\n promoteSingleChild(node, 1);\n node.parenthesis = true;\n}\n\nfunction processLeftEnum(node: AstNode) {\n if (node.children[0].typeID === node.typeID) {\n for (const child of node.children[0].children) {\n child.parent = node;\n }\n node.children = [...node.children[0].children, node.children[2]];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n}\n\nfunction processDecartChildren(node: AstNode) {\n const newChildren: AstNode[] = [];\n if (node.children[0].typeID === TokenID.DECART && !node.children[0].parenthesis) {\n for (const child of node.children[0].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[0]);\n }\n\n if (node.children[2].typeID === TokenID.DECART && !node.children[2].parenthesis) {\n for (const child of node.children[2].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[2]);\n }\n node.children = newChildren;\n}\n\nfunction processTextFunction(node: AstNode) {\n if (node.children[0].typeID === TokenID.ID_FUNCTION || node.children[0].typeID === TokenID.ID_PREDICATE) {\n node.typeID = TokenID.NT_FUNC_CALL;\n clearData(node);\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n }\n node.children = [node.children[0], ...node.children[2].children];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n } else {\n node.typeID = node.children[0].typeID;\n node.data = node.children[0].data;\n node.children = [node.children[2]];\n }\n}\n\nfunction processFilter(node: AstNode) {\n const children: AstNode[] = [];\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n children.push(child);\n }\n } else {\n children.push(node.children[2]);\n }\n children.push(node.children[5]);\n promoteSingleChild(node);\n node.children = children;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
//#region src/rslang/parser/parser.terms.d.ts
|
|
2
|
-
declare const Expression = 1, Logic = 2, Logic_predicates = 3, Variable = 4, Local = 5, Tuple = 8, Expr_enum_min2 = 9, Logic_unary = 24, Predicate = 26, Logic_quantor = 29, Variable_pack = 31, Logic_binary = 33, Setexpr = 38, Integer = 39, EmptySet = 40, IntegerSet = 41, Global = 42, Radical = 43, Setexpr_binary = 44, Enumeration = 55, Boolean = 56, Filter_expression = 58, Filter = 59, Declarative = 60, PrefixD = 62, PrefixI = 63, Imperative = 64, Imp_blocks = 65, PrefixR = 67, Recursion = 68, Function = 69, BigPr = 70, SmallPr = 71, Card = 72, Bool = 73, Debool = 74, Red = 75, Function_decl = 76, Arguments = 77, Declaration = 78;
|
|
2
|
+
export declare const Expression = 1, Logic = 2, Logic_predicates = 3, Variable = 4, Local = 5, Tuple = 8, Expr_enum_min2 = 9, Logic_unary = 24, Predicate = 26, Logic_quantor = 29, Variable_pack = 31, Logic_binary = 33, Setexpr = 38, Integer = 39, EmptySet = 40, IntegerSet = 41, Global = 42, Radical = 43, Setexpr_binary = 44, Enumeration = 55, Boolean = 56, Filter_expression = 58, Filter = 59, Declarative = 60, PrefixD = 62, PrefixI = 63, Imperative = 64, Imp_blocks = 65, PrefixR = 67, Recursion = 68, Function = 69, BigPr = 70, SmallPr = 71, Card = 72, Bool = 73, Debool = 74, Red = 75, Function_decl = 76, Arguments = 77, Declaration = 78;
|
|
3
3
|
//#endregion
|
|
4
|
-
export { Arguments, BigPr, Bool, Boolean, Card, Debool, Declaration, Declarative, EmptySet, Enumeration, Expr_enum_min2, Expression, Filter, Filter_expression, Function, Function_decl, Global, Imp_blocks, Imperative, Integer, IntegerSet, Local, Logic, Logic_binary, Logic_predicates, Logic_quantor, Logic_unary, Predicate, PrefixD, PrefixI, PrefixR, Radical, Recursion, Red, Setexpr, Setexpr_binary, SmallPr, Tuple, Variable, Variable_pack };
|
|
5
4
|
//# sourceMappingURL=parser.terms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.terms.js","names":[],"sources":["../../../src/rslang/parser/parser.terms.ts"],"sourcesContent":["// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Expression = 1,\n Logic = 2,\n Logic_predicates = 3,\n Variable = 4,\n Local = 5,\n Tuple = 8,\n Expr_enum_min2 = 9,\n Logic_unary = 24,\n Predicate = 26,\n Logic_quantor = 29,\n Variable_pack = 31,\n Logic_binary = 33,\n Setexpr = 38,\n Integer = 39,\n EmptySet = 40,\n IntegerSet = 41,\n Global = 42,\n Radical = 43,\n Setexpr_binary = 44,\n Enumeration = 55,\n Boolean = 56,\n Filter_expression = 58,\n Filter = 59,\n Declarative = 60,\n PrefixD = 62,\n PrefixI = 63,\n Imperative = 64,\n Imp_blocks = 65,\n PrefixR = 67,\n Recursion = 68,\n Function = 69,\n BigPr = 70,\n SmallPr = 71,\n Card = 72,\n Bool = 73,\n Debool = 74,\n Red = 75,\n Function_decl = 76,\n Arguments = 77,\n Declaration = 78\n"],"mappings":";AACA,MACE,aAAa;
|
|
1
|
+
{"version":3,"file":"parser.terms.js","names":[],"sources":["../../../src/rslang/parser/parser.terms.ts"],"sourcesContent":["// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Expression = 1,\n Logic = 2,\n Logic_predicates = 3,\n Variable = 4,\n Local = 5,\n Tuple = 8,\n Expr_enum_min2 = 9,\n Logic_unary = 24,\n Predicate = 26,\n Logic_quantor = 29,\n Variable_pack = 31,\n Logic_binary = 33,\n Setexpr = 38,\n Integer = 39,\n EmptySet = 40,\n IntegerSet = 41,\n Global = 42,\n Radical = 43,\n Setexpr_binary = 44,\n Enumeration = 55,\n Boolean = 56,\n Filter_expression = 58,\n Filter = 59,\n Declarative = 60,\n PrefixD = 62,\n PrefixI = 63,\n Imperative = 64,\n Imp_blocks = 65,\n PrefixR = 67,\n Recursion = 68,\n Function = 69,\n BigPr = 70,\n SmallPr = 71,\n Card = 72,\n Bool = 73,\n Debool = 74,\n Red = 75,\n Function_decl = 76,\n Arguments = 77,\n Declaration = 78\n"],"mappings":";AACA,MACE,aAAa;AACb,MAAA,QAAQ;AACR,MAAA,mBAAmB;AACnB,MAAA,WAAW;AACX,MAAA,QAAQ;AACR,MAAA,QAAQ;AACR,MAAA,iBAAiB;AACjB,MAAA,cAAc;AACd,MAAA,YAAY;AACZ,MAAA,gBAAgB;AAChB,MAAA,gBAAgB;AAChB,MAAA,eAAe;AACf,MAAA,UAAU;AACV,MAAA,UAAU;AACV,MAAA,WAAW;AACX,MAAA,aAAa;AACb,MAAA,SAAS;AACT,MAAA,UAAU;AACV,MAAA,iBAAiB;AACjB,MAAA,cAAc;AACd,MAAA,UAAU;AACV,MAAA,oBAAoB;AACpB,MAAA,SAAS;AACT,MAAA,cAAc;AACd,MAAA,UAAU;AACV,MAAA,UAAU;AACV,MAAA,aAAa;AACb,MAAA,aAAa;AACb,MAAA,UAAU;AACV,MAAA,YAAY;AACZ,MAAA,WAAW;AACX,MAAA,QAAQ;AACR,MAAA,UAAU;AACV,MAAA,OAAO;AACP,MAAA,OAAO;AACP,MAAA,SAAS;AACT,MAAA,MAAM;AACN,MAAA,gBAAgB;AAChB,MAAA,YAAY;AACZ,MAAA,cAAc"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as AstNode } from "../../../ast-D-D6Rq3T.js";
|
|
2
2
|
import "../../../index-D5RahF1K.js";
|
|
3
3
|
import { g as TypeClass } from "../../../typification-hWUoWCba.js";
|
|
4
|
-
import { t as ErrorReporter } from "../../../error-
|
|
4
|
+
import { t as ErrorReporter } from "../../../error-DBbO_NIg.js";
|
|
5
5
|
//#region src/rslang/parser/syntax-errors/index.d.ts
|
|
6
6
|
/** When set, refines incomplete formal headers (`[α∈…]`, quantifiers). */
|
|
7
|
-
interface SyntaxErrorOptions {
|
|
7
|
+
export interface SyntaxErrorOptions {
|
|
8
8
|
expected?: TypeClass;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
@@ -16,7 +16,6 @@ interface SyntaxErrorOptions {
|
|
|
16
16
|
* @param annotateErrors - When true, also calls `annotateError` on the triggering node
|
|
17
17
|
* @param options - Optional typification hint for incomplete formal expressions
|
|
18
18
|
*/
|
|
19
|
-
declare function extractSyntaxErrors(ast: AstNode, expression: string, reporter: ErrorReporter, annotateErrors?: boolean, options?: SyntaxErrorOptions): void;
|
|
19
|
+
export declare function extractSyntaxErrors(ast: AstNode, expression: string, reporter: ErrorReporter, annotateErrors?: boolean, options?: SyntaxErrorOptions): void;
|
|
20
20
|
//#endregion
|
|
21
|
-
export { SyntaxErrorOptions, extractSyntaxErrors };
|
|
22
21
|
//# sourceMappingURL=index.d.ts.map
|