@rsconcept/domain 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
- package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
- package/dist/ast-C8sIpKdL.d.ts +51 -0
- package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
- package/dist/branded-ZlzIcxzu.d.ts +9 -0
- package/dist/calculator-C9W2jkSx.d.ts +39 -0
- package/dist/cctext/index.d.ts +2 -1
- package/dist/cctext/index.js +2 -42
- package/dist/cctext/language-api.d.ts +10 -12
- package/dist/cctext/language-api.js +157 -227
- package/dist/cctext/language-api.js.map +1 -1
- package/dist/cctext/language.d.ts +24 -22
- package/dist/cctext/language.js +43 -39
- package/dist/cctext/language.js.map +1 -1
- package/dist/error-E1LVq_3w.d.ts +87 -0
- package/dist/graph/graph.d.ts +2 -62
- package/dist/graph/graph.js +339 -382
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +2 -1
- package/dist/graph/index.js +2 -384
- package/dist/graph-DR8rL2o3.d.ts +64 -0
- package/dist/hash-Y8I4c6Al.d.ts +8 -0
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-DmtQKWjk.d.ts +1 -0
- package/dist/index-_6s0AX1B.d.ts +1 -0
- package/dist/index.d.ts +27 -28
- package/dist/index.js +23 -5851
- package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
- package/dist/library/folder-tree.d.ts +22 -20
- package/dist/library/folder-tree.js +108 -130
- package/dist/library/folder-tree.js.map +1 -1
- package/dist/library/index.d.ts +8 -17
- package/dist/library/index.js +7 -2800
- package/dist/library/library-api.d.ts +3 -1
- package/dist/library/library-api.js +9 -8
- package/dist/library/library-api.js.map +1 -1
- package/dist/library/library.d.ts +2 -56
- package/dist/library/library.js +23 -19
- package/dist/library/library.js.map +1 -1
- package/dist/library/oss-api.d.ts +26 -37
- package/dist/library/oss-api.js +257 -1096
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss-layout-api.d.ts +28 -28
- package/dist/library/oss-layout-api.js +239 -316
- package/dist/library/oss-layout-api.js.map +1 -1
- package/dist/library/oss-layout.d.ts +2 -25
- package/dist/library/oss-layout.js +1 -1
- package/dist/library/oss.d.ts +87 -89
- package/dist/library/oss.js +27 -26
- package/dist/library/oss.js.map +1 -1
- package/dist/library/rsengine.d.ts +100 -106
- package/dist/library/rsengine.js +439 -2599
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api.d.ts +11 -16
- package/dist/library/rsform-api.js +313 -825
- package/dist/library/rsform-api.js.map +1 -1
- package/dist/library/rsform.d.ts +159 -167
- package/dist/library/rsform.js +29 -28
- package/dist/library/rsform.js.map +1 -1
- package/dist/library/rsmodel-api.d.ts +8 -15
- package/dist/library/rsmodel-api.js +172 -813
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/rsmodel.d.ts +27 -33
- package/dist/library/rsmodel.js +16 -23
- package/dist/library/rsmodel.js.map +1 -1
- package/dist/library/structure-planner.d.ts +20 -26
- package/dist/library/structure-planner.js +106 -474
- package/dist/library/structure-planner.js.map +1 -1
- package/dist/library-CYun28Xz.d.ts +58 -0
- package/dist/oss-layout-3glgAqfn.d.ts +27 -0
- package/dist/parser-Bwd8LxJ1.d.ts +7 -0
- package/dist/parsing/ast.d.ts +2 -49
- package/dist/parsing/ast.js +68 -76
- package/dist/parsing/ast.js.map +1 -1
- package/dist/parsing/index.d.ts +3 -3
- package/dist/parsing/index.js +3 -141
- package/dist/parsing/lezer-tree.d.ts +2 -13
- package/dist/parsing/lezer-tree.js +50 -43
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.d.ts +9 -14
- package/dist/rslang/api.js +114 -827
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/ast-annotations.d.ts +2 -18
- package/dist/rslang/ast-annotations.js +34 -45
- package/dist/rslang/ast-annotations.js.map +1 -1
- package/dist/rslang/error.d.ts +2 -85
- package/dist/rslang/error.js +88 -150
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +2 -43
- package/dist/rslang/eval/calculator.js +81 -1636
- package/dist/rslang/eval/calculator.js.map +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
- package/dist/rslang/eval/evaluation-cache.js +168 -287
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.d.ts +59 -63
- package/dist/rslang/eval/evaluator.js +602 -1509
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.d.ts +2 -48
- package/dist/rslang/eval/value-api.js +2 -490
- package/dist/rslang/eval/value.d.ts +2 -36
- package/dist/rslang/eval/value.js +2 -118
- package/dist/rslang/index.d.ts +14 -17
- package/dist/rslang/index.js +12 -4314
- package/dist/rslang/labels.d.ts +6 -6
- package/dist/rslang/labels.js +139 -305
- package/dist/rslang/labels.js.map +1 -1
- package/dist/rslang/parser/expression-generator.d.ts +5 -5
- package/dist/rslang/parser/expression-generator.js +248 -446
- package/dist/rslang/parser/expression-generator.js.map +1 -1
- package/dist/rslang/parser/normalize.d.ts +4 -8
- package/dist/rslang/parser/normalize.js +286 -481
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.d.ts +2 -5
- package/dist/rslang/parser/parser.js +30 -21
- package/dist/rslang/parser/parser.js.map +1 -1
- package/dist/rslang/parser/parser.terms.d.ts +43 -41
- package/dist/rslang/parser/parser.terms.js +44 -83
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/parser/syntax-errors.d.ts +5 -8
- package/dist/rslang/parser/syntax-errors.js +113 -382
- package/dist/rslang/parser/syntax-errors.js.map +1 -1
- package/dist/rslang/parser/token.d.ts +2 -79
- package/dist/rslang/parser/token.js +81 -93
- package/dist/rslang/parser/token.js.map +1 -1
- package/dist/rslang/semantic/analyzer.d.ts +2 -39
- package/dist/rslang/semantic/analyzer.js +186 -2600
- package/dist/rslang/semantic/analyzer.js.map +1 -1
- package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
- package/dist/rslang/semantic/arguments-extractor.js +202 -361
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +64 -68
- package/dist/rslang/semantic/type-auditor.js +594 -1564
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.d.ts +4 -7
- package/dist/rslang/semantic/typification-api.js +162 -303
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.d.ts +2 -12
- package/dist/rslang/semantic/typification-parser.js +165 -219
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/rslang/semantic/typification.d.ts +2 -119
- package/dist/rslang/semantic/typification.js +66 -52
- package/dist/rslang/semantic/typification.js.map +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +32 -38
- package/dist/rslang/semantic/value-auditor.js +206 -518
- package/dist/rslang/semantic/value-auditor.js.map +1 -1
- package/dist/rslang/semantic/value-class.d.ts +2 -10
- package/dist/rslang/semantic/value-class.js +8 -7
- package/dist/rslang/semantic/value-class.js.map +1 -1
- package/dist/rslang/typification-graph.d.ts +2 -33
- package/dist/rslang/typification-graph.js +94 -306
- package/dist/rslang/typification-graph.js.map +1 -1
- package/dist/shared/branded.d.ts +2 -7
- package/dist/shared/branded.js +1 -1
- package/dist/shared/hash.d.ts +2 -6
- package/dist/shared/hash.js +13 -13
- package/dist/shared/hash.js.map +1 -1
- package/dist/shared/index.d.ts +3 -2
- package/dist/shared/index.js +2 -18
- package/dist/token-DeXAmzwr.d.ts +81 -0
- package/dist/typification-Dk-fisgO.d.ts +120 -0
- package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
- package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
- package/dist/value-B8UtCqaK.js +366 -0
- package/dist/value-B8UtCqaK.js.map +1 -0
- package/dist/value-CTjX6825.d.ts +33 -0
- package/dist/value-api-Bw-SgaYY.d.ts +49 -0
- package/dist/value-class-CNI-lqXJ.d.ts +12 -0
- package/package.json +8 -8
- package/src/library/rsform-api.test.ts +24 -0
- package/src/library/rsform-api.ts +12 -4
- package/dist/cctext/index.js.map +0 -1
- package/dist/graph/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/library/index.js.map +0 -1
- package/dist/library/oss-layout.js.map +0 -1
- package/dist/parsing/index.js.map +0 -1
- package/dist/rslang/eval/value-api.js.map +0 -1
- package/dist/rslang/eval/value.js.map +0 -1
- package/dist/rslang/index.js.map +0 -1
- package/dist/shared/branded.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
package/dist/rslang/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/parsing/ast.ts","../../src/rslang/ast-annotations.ts","../../src/rslang/parser/token.ts","../../src/rslang/semantic/arguments-extractor.ts","../../src/rslang/parser/expression-generator.ts","../../src/rslang/api.ts"],"sourcesContent":["import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { readTypeAnnotation } from '../ast-annotations';\nimport { TokenID } from '../parser/token';\n\nimport { type ExpressionType } from './typification';\n\n/** Represents function argument definition. */\nexport interface ArgumentsType {\n alias: string;\n type: ExpressionType | null;\n}\n\n/** Type auditor for AST type checking.\n * Warning! Assumes that the AST is well-formed and annotated with types.\n */\nexport class ArgumentsExtractor {\n private locals: LocalContext = new LocalContext();\n private result: ArgumentsType[] = [];\n\n public run(ast: AstNode): ArgumentsType[] {\n if (ast.hasError) {\n return [];\n }\n this.result = [];\n this.locals.clear();\n this.dispatchVisit(ast);\n return this.result;\n }\n\n private dispatchDeclare(node: AstNode): boolean {\n return this.processDeclare(node);\n }\n\n private processDeclare(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node);\n }\n return false;\n }\n\n private declareLocal(node: AstNode): boolean {\n this.locals.pushLocal(node);\n return true;\n }\n\n private declareTuple(node: AstNode): boolean {\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): boolean {\n return this.processVisit(node);\n }\n\n private processVisit(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.LIT_EMPTYSET:\n return true;\n\n case TokenID.CARD:\n case TokenID.FILTER:\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\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 case TokenID.DECART:\n case TokenID.BOOLEAN:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.LOGIC_NOT:\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n case TokenID.NT_ARGUMENTS:\n return this.visitAllAndReturn(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitQuantifier(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterate(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return false;\n }\n\n private visitChild(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number): boolean {\n return index < node.children.length && this.dispatchDeclare(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode): boolean {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n if (!this.locals.checkLocal(node) && this.result.find(arg => arg.alias === alias) === undefined) {\n this.result.push({ alias, type: readTypeAnnotation(node) });\n }\n return true;\n }\n\n private visitFunctionDefinition(node: AstNode): boolean {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 1)) {\n return false;\n }\n this.locals.endScope();\n return true;\n }\n\n private visitFunctionCall(node: AstNode): boolean {\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n return true;\n }\n\n private visitArgument(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitQuantifier(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n if (!this.visitChild(node, 2)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitImperative(node: AstNode): boolean {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.visitChild(node, child)) {\n return false;\n }\n }\n\n if (!this.visitChild(node, 0)) {\n return false;\n }\n\n this.locals.endScope();\n return true;\n }\n\n private visitIterate(node: AstNode): boolean {\n return this.visitChild(node, 1) && this.visitChildDeclaration(node, 0);\n }\n\n private visitRecursion(node: AstNode): boolean {\n this.locals.startScope();\n\n if (!this.visitChild(node, 1)) {\n return false;\n }\n if (!this.visitChildDeclaration(node, 0)) {\n return false;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n if (!this.visitChild(node, iterationIndex)) {\n return false;\n }\n\n if (isFull) {\n if (!this.visitChild(node, 2)) {\n return false;\n }\n }\n\n this.locals.endScope();\n return true;\n }\n}\n\n// ========= Internals ========\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n}\n\n/** Local variables context. */\nclass LocalContext {\n public data: LocalData[] = [];\n\n clear(): void {\n this.data = [];\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(): void {\n for (const local of this.data) {\n local.level--;\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode) {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n return;\n } else {\n const index = this.data.indexOf(existing);\n if (index !== -1) {\n this.data.splice(index, 1);\n }\n }\n }\n this.data.push({ alias, level: 1 });\n }\n\n checkLocal(node: AstNode): boolean {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n return local !== undefined;\n }\n}\n","import { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\n\nimport { TokenID } from './token';\n\ninterface ExpressionGeneratorOptions {\n normalize?: boolean;\n}\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nexport function generateExpressionFromAst(ast: AstNode, options: ExpressionGeneratorOptions = {}): string {\n return new ExpressionGenerator(options).run(ast);\n}\n\ninterface VisitContext {\n localDeclaration: boolean;\n}\n\ntype ScopeFrame = Map<string, string>;\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nclass ExpressionGenerator {\n private readonly options: ExpressionGeneratorOptions;\n private readonly freeLocals = new Map<string, string>();\n private readonly radicals = new Map<string, string>();\n private readonly scopes: ScopeFrame[] = [];\n private localCounter = 0;\n private radicalCounter = 0;\n\n constructor(options: ExpressionGeneratorOptions) {\n this.options = options;\n }\n\n /** Run generator. Requires that the AST has no syntax errors. */\n run(ast: AstNode): string {\n if (ast.hasError) {\n throw new Error('Cannot generate expression: AST has error');\n }\n return this.visit(ast, { localDeclaration: false });\n }\n\n private visit(node: AstNode, context: VisitContext): string {\n const shouldScope = this.shouldStartScope(node.typeID);\n if (shouldScope) {\n this.startScope();\n }\n\n const result = this.renderNode(node, context);\n\n if (shouldScope) {\n this.endScope();\n }\n return result;\n }\n\n private renderNode(node: AstNode, context: VisitContext): string {\n switch (node.typeID) {\n case TokenID.ID_LOCAL: {\n const alias = getNodeText(node);\n return this.options.normalize\n ? context.localDeclaration\n ? this.declareLocal(alias)\n : this.resolveLocal(alias)\n : alias;\n }\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return getNodeText(node);\n case TokenID.ID_RADICAL: {\n const alias = getNodeText(node);\n return this.options.normalize ? this.resolveRadical(alias) : alias;\n }\n case TokenID.LIT_INTEGER:\n return String(node.data.value);\n case TokenID.LIT_WHOLE_NUMBERS:\n return 'Z';\n case TokenID.LIT_EMPTYSET:\n return '∅';\n\n case TokenID.BIGPR:\n return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.SMALLPR:\n return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.FILTER: {\n const args = node.children\n .slice(0, -1)\n .map(child => this.visit(child, context))\n .join(', ');\n const body = this.visitChild(node, node.children.length - 1, context);\n return `Fi${this.formatIndices(node)}[${args}](${body})`;\n }\n case TokenID.CARD:\n return `card(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOL:\n return `bool(${this.visitChild(node, 0, context)})`;\n case TokenID.DEBOOL:\n return `debool(${this.visitChild(node, 0, context)})`;\n case TokenID.REDUCE:\n return `red(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOLEAN:\n return this.renderBoolean(node, context);\n\n case TokenID.NT_FUNC_CALL: {\n const callee = this.visitChild(node, 0, context);\n const args = node.children\n .slice(1)\n .map(child => this.visit(child, context))\n .join(', ');\n return `${callee}[${args}]`;\n }\n case TokenID.NT_TUPLE:\n return `(${node.children.map(child => this.visit(child, context)).join(', ')})`;\n case TokenID.NT_ENUMERATION:\n return `{${node.children.map(child => this.visit(child, context)).join(', ')}}`;\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ENUM_DECL:\n return node.children\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index, context)))\n .join(', ');\n case TokenID.NT_TUPLE_DECL:\n return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(', ')})`;\n case TokenID.NT_ARG_DECL:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)}`;\n case TokenID.QUANTOR_UNIVERSAL:\n return this.renderQuantifier('∀', node, context);\n case TokenID.QUANTOR_EXISTS:\n return this.renderQuantifier('∃', node, context);\n case TokenID.NT_DECLARATIVE_EXPR:\n return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_FUNC_DEFINITION:\n return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;\n case TokenID.ITERATE:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:∈${this.visitChild(node, 1, context)}`;\n case TokenID.ASSIGN:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;\n case TokenID.NT_IMPERATIVE_EXPR: {\n const statements = node.children\n .slice(1)\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));\n const target = this.visitChild(node, 0, context);\n return `I{${target} | ${statements.join('; ')}}`;\n }\n case TokenID.NT_RECURSIVE_SHORT:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_RECURSIVE_FULL:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)} | ${this.visitChild(node, 3, context)}}`;\n\n case TokenID.PLUS:\n return this.renderInfix('+', node, context);\n case TokenID.MINUS:\n return this.renderInfix('-', node, context);\n case TokenID.MULTIPLY:\n return this.renderInfix('*', node, context);\n case TokenID.GREATER:\n return this.renderInfix('>', node, context);\n case TokenID.LESSER:\n return this.renderInfix('<', node, context);\n case TokenID.GREATER_OR_EQ:\n return this.renderInfix('≥', node, context);\n case TokenID.LESSER_OR_EQ:\n return this.renderInfix('≤', node, context);\n case TokenID.EQUAL:\n return this.renderInfix('=', node, context);\n case TokenID.NOTEQUAL:\n return this.renderInfix('≠', node, context);\n case TokenID.LOGIC_AND:\n return this.renderInfix('&', node, context);\n case TokenID.LOGIC_OR:\n return this.renderInfix('∨', node, context);\n case TokenID.LOGIC_IMPLICATION:\n return this.renderInfix('⇒', node, context);\n case TokenID.LOGIC_EQUIVALENT:\n return this.renderInfix('⇔', node, context);\n case TokenID.SET_IN:\n return this.renderInfix('∈', node, context);\n case TokenID.SET_NOT_IN:\n return this.renderInfix('∉', node, context);\n case TokenID.SUBSET:\n return this.renderInfix('⊂', node, context);\n case TokenID.SUBSET_OR_EQ:\n return this.renderInfix('⊆', node, context);\n case TokenID.NOT_SUBSET:\n return this.renderInfix('⊄', node, context);\n case TokenID.DECART:\n return this.renderInfix('×', node, context);\n case TokenID.SET_UNION:\n return this.renderInfix('∪', node, context);\n case TokenID.SET_INTERSECTION:\n return this.renderInfix('∩', node, context);\n case TokenID.SET_MINUS:\n return this.renderInfix('\\\\', node, context);\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.renderInfix('∆', node, context);\n case TokenID.LOGIC_NOT:\n return `¬${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;\n default:\n return node.children.map(child => this.visit(child, context)).join('');\n }\n }\n\n private visitChild(node: AstNode, index: number, context: VisitContext): string {\n const child = node.children[index];\n if (!child) {\n return '';\n }\n return this.visit(child, this.childContext(node.typeID, index, context));\n }\n\n private renderQuantifier(symbol: string, node: AstNode, context: VisitContext): string {\n const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));\n const domain = this.visitChild(node, 1, context);\n const bodyNode = node.children[2];\n const bodyText = this.visitChild(node, 2, context);\n const body = bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText;\n return `${symbol}${declaration}∈${domain} ${body}`;\n }\n\n private shouldWrapQuantifierBody(node: AstNode): boolean {\n const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);\n const bodyPrecedence = this.getPrecedence(node.typeID);\n if (quantifierPrecedence === null || bodyPrecedence === null) {\n return false;\n }\n return bodyPrecedence < quantifierPrecedence;\n }\n\n private renderInfix(symbol: string, node: AstNode, context: VisitContext): string {\n if (this.isLogicBinary(node.typeID)) {\n const parts = node.children.map((child, index) => {\n const text = this.visit(child, context);\n return this.needParen(node, child, index) ? `(${text})` : text;\n });\n return parts.join(` ${symbol} `);\n }\n const parts = node.children.map(child => this.wrapIfNeeded(this.visit(child, context), child));\n return parts.join(symbol);\n }\n\n private needParen(parent: AstNode, child: AstNode, childIndex: number): boolean {\n if (this.isAtomic(child.typeID)) {\n return false;\n }\n const parentPrecedence = this.getPrecedence(parent.typeID);\n const childPrecedence = this.getPrecedence(child.typeID);\n if (parentPrecedence === null || childPrecedence === null) {\n return true;\n }\n if (childPrecedence > parentPrecedence) {\n return false;\n }\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) {\n return false;\n }\n if (this.isLeftAssociative(parent.typeID)) {\n return childIndex > 0;\n }\n return true;\n }\n\n private getPrecedence(typeID: number): number | null {\n switch (typeID) {\n case TokenID.LOGIC_EQUIVALENT:\n return 1;\n case TokenID.LOGIC_IMPLICATION:\n return 2;\n case TokenID.LOGIC_OR:\n return 3;\n case TokenID.LOGIC_AND:\n return 4;\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return 5;\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\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 6;\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.SET_UNION:\n case TokenID.SET_SYMMETRIC_MINUS:\n return 7;\n case TokenID.MULTIPLY:\n case TokenID.DECART:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n return 8;\n default:\n return null;\n }\n }\n\n private isAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.PLUS ||\n typeID === TokenID.MULTIPLY ||\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_EQUIVALENT ||\n typeID === TokenID.SET_UNION ||\n typeID === TokenID.SET_INTERSECTION ||\n typeID === TokenID.DECART\n );\n }\n\n private isLeftAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.MINUS ||\n typeID === TokenID.SET_MINUS ||\n typeID === TokenID.SET_SYMMETRIC_MINUS\n );\n }\n\n private renderBoolean(node: AstNode, context: VisitContext): string {\n let current: AstNode = node;\n let depth = 0;\n while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {\n depth += 1;\n current = current.children[0];\n }\n return `${'ℬ'.repeat(depth)}(${this.visit(current, context)})`;\n }\n\n private wrapIfNeeded(text: string, node: AstNode): string {\n if (this.isAtomic(node.typeID)) {\n return text;\n }\n return `(${text})`;\n }\n\n private isAtomic(typeID: number): boolean {\n return (\n typeID === TokenID.ID_LOCAL ||\n typeID === TokenID.ID_GLOBAL ||\n typeID === TokenID.ID_FUNCTION ||\n typeID === TokenID.ID_PREDICATE ||\n typeID === TokenID.ID_RADICAL ||\n typeID === TokenID.LIT_INTEGER ||\n typeID === TokenID.LIT_WHOLE_NUMBERS ||\n typeID === TokenID.LIT_EMPTYSET ||\n typeID === TokenID.NT_FUNC_CALL ||\n typeID === TokenID.NT_TUPLE ||\n typeID === TokenID.NT_ENUMERATION ||\n typeID === TokenID.BIGPR ||\n typeID === TokenID.SMALLPR ||\n typeID === TokenID.FILTER ||\n typeID === TokenID.REDUCE ||\n typeID === TokenID.BOOL ||\n typeID === TokenID.DEBOOL ||\n typeID === TokenID.CARD ||\n typeID === TokenID.BOOLEAN\n );\n }\n\n private isLogicBinary(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.LOGIC_EQUIVALENT\n );\n }\n\n private formatIndices(node: AstNode): string {\n return getNodeIndices(node).join(',');\n }\n\n private shouldStartScope(typeID: number): boolean {\n return (\n typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.NT_FUNC_DEFINITION ||\n typeID === TokenID.NT_IMPERATIVE_EXPR ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL\n );\n }\n\n private childContext(typeID: number, index: number, parent: VisitContext): VisitContext {\n if (!this.options.normalize) {\n return parent;\n }\n\n const isDeclaration =\n ((typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.ITERATE ||\n typeID === TokenID.ASSIGN ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL) &&\n index === 0) ||\n (typeID === TokenID.NT_FUNC_DEFINITION && index === 0) ||\n (typeID === TokenID.NT_ARG_DECL && index === 0) ||\n typeID === TokenID.NT_TUPLE_DECL ||\n typeID === TokenID.NT_ENUM_DECL;\n\n return { localDeclaration: isDeclaration };\n }\n\n private declareLocal(alias: string): string {\n const scope = this.currentScope();\n const local = this.nextLocal();\n scope.set(alias, local);\n return local;\n }\n\n private resolveLocal(alias: string): string {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const local = this.scopes[index].get(alias);\n if (local) {\n return local;\n }\n }\n\n let local = this.freeLocals.get(alias);\n if (!local) {\n local = this.nextLocal();\n this.freeLocals.set(alias, local);\n }\n return local;\n }\n\n private resolveRadical(alias: string): string {\n let radical = this.radicals.get(alias);\n if (!radical) {\n this.radicalCounter += 1;\n radical = `R${this.radicalCounter}`;\n this.radicals.set(alias, radical);\n }\n return radical;\n }\n\n private startScope(): void {\n this.scopes.push(new Map());\n }\n\n private endScope(): void {\n this.scopes.pop();\n }\n\n private currentScope(): ScopeFrame {\n const scope = this.scopes.at(-1);\n if (!scope) {\n throw new Error('Attempted to declare local outside of scope');\n }\n return scope;\n }\n\n private nextLocal(): string {\n this.localCounter += 1;\n return `a${this.localCounter}`;\n }\n}\n","/**\n * Module: API for RSLanguage.\n */\nimport { type AstNode } from '../parsing';\n\nimport { ArgumentsExtractor, type ArgumentsType } from './semantic/arguments-extractor';\nexport { generateExpressionFromAst } from './parser/expression-generator';\n\n/** Represents alias mapping. */\nexport type AliasMapping = Record<string, string>;\n\n// cspell:disable\nconst LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\\d*/g;\nconst GLOBALS_REGEXP = /[XCSADFPTN]\\d+/g;\nconst COMPLEX_SYMBOLS_REGEXP = /[∀∃×ℬ;|:]/g;\nconst TYPIFICATION_SET = /^ℬ+\\([ℬ\\(((X|C)\\d+|Z)\\)×]*\\)$/g;\n// cspell:enable\n\n/** Extract arguments from AST. */\nexport function extractArguments(ast: AstNode): ArgumentsType[] {\n return new ArgumentsExtractor().run(ast);\n}\n\n/** Extracts global variable names from a given expression. */\nexport function extractGlobals(expression: string): Set<string> {\n return new Set(expression.match(GLOBALS_REGEXP) ?? []);\n}\n\n/** Check if expression is simple derivation. */\nexport function isSimpleExpression(text: string): boolean {\n return !text.match(COMPLEX_SYMBOLS_REGEXP);\n}\n\n/** Check if expression is set typification. */\nexport function isSetTypification(text: string): boolean {\n return !!text.match(TYPIFICATION_SET);\n}\n\n/**\n * Splits a string containing a template definition into its head and body parts.\n *\n * A template definition is expected to have the following format: `[head] body`.\n * If the input string does not contain the opening square bracket '[', the entire\n * string is treated as the body, and an empty string is assigned to the head.\n * If the opening bracket is present, the function attempts to find the matching\n * closing bracket ']' to determine the head and body parts.\n *\n * @example\n * const template = '[header] body content';\n * const result = splitTemplateDefinition(template);\n * // result: `{ head: 'header', body: 'body content' }`\n */\nexport function splitTemplateDefinition(target: string) {\n let start = 0;\n for (; start < target.length && target[start] !== '['; ++start);\n if (start < target.length) {\n for (let counter = 0, end = start + 1; end < target.length; ++end) {\n if (target[end] === '[') {\n ++counter;\n } else if (target[end] === ']') {\n if (counter !== 0) {\n --counter;\n } else {\n return {\n head: target.substring(start + 1, end).trim(),\n body: target.substring(end + 1).trim()\n };\n }\n }\n }\n }\n return {\n head: '',\n body: target\n };\n}\n\n/**\n * Substitutes values for template arguments in a given expression.\n *\n * This function takes an input mathematical expression and a list of argument values.\n * It replaces template argument placeholders in the expression with their corresponding values\n * from the provided arguments.\n */\nexport function substituteTemplateArgs(expression: string, mapping: AliasMapping): string {\n if (Object.keys(mapping).length === 0) {\n return expression;\n }\n let { head, body } = splitTemplateDefinition(expression);\n body = applyPattern(body, mapping, LOCALS_REGEXP);\n const argTexts = head.split(',').map(text => text.trim());\n head = argTexts\n .filter(arg => [...arg.matchAll(LOCALS_REGEXP)].every(local => local.every(match => !(match in mapping))))\n .join(', ');\n\n if (!head) {\n return body;\n } else {\n return `[${head}] ${body}`;\n }\n}\n\n/** Apply alias mapping. */\nexport function applyAliasMapping(target: string, mapping: AliasMapping): string {\n return applyPattern(target, mapping, GLOBALS_REGEXP);\n}\n\n/** Apply alias typification mapping. */\nexport function applyTypificationMapping(target: string, mapping: AliasMapping): string {\n const modified = applyAliasMapping(target, mapping);\n if (modified === target) {\n return target;\n }\n\n const deleteBrackets: number[] = [];\n const positions: number[] = [];\n const booleans: number[] = [];\n let boolCount: number = 0;\n let stackSize: number = 0;\n\n for (let i = 0; i < modified.length; i++) {\n const char = modified[i];\n if (char === 'ℬ') {\n boolCount++;\n continue;\n }\n if (char === '(') {\n stackSize++;\n positions.push(i);\n booleans.push(boolCount);\n }\n boolCount = 0;\n if (char === ')') {\n if (\n i < modified.length - 1 &&\n modified[i + 1] === ')' &&\n stackSize > 1 &&\n positions[stackSize - 2] + booleans[stackSize - 1] + 1 === positions[stackSize - 1]\n ) {\n deleteBrackets.push(i);\n deleteBrackets.push(positions[stackSize - 2]);\n }\n if (i === modified.length - 1 && stackSize === 1 && positions[0] === 0) {\n deleteBrackets.push(i);\n deleteBrackets.push(positions[0]);\n }\n stackSize--;\n positions.pop();\n booleans.pop();\n }\n }\n\n let result = '';\n for (let i = 0; i < modified.length; i++) {\n if (!deleteBrackets.includes(i)) {\n result += modified[i];\n }\n }\n\n return result;\n}\n\n// ====== Internals =========\n/** Text substitution guided by mapping and regular expression. */\nfunction applyPattern(text: string, mapping: AliasMapping, pattern: RegExp): string {\n if (text === '' || pattern === null) {\n return text;\n }\n let posInput = 0;\n let output = '';\n const patternMatches = text.matchAll(pattern);\n for (const segment of patternMatches) {\n const entity = segment[0];\n const start = segment.index ?? 0;\n if (entity in mapping) {\n output += text.substring(posInput, start);\n output += mapping[entity];\n posInput = start + segment[0].length;\n }\n }\n output += text.substring(posInput);\n return output;\n}\n"],"mappings":"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","names":["parts","local"]}
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../../src/rslang/api.ts"],"sourcesContent":["/**\n * Module: API for RSLanguage.\n */\nimport { type AstNode } from '../parsing';\n\nimport { ArgumentsExtractor, type ArgumentsType } from './semantic/arguments-extractor';\nexport { generateExpressionFromAst } from './parser/expression-generator';\n\n/** Represents alias mapping. */\nexport type AliasMapping = Record<string, string>;\n\n// cspell:disable\nconst LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\\d*/g;\nconst GLOBALS_REGEXP = /[XCSADFPTN]\\d+/g;\nconst COMPLEX_SYMBOLS_REGEXP = /[∀∃×ℬ;|:]/g;\nconst TYPIFICATION_SET = /^ℬ+\\([ℬ\\(((X|C)\\d+|Z)\\)×]*\\)$/g;\n// cspell:enable\n\n/** Extract arguments from AST. */\nexport function extractArguments(ast: AstNode): ArgumentsType[] {\n return new ArgumentsExtractor().run(ast);\n}\n\n/** Extracts global variable names from a given expression. */\nexport function extractGlobals(expression: string): Set<string> {\n return new Set(expression.match(GLOBALS_REGEXP) ?? []);\n}\n\n/** Check if expression is simple derivation. */\nexport function isSimpleExpression(text: string): boolean {\n return !text.match(COMPLEX_SYMBOLS_REGEXP);\n}\n\n/** Check if expression is set typification. */\nexport function isSetTypification(text: string): boolean {\n return !!text.match(TYPIFICATION_SET);\n}\n\n/**\n * Splits a string containing a template definition into its head and body parts.\n *\n * A template definition is expected to have the following format: `[head] body`.\n * If the input string does not contain the opening square bracket '[', the entire\n * string is treated as the body, and an empty string is assigned to the head.\n * If the opening bracket is present, the function attempts to find the matching\n * closing bracket ']' to determine the head and body parts.\n *\n * @example\n * const template = '[header] body content';\n * const result = splitTemplateDefinition(template);\n * // result: `{ head: 'header', body: 'body content' }`\n */\nexport function splitTemplateDefinition(target: string) {\n let start = 0;\n for (; start < target.length && target[start] !== '['; ++start);\n if (start < target.length) {\n for (let counter = 0, end = start + 1; end < target.length; ++end) {\n if (target[end] === '[') {\n ++counter;\n } else if (target[end] === ']') {\n if (counter !== 0) {\n --counter;\n } else {\n return {\n head: target.substring(start + 1, end).trim(),\n body: target.substring(end + 1).trim()\n };\n }\n }\n }\n }\n return {\n head: '',\n body: target\n };\n}\n\n/**\n * Substitutes values for template arguments in a given expression.\n *\n * This function takes an input mathematical expression and a list of argument values.\n * It replaces template argument placeholders in the expression with their corresponding values\n * from the provided arguments.\n */\nexport function substituteTemplateArgs(expression: string, mapping: AliasMapping): string {\n if (Object.keys(mapping).length === 0) {\n return expression;\n }\n let { head, body } = splitTemplateDefinition(expression);\n body = applyPattern(body, mapping, LOCALS_REGEXP);\n const argTexts = head.split(',').map(text => text.trim());\n head = argTexts\n .filter(arg => [...arg.matchAll(LOCALS_REGEXP)].every(local => local.every(match => !(match in mapping))))\n .join(', ');\n\n if (!head) {\n return body;\n } else {\n return `[${head}] ${body}`;\n }\n}\n\n/** Apply alias mapping. */\nexport function applyAliasMapping(target: string, mapping: AliasMapping): string {\n return applyPattern(target, mapping, GLOBALS_REGEXP);\n}\n\n/** Apply alias typification mapping. */\nexport function applyTypificationMapping(target: string, mapping: AliasMapping): string {\n const modified = applyAliasMapping(target, mapping);\n if (modified === target) {\n return target;\n }\n\n const deleteBrackets: number[] = [];\n const positions: number[] = [];\n const booleans: number[] = [];\n let boolCount: number = 0;\n let stackSize: number = 0;\n\n for (let i = 0; i < modified.length; i++) {\n const char = modified[i];\n if (char === 'ℬ') {\n boolCount++;\n continue;\n }\n if (char === '(') {\n stackSize++;\n positions.push(i);\n booleans.push(boolCount);\n }\n boolCount = 0;\n if (char === ')') {\n if (\n i < modified.length - 1 &&\n modified[i + 1] === ')' &&\n stackSize > 1 &&\n positions[stackSize - 2] + booleans[stackSize - 1] + 1 === positions[stackSize - 1]\n ) {\n deleteBrackets.push(i);\n deleteBrackets.push(positions[stackSize - 2]);\n }\n if (i === modified.length - 1 && stackSize === 1 && positions[0] === 0) {\n deleteBrackets.push(i);\n deleteBrackets.push(positions[0]);\n }\n stackSize--;\n positions.pop();\n booleans.pop();\n }\n }\n\n let result = '';\n for (let i = 0; i < modified.length; i++) {\n if (!deleteBrackets.includes(i)) {\n result += modified[i];\n }\n }\n\n return result;\n}\n\n// ====== Internals =========\n/** Text substitution guided by mapping and regular expression. */\nfunction applyPattern(text: string, mapping: AliasMapping, pattern: RegExp): string {\n if (text === '' || pattern === null) {\n return text;\n }\n let posInput = 0;\n let output = '';\n const patternMatches = text.matchAll(pattern);\n for (const segment of patternMatches) {\n const entity = segment[0];\n const start = segment.index ?? 0;\n if (entity in mapping) {\n output += text.substring(posInput, start);\n output += mapping[entity];\n posInput = start + segment[0].length;\n }\n }\n output += text.substring(posInput);\n return output;\n}\n"],"mappings":";;;AAYA,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,yBAAyB;AAC/B,MAAM,mBAAmB;;AAIzB,SAAgB,iBAAiB,KAA+B;CAC9D,OAAO,IAAI,mBAAmB,CAAC,CAAC,IAAI,GAAG;AACzC;;AAGA,SAAgB,eAAe,YAAiC;CAC9D,OAAO,IAAI,IAAI,WAAW,MAAM,cAAc,KAAK,CAAC,CAAC;AACvD;;AAGA,SAAgB,mBAAmB,MAAuB;CACxD,OAAO,CAAC,KAAK,MAAM,sBAAsB;AAC3C;;AAGA,SAAgB,kBAAkB,MAAuB;CACvD,OAAO,CAAC,CAAC,KAAK,MAAM,gBAAgB;AACtC;;;;;;;;;;;;;;;AAgBA,SAAgB,wBAAwB,QAAgB;CACtD,IAAI,QAAQ;CACZ,OAAO,QAAQ,OAAO,UAAU,OAAO,WAAW,KAAK,EAAE;CACzD,IAAI,QAAQ,OAAO,QACjB;OAAK,IAAI,UAAU,GAAG,MAAM,QAAQ,GAAG,MAAM,OAAO,QAAQ,EAAE,KAC5D,IAAI,OAAO,SAAS,KAClB,EAAE;OACG,IAAI,OAAO,SAAS,KACzB,IAAI,YAAY,GACd,EAAE;OAEF,OAAO;GACL,MAAM,OAAO,UAAU,QAAQ,GAAG,GAAG,CAAC,CAAC,KAAK;GAC5C,MAAM,OAAO,UAAU,MAAM,CAAC,CAAC,CAAC,KAAK;EACvC;CAGN;CAEF,OAAO;EACL,MAAM;EACN,MAAM;CACR;AACF;;;;;;;;AASA,SAAgB,uBAAuB,YAAoB,SAA+B;CACxF,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,OAAO;CAET,IAAI,EAAE,MAAM,SAAS,wBAAwB,UAAU;CACvD,OAAO,aAAa,MAAM,SAAS,aAAa;CAEhD,OADiB,KAAK,MAAM,GAAG,CAAC,CAAC,KAAI,SAAQ,KAAK,KAAK,CAChD,CAAA,CACJ,QAAO,QAAO,CAAC,GAAG,IAAI,SAAS,aAAa,CAAC,CAAC,CAAC,OAAM,UAAS,MAAM,OAAM,UAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,CACzG,KAAK,IAAI;CAEZ,IAAI,CAAC,MACH,OAAO;MAEP,OAAO,IAAI,KAAK,IAAI;AAExB;;AAGA,SAAgB,kBAAkB,QAAgB,SAA+B;CAC/E,OAAO,aAAa,QAAQ,SAAS,cAAc;AACrD;;AAGA,SAAgB,yBAAyB,QAAgB,SAA+B;CACtF,MAAM,WAAW,kBAAkB,QAAQ,OAAO;CAClD,IAAI,aAAa,QACf,OAAO;CAGT,MAAM,iBAA2B,CAAC;CAClC,MAAM,YAAsB,CAAC;CAC7B,MAAM,WAAqB,CAAC;CAC5B,IAAI,YAAoB;CACxB,IAAI,YAAoB;CAExB,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,OAAO,SAAS;EACtB,IAAI,SAAS,KAAK;GAChB;GACA;EACF;EACA,IAAI,SAAS,KAAK;GAChB;GACA,UAAU,KAAK,CAAC;GAChB,SAAS,KAAK,SAAS;EACzB;EACA,YAAY;EACZ,IAAI,SAAS,KAAK;GAChB,IACE,IAAI,SAAS,SAAS,KACtB,SAAS,IAAI,OAAO,OACpB,YAAY,KACZ,UAAU,YAAY,KAAK,SAAS,YAAY,KAAK,MAAM,UAAU,YAAY,IACjF;IACA,eAAe,KAAK,CAAC;IACrB,eAAe,KAAK,UAAU,YAAY,EAAE;GAC9C;GACA,IAAI,MAAM,SAAS,SAAS,KAAK,cAAc,KAAK,UAAU,OAAO,GAAG;IACtE,eAAe,KAAK,CAAC;IACrB,eAAe,KAAK,UAAU,EAAE;GAClC;GACA;GACA,UAAU,IAAI;GACd,SAAS,IAAI;EACf;CACF;CAEA,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,IAAI,CAAC,eAAe,SAAS,CAAC,GAC5B,UAAU,SAAS;CAIvB,OAAO;AACT;;AAIA,SAAS,aAAa,MAAc,SAAuB,SAAyB;CAClF,IAAI,SAAS,MAAM,YAAY,MAC7B,OAAO;CAET,IAAI,WAAW;CACf,IAAI,SAAS;CACb,MAAM,iBAAiB,KAAK,SAAS,OAAO;CAC5C,KAAK,MAAM,WAAW,gBAAgB;EACpC,MAAM,SAAS,QAAQ;EACvB,MAAM,QAAQ,QAAQ,SAAS;EAC/B,IAAI,UAAU,SAAS;GACrB,UAAU,KAAK,UAAU,UAAU,KAAK;GACxC,UAAU,QAAQ;GAClB,WAAW,QAAQ,QAAQ,EAAE,CAAC;EAChC;CACF;CACA,UAAU,KAAK,UAAU,QAAQ;CACjC,OAAO;AACT"}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { RSErrorInfo, RSErrorCode } from './error.js';
|
|
4
|
-
import '@lezer/common';
|
|
5
|
-
import '../shared/branded.js';
|
|
6
|
-
|
|
7
|
-
/** Module: AST annotations. */
|
|
8
|
-
|
|
9
|
-
/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */
|
|
10
|
-
declare function annotateType(node: AstNode, type: ExpressionType): void;
|
|
11
|
-
/** Reads {@link ExpressionType} from node's `annotation`. */
|
|
12
|
-
declare function readTypeAnnotation(node: AstNode): ExpressionType | null;
|
|
13
|
-
/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */
|
|
14
|
-
declare function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void;
|
|
15
|
-
/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */
|
|
16
|
-
declare function readErrorAnnotation(node: AstNode): RSErrorInfo | null;
|
|
17
|
-
|
|
18
|
-
export { annotateError, annotateType, readErrorAnnotation, readTypeAnnotation };
|
|
1
|
+
import { i as readTypeAnnotation, n as annotateType, r as readErrorAnnotation, t as annotateError } from "../ast-annotations-BiMjkKvz.js";
|
|
2
|
+
export { annotateError, annotateType, readErrorAnnotation, readTypeAnnotation };
|
|
@@ -1,56 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//#region src/rslang/ast-annotations.ts
|
|
2
|
+
const AST_ERRORS_KEY = "rsErrors";
|
|
3
|
+
const AST_TYPE_KEY = "rsType";
|
|
4
|
+
/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */
|
|
4
5
|
function annotateType(node, type) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
node.annotation = {
|
|
7
|
+
...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
|
|
8
|
+
[AST_TYPE_KEY]: type
|
|
9
|
+
};
|
|
9
10
|
}
|
|
11
|
+
/** Reads {@link ExpressionType} from node's `annotation`. */
|
|
10
12
|
function readTypeAnnotation(node) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
return null;
|
|
13
|
+
if (node.annotation && AST_TYPE_KEY in node.annotation) return node.annotation[AST_TYPE_KEY];
|
|
14
|
+
return null;
|
|
15
15
|
}
|
|
16
|
+
/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */
|
|
16
17
|
function annotateError(node, code, params) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
if (typeof node.annotation === "object" && node.annotation !== null && AST_ERRORS_KEY in node.annotation && isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])) return;
|
|
19
|
+
const entry = params !== void 0 && params.length > 0 ? {
|
|
20
|
+
code,
|
|
21
|
+
params: [...params]
|
|
22
|
+
} : { code };
|
|
23
|
+
node.annotation = {
|
|
24
|
+
...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
|
|
25
|
+
[AST_ERRORS_KEY]: entry
|
|
26
|
+
};
|
|
25
27
|
}
|
|
28
|
+
/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */
|
|
26
29
|
function readErrorAnnotation(node) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
return null;
|
|
30
|
+
const raw = node.annotation?.[AST_ERRORS_KEY];
|
|
31
|
+
if (isAstNodeErrorRef(raw)) return raw;
|
|
32
|
+
return null;
|
|
32
33
|
}
|
|
33
34
|
function isAstNodeErrorRef(x) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
if (!("params" in x)) {
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
const p = x.params;
|
|
45
|
-
if (p === void 0) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
return Array.isArray(p) && p.every((item) => typeof item === "string");
|
|
35
|
+
if (typeof x !== "object" || x === null || !("code" in x)) return false;
|
|
36
|
+
if (typeof x.code !== "number") return false;
|
|
37
|
+
if (!("params" in x)) return true;
|
|
38
|
+
const p = x.params;
|
|
39
|
+
if (p === void 0) return true;
|
|
40
|
+
return Array.isArray(p) && p.every((item) => typeof item === "string");
|
|
49
41
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
readErrorAnnotation,
|
|
54
|
-
readTypeAnnotation
|
|
55
|
-
};
|
|
42
|
+
//#endregion
|
|
43
|
+
export { annotateError, annotateType, readErrorAnnotation, readTypeAnnotation };
|
|
44
|
+
|
|
56
45
|
//# sourceMappingURL=ast-annotations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rslang/ast-annotations.ts"],"sourcesContent":["/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n"],"mappings":";AAOA,
|
|
1
|
+
{"version":3,"file":"ast-annotations.js","names":[],"sources":["../../src/rslang/ast-annotations.ts"],"sourcesContent":["/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n"],"mappings":";AAOA,MAAM,iBAAiB;AACvB,MAAM,eAAe;;AAGrB,SAAgB,aAAa,MAAe,MAA4B;CACtE,KAAK,aAAa;EAChB,GAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,OAAO,KAAK,aAAa,CAAC;GACxF,eAAe;CAClB;AACF;;AAGA,SAAgB,mBAAmB,MAAsC;CACvE,IAAI,KAAK,cAAc,gBAAgB,KAAK,YAC1C,OAAO,KAAK,WAAW;CAEzB,OAAO;AACT;;AAGA,SAAgB,cAAc,MAAe,MAAmB,QAAkC;CAChG,IACE,OAAO,KAAK,eAAe,YAC3B,KAAK,eAAe,QACpB,kBAAkB,KAAK,cACvB,kBAAkB,KAAK,WAAW,eAAe,GAEjD;CAEF,MAAM,QAAqB,WAAW,UAAa,OAAO,SAAS,IAAI;EAAE;EAAM,QAAQ,CAAC,GAAG,MAAM;CAAE,IAAI,EAAE,KAAK;CAC9G,KAAK,aAAa;EAChB,GAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,OAAO,KAAK,aAAa,CAAC;GACxF,iBAAiB;CACpB;AACF;;AAGA,SAAgB,oBAAoB,MAAmC;CACrE,MAAM,MAAM,KAAK,aAAa;CAC9B,IAAI,kBAAkB,GAAG,GACvB,OAAO;CAET,OAAO;AACT;AAGA,SAAS,kBAAkB,GAA8B;CACvD,IAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,EAAE,UAAU,IACrD,OAAO;CAGT,IAAI,OADS,EAAE,SACK,UAClB,OAAO;CAET,IAAI,EAAE,YAAY,IAChB,OAAO;CAET,MAAM,IAAK,EAA0B;CACrC,IAAI,MAAM,QACR,OAAO;CAET,OAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAM,SAAQ,OAAO,SAAS,QAAQ;AACrE"}
|
package/dist/rslang/error.d.ts
CHANGED
|
@@ -1,85 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare const RSErrorClass: {
|
|
4
|
-
readonly LEXER: 0;
|
|
5
|
-
readonly PARSER: 1;
|
|
6
|
-
readonly SEMANTIC: 2;
|
|
7
|
-
readonly EVALUATION: 3;
|
|
8
|
-
readonly UNKNOWN: 4;
|
|
9
|
-
};
|
|
10
|
-
type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];
|
|
11
|
-
/** Represents RSLang expression error information. */
|
|
12
|
-
interface RSErrorInfo {
|
|
13
|
-
code: RSErrorCode;
|
|
14
|
-
params?: readonly string[];
|
|
15
|
-
}
|
|
16
|
-
/** Represents RSLang expression error description. */
|
|
17
|
-
interface RSErrorDescription extends RSErrorInfo {
|
|
18
|
-
from: number;
|
|
19
|
-
to: number;
|
|
20
|
-
}
|
|
21
|
-
/** Error reporter function type. */
|
|
22
|
-
type ErrorReporter = (error: RSErrorDescription) => void;
|
|
23
|
-
/** Represents RSLang expression error types. */
|
|
24
|
-
declare const RSErrorCode: {
|
|
25
|
-
readonly unknownSyntax: 33792;
|
|
26
|
-
readonly missingParenthesis: 33798;
|
|
27
|
-
readonly missingCurlyBrace: 33799;
|
|
28
|
-
readonly missingSquareBracket: 33800;
|
|
29
|
-
readonly bracketMismatch: 33801;
|
|
30
|
-
readonly doubleParenthesis: 33802;
|
|
31
|
-
readonly missingOpenBracket: 33803;
|
|
32
|
-
readonly expectedLocal: 33813;
|
|
33
|
-
readonly expectedType: 33814;
|
|
34
|
-
readonly localDoubleDeclare: 10241;
|
|
35
|
-
readonly localNotUsed: 10242;
|
|
36
|
-
readonly localUndeclared: 34817;
|
|
37
|
-
readonly localShadowing: 34818;
|
|
38
|
-
readonly typesNotEqual: 34819;
|
|
39
|
-
readonly globalNotTyped: 34820;
|
|
40
|
-
readonly invalidDecart: 34821;
|
|
41
|
-
readonly invalidBoolean: 34822;
|
|
42
|
-
readonly invalidTypeOperation: 34823;
|
|
43
|
-
readonly invalidCard: 34824;
|
|
44
|
-
readonly invalidDebool: 34825;
|
|
45
|
-
readonly globalFuncWithoutArgs: 34827;
|
|
46
|
-
readonly invalidReduce: 34832;
|
|
47
|
-
readonly invalidProjectionTuple: 34833;
|
|
48
|
-
readonly invalidProjectionSet: 34834;
|
|
49
|
-
readonly invalidEnumeration: 34835;
|
|
50
|
-
readonly invalidCortegeDeclare: 34836;
|
|
51
|
-
readonly localOutOfScope: 34837;
|
|
52
|
-
readonly invalidElementPredicate: 34838;
|
|
53
|
-
readonly invalidEmptySetUsage: 34839;
|
|
54
|
-
readonly invalidArgsArity: 34840;
|
|
55
|
-
readonly invalidArgumentType: 34841;
|
|
56
|
-
readonly globalStructure: 34844;
|
|
57
|
-
readonly radicalUsage: 34849;
|
|
58
|
-
readonly invalidFilterArgumentType: 34850;
|
|
59
|
-
readonly invalidFilterArity: 34851;
|
|
60
|
-
readonly arithmeticNotSupported: 34852;
|
|
61
|
-
readonly typesNotCompatible: 34853;
|
|
62
|
-
readonly orderingNotSupported: 34854;
|
|
63
|
-
readonly expectedLogic: 34855;
|
|
64
|
-
readonly expectedSetexpr: 34856;
|
|
65
|
-
readonly invalidArgumentCortegeDeclare: 34857;
|
|
66
|
-
readonly globalNoValue: 34880;
|
|
67
|
-
readonly invalidPropertyUsage: 34881;
|
|
68
|
-
readonly calcUnknownError: 33024;
|
|
69
|
-
readonly setOverflow: 33025;
|
|
70
|
-
readonly booleanBaseLimit: 33026;
|
|
71
|
-
readonly calcGlobalMissing: 33027;
|
|
72
|
-
readonly iterationsLimit: 33028;
|
|
73
|
-
readonly calcInvalidDebool: 33029;
|
|
74
|
-
readonly iterateInfinity: 33030;
|
|
75
|
-
readonly calculationNotSupported: 33031;
|
|
76
|
-
readonly cstEmptyDerived: 34913;
|
|
77
|
-
readonly definitionNotAllowed: 34914;
|
|
78
|
-
};
|
|
79
|
-
type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];
|
|
80
|
-
/** Generate ErrorID label. */
|
|
81
|
-
declare function getRSErrorPrefix(code: RSErrorCode): string;
|
|
82
|
-
/** Checks if error is critical. */
|
|
83
|
-
declare function isCritical(code: RSErrorCode): boolean;
|
|
84
|
-
|
|
85
|
-
export { type ErrorReporter, RSErrorClass, RSErrorCode, type RSErrorDescription, type RSErrorInfo, getRSErrorPrefix, isCritical };
|
|
1
|
+
import { a as RSErrorInfo, i as RSErrorDescription, n as RSErrorClass, o as getRSErrorPrefix, r as RSErrorCode, s as isCritical, t as ErrorReporter } from "../error-E1LVq_3w.js";
|
|
2
|
+
export { ErrorReporter, RSErrorClass, RSErrorCode, RSErrorDescription, RSErrorInfo, getRSErrorPrefix, isCritical };
|
package/dist/rslang/error.js
CHANGED
|
@@ -1,159 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
//#region src/rslang/error.ts
|
|
2
|
+
/** Module: Error types and functions. */
|
|
3
|
+
/** Represents error class. */
|
|
4
|
+
const RSErrorClass = {
|
|
5
|
+
LEXER: 0,
|
|
6
|
+
PARSER: 1,
|
|
7
|
+
SEMANTIC: 2,
|
|
8
|
+
EVALUATION: 3,
|
|
9
|
+
UNKNOWN: 4
|
|
8
10
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
invalidElementPredicate: 34838,
|
|
65
|
-
// 34838
|
|
66
|
-
invalidEmptySetUsage: 34839,
|
|
67
|
-
// 34839
|
|
68
|
-
invalidArgsArity: 34840,
|
|
69
|
-
// 34840
|
|
70
|
-
invalidArgumentType: 34841,
|
|
71
|
-
// 34841
|
|
72
|
-
globalStructure: 34844,
|
|
73
|
-
// 34844
|
|
74
|
-
radicalUsage: 34849,
|
|
75
|
-
// 34849
|
|
76
|
-
invalidFilterArgumentType: 34850,
|
|
77
|
-
// 34850
|
|
78
|
-
invalidFilterArity: 34851,
|
|
79
|
-
// 34851
|
|
80
|
-
arithmeticNotSupported: 34852,
|
|
81
|
-
// 34852
|
|
82
|
-
typesNotCompatible: 34853,
|
|
83
|
-
// 34853
|
|
84
|
-
orderingNotSupported: 34854,
|
|
85
|
-
// 34854
|
|
86
|
-
expectedLogic: 34855,
|
|
87
|
-
// 34855
|
|
88
|
-
expectedSetexpr: 34856,
|
|
89
|
-
// 34856
|
|
90
|
-
invalidArgumentCortegeDeclare: 34857,
|
|
91
|
-
// 34857
|
|
92
|
-
globalNoValue: 34880,
|
|
93
|
-
// 34880
|
|
94
|
-
invalidPropertyUsage: 34881,
|
|
95
|
-
// 34881
|
|
96
|
-
// Value evaluation (runtime)
|
|
97
|
-
calcUnknownError: 33024,
|
|
98
|
-
// 35328
|
|
99
|
-
setOverflow: 33025,
|
|
100
|
-
// 35329
|
|
101
|
-
booleanBaseLimit: 33026,
|
|
102
|
-
// 35330
|
|
103
|
-
calcGlobalMissing: 33027,
|
|
104
|
-
// 35331
|
|
105
|
-
iterationsLimit: 33028,
|
|
106
|
-
// 35332
|
|
107
|
-
calcInvalidDebool: 33029,
|
|
108
|
-
// 35333
|
|
109
|
-
iterateInfinity: 33030,
|
|
110
|
-
// 35334
|
|
111
|
-
calculationNotSupported: 33031,
|
|
112
|
-
// 35335
|
|
113
|
-
cstEmptyDerived: 34913,
|
|
114
|
-
// 34913
|
|
115
|
-
definitionNotAllowed: 34914
|
|
116
|
-
// 34914
|
|
11
|
+
/** Represents RSLang expression error types. */
|
|
12
|
+
const RSErrorCode = {
|
|
13
|
+
unknownSyntax: 33792,
|
|
14
|
+
missingParenthesis: 33798,
|
|
15
|
+
missingCurlyBrace: 33799,
|
|
16
|
+
missingSquareBracket: 33800,
|
|
17
|
+
bracketMismatch: 33801,
|
|
18
|
+
doubleParenthesis: 33802,
|
|
19
|
+
missingOpenBracket: 33803,
|
|
20
|
+
expectedLocal: 33813,
|
|
21
|
+
expectedType: 33814,
|
|
22
|
+
localDoubleDeclare: 10241,
|
|
23
|
+
localNotUsed: 10242,
|
|
24
|
+
localUndeclared: 34817,
|
|
25
|
+
localShadowing: 34818,
|
|
26
|
+
typesNotEqual: 34819,
|
|
27
|
+
globalNotTyped: 34820,
|
|
28
|
+
invalidDecart: 34821,
|
|
29
|
+
invalidBoolean: 34822,
|
|
30
|
+
invalidTypeOperation: 34823,
|
|
31
|
+
invalidCard: 34824,
|
|
32
|
+
invalidDebool: 34825,
|
|
33
|
+
globalFuncWithoutArgs: 34827,
|
|
34
|
+
invalidReduce: 34832,
|
|
35
|
+
invalidProjectionTuple: 34833,
|
|
36
|
+
invalidProjectionSet: 34834,
|
|
37
|
+
invalidEnumeration: 34835,
|
|
38
|
+
invalidCortegeDeclare: 34836,
|
|
39
|
+
localOutOfScope: 34837,
|
|
40
|
+
invalidElementPredicate: 34838,
|
|
41
|
+
invalidEmptySetUsage: 34839,
|
|
42
|
+
invalidArgsArity: 34840,
|
|
43
|
+
invalidArgumentType: 34841,
|
|
44
|
+
globalStructure: 34844,
|
|
45
|
+
radicalUsage: 34849,
|
|
46
|
+
invalidFilterArgumentType: 34850,
|
|
47
|
+
invalidFilterArity: 34851,
|
|
48
|
+
arithmeticNotSupported: 34852,
|
|
49
|
+
typesNotCompatible: 34853,
|
|
50
|
+
orderingNotSupported: 34854,
|
|
51
|
+
expectedLogic: 34855,
|
|
52
|
+
expectedSetexpr: 34856,
|
|
53
|
+
invalidArgumentCortegeDeclare: 34857,
|
|
54
|
+
globalNoValue: 34880,
|
|
55
|
+
invalidPropertyUsage: 34881,
|
|
56
|
+
calcUnknownError: 33024,
|
|
57
|
+
setOverflow: 33025,
|
|
58
|
+
booleanBaseLimit: 33026,
|
|
59
|
+
calcGlobalMissing: 33027,
|
|
60
|
+
iterationsLimit: 33028,
|
|
61
|
+
calcInvalidDebool: 33029,
|
|
62
|
+
iterateInfinity: 33030,
|
|
63
|
+
calculationNotSupported: 33031,
|
|
64
|
+
cstEmptyDerived: 34913,
|
|
65
|
+
definitionNotAllowed: 34914
|
|
117
66
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
67
|
+
const ERROR_EVALUATION_MASK = 256;
|
|
68
|
+
const ERROR_LEXER_MASK = 512;
|
|
69
|
+
const ERROR_PARSER_MASK = 1024;
|
|
70
|
+
const ERROR_SEMANTIC_MASK = 2048;
|
|
71
|
+
/** Infers error class from error type (code). */
|
|
122
72
|
function inferErrorClass(error) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return RSErrorClass.PARSER;
|
|
129
|
-
} else if ((error & ERROR_SEMANTIC_MASK) !== 0) {
|
|
130
|
-
return RSErrorClass.SEMANTIC;
|
|
131
|
-
} else {
|
|
132
|
-
return RSErrorClass.UNKNOWN;
|
|
133
|
-
}
|
|
73
|
+
if ((error & ERROR_EVALUATION_MASK) !== 0) return RSErrorClass.EVALUATION;
|
|
74
|
+
else if ((error & ERROR_LEXER_MASK) !== 0) return RSErrorClass.LEXER;
|
|
75
|
+
else if ((error & ERROR_PARSER_MASK) !== 0) return RSErrorClass.PARSER;
|
|
76
|
+
else if ((error & ERROR_SEMANTIC_MASK) !== 0) return RSErrorClass.SEMANTIC;
|
|
77
|
+
else return RSErrorClass.UNKNOWN;
|
|
134
78
|
}
|
|
79
|
+
/** Generate ErrorID label. */
|
|
135
80
|
function getRSErrorPrefix(code) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
case RSErrorClass.EVALUATION:
|
|
145
|
-
return "E" + id;
|
|
146
|
-
case RSErrorClass.UNKNOWN:
|
|
147
|
-
return "U" + id;
|
|
148
|
-
}
|
|
81
|
+
const id = code.toString(16).toUpperCase();
|
|
82
|
+
switch (inferErrorClass(code)) {
|
|
83
|
+
case RSErrorClass.LEXER: return "L" + id;
|
|
84
|
+
case RSErrorClass.PARSER: return "P" + id;
|
|
85
|
+
case RSErrorClass.SEMANTIC: return "S" + id;
|
|
86
|
+
case RSErrorClass.EVALUATION: return "E" + id;
|
|
87
|
+
case RSErrorClass.UNKNOWN: return "U" + id;
|
|
88
|
+
}
|
|
149
89
|
}
|
|
90
|
+
/** Checks if error is critical. */
|
|
150
91
|
function isCritical(code) {
|
|
151
|
-
|
|
92
|
+
return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;
|
|
152
93
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
getRSErrorPrefix,
|
|
157
|
-
isCritical
|
|
158
|
-
};
|
|
94
|
+
//#endregion
|
|
95
|
+
export { RSErrorClass, RSErrorCode, getRSErrorPrefix, isCritical };
|
|
96
|
+
|
|
159
97
|
//# sourceMappingURL=error.js.map
|