@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.
Files changed (183) hide show
  1. package/README.md +3 -3
  2. package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
  3. package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
  4. package/dist/ast-C8sIpKdL.d.ts +51 -0
  5. package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
  6. package/dist/branded-ZlzIcxzu.d.ts +9 -0
  7. package/dist/calculator-C9W2jkSx.d.ts +39 -0
  8. package/dist/cctext/index.d.ts +2 -1
  9. package/dist/cctext/index.js +2 -42
  10. package/dist/cctext/language-api.d.ts +10 -12
  11. package/dist/cctext/language-api.js +157 -227
  12. package/dist/cctext/language-api.js.map +1 -1
  13. package/dist/cctext/language.d.ts +24 -22
  14. package/dist/cctext/language.js +43 -39
  15. package/dist/cctext/language.js.map +1 -1
  16. package/dist/error-E1LVq_3w.d.ts +87 -0
  17. package/dist/graph/graph.d.ts +2 -62
  18. package/dist/graph/graph.js +339 -382
  19. package/dist/graph/graph.js.map +1 -1
  20. package/dist/graph/index.d.ts +2 -1
  21. package/dist/graph/index.js +2 -384
  22. package/dist/graph-DR8rL2o3.d.ts +64 -0
  23. package/dist/hash-Y8I4c6Al.d.ts +8 -0
  24. package/dist/index-BKZ67WMa.d.ts +1 -0
  25. package/dist/index-BVVgDSdq.d.ts +1 -0
  26. package/dist/index-DmtQKWjk.d.ts +1 -0
  27. package/dist/index-_6s0AX1B.d.ts +1 -0
  28. package/dist/index.d.ts +27 -28
  29. package/dist/index.js +23 -5851
  30. package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
  31. package/dist/library/folder-tree.d.ts +22 -20
  32. package/dist/library/folder-tree.js +108 -130
  33. package/dist/library/folder-tree.js.map +1 -1
  34. package/dist/library/index.d.ts +8 -17
  35. package/dist/library/index.js +7 -2800
  36. package/dist/library/library-api.d.ts +3 -1
  37. package/dist/library/library-api.js +9 -8
  38. package/dist/library/library-api.js.map +1 -1
  39. package/dist/library/library.d.ts +2 -56
  40. package/dist/library/library.js +23 -19
  41. package/dist/library/library.js.map +1 -1
  42. package/dist/library/oss-api.d.ts +26 -37
  43. package/dist/library/oss-api.js +257 -1096
  44. package/dist/library/oss-api.js.map +1 -1
  45. package/dist/library/oss-layout-api.d.ts +28 -28
  46. package/dist/library/oss-layout-api.js +239 -316
  47. package/dist/library/oss-layout-api.js.map +1 -1
  48. package/dist/library/oss-layout.d.ts +2 -25
  49. package/dist/library/oss-layout.js +1 -1
  50. package/dist/library/oss.d.ts +87 -89
  51. package/dist/library/oss.js +27 -26
  52. package/dist/library/oss.js.map +1 -1
  53. package/dist/library/rsengine.d.ts +100 -106
  54. package/dist/library/rsengine.js +439 -2599
  55. package/dist/library/rsengine.js.map +1 -1
  56. package/dist/library/rsform-api.d.ts +11 -16
  57. package/dist/library/rsform-api.js +313 -825
  58. package/dist/library/rsform-api.js.map +1 -1
  59. package/dist/library/rsform.d.ts +159 -167
  60. package/dist/library/rsform.js +29 -28
  61. package/dist/library/rsform.js.map +1 -1
  62. package/dist/library/rsmodel-api.d.ts +8 -15
  63. package/dist/library/rsmodel-api.js +172 -813
  64. package/dist/library/rsmodel-api.js.map +1 -1
  65. package/dist/library/rsmodel.d.ts +27 -33
  66. package/dist/library/rsmodel.js +16 -23
  67. package/dist/library/rsmodel.js.map +1 -1
  68. package/dist/library/structure-planner.d.ts +20 -26
  69. package/dist/library/structure-planner.js +106 -474
  70. package/dist/library/structure-planner.js.map +1 -1
  71. package/dist/library-CYun28Xz.d.ts +58 -0
  72. package/dist/oss-layout-3glgAqfn.d.ts +27 -0
  73. package/dist/parser-Bwd8LxJ1.d.ts +7 -0
  74. package/dist/parsing/ast.d.ts +2 -49
  75. package/dist/parsing/ast.js +68 -76
  76. package/dist/parsing/ast.js.map +1 -1
  77. package/dist/parsing/index.d.ts +3 -3
  78. package/dist/parsing/index.js +3 -141
  79. package/dist/parsing/lezer-tree.d.ts +2 -13
  80. package/dist/parsing/lezer-tree.js +50 -43
  81. package/dist/parsing/lezer-tree.js.map +1 -1
  82. package/dist/rslang/api.d.ts +9 -14
  83. package/dist/rslang/api.js +114 -827
  84. package/dist/rslang/api.js.map +1 -1
  85. package/dist/rslang/ast-annotations.d.ts +2 -18
  86. package/dist/rslang/ast-annotations.js +34 -45
  87. package/dist/rslang/ast-annotations.js.map +1 -1
  88. package/dist/rslang/error.d.ts +2 -85
  89. package/dist/rslang/error.js +88 -150
  90. package/dist/rslang/error.js.map +1 -1
  91. package/dist/rslang/eval/calculator.d.ts +2 -43
  92. package/dist/rslang/eval/calculator.js +81 -1636
  93. package/dist/rslang/eval/calculator.js.map +1 -1
  94. package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
  95. package/dist/rslang/eval/evaluation-cache.js +168 -287
  96. package/dist/rslang/eval/evaluation-cache.js.map +1 -1
  97. package/dist/rslang/eval/evaluator.d.ts +59 -63
  98. package/dist/rslang/eval/evaluator.js +602 -1509
  99. package/dist/rslang/eval/evaluator.js.map +1 -1
  100. package/dist/rslang/eval/value-api.d.ts +2 -48
  101. package/dist/rslang/eval/value-api.js +2 -490
  102. package/dist/rslang/eval/value.d.ts +2 -36
  103. package/dist/rslang/eval/value.js +2 -118
  104. package/dist/rslang/index.d.ts +14 -17
  105. package/dist/rslang/index.js +12 -4314
  106. package/dist/rslang/labels.d.ts +6 -6
  107. package/dist/rslang/labels.js +139 -305
  108. package/dist/rslang/labels.js.map +1 -1
  109. package/dist/rslang/parser/expression-generator.d.ts +5 -5
  110. package/dist/rslang/parser/expression-generator.js +248 -446
  111. package/dist/rslang/parser/expression-generator.js.map +1 -1
  112. package/dist/rslang/parser/normalize.d.ts +4 -8
  113. package/dist/rslang/parser/normalize.js +286 -481
  114. package/dist/rslang/parser/normalize.js.map +1 -1
  115. package/dist/rslang/parser/parser.d.ts +2 -5
  116. package/dist/rslang/parser/parser.js +30 -21
  117. package/dist/rslang/parser/parser.js.map +1 -1
  118. package/dist/rslang/parser/parser.terms.d.ts +43 -41
  119. package/dist/rslang/parser/parser.terms.js +44 -83
  120. package/dist/rslang/parser/parser.terms.js.map +1 -1
  121. package/dist/rslang/parser/syntax-errors.d.ts +5 -8
  122. package/dist/rslang/parser/syntax-errors.js +113 -382
  123. package/dist/rslang/parser/syntax-errors.js.map +1 -1
  124. package/dist/rslang/parser/token.d.ts +2 -79
  125. package/dist/rslang/parser/token.js +81 -93
  126. package/dist/rslang/parser/token.js.map +1 -1
  127. package/dist/rslang/semantic/analyzer.d.ts +2 -39
  128. package/dist/rslang/semantic/analyzer.js +186 -2600
  129. package/dist/rslang/semantic/analyzer.js.map +1 -1
  130. package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
  131. package/dist/rslang/semantic/arguments-extractor.js +202 -361
  132. package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
  133. package/dist/rslang/semantic/type-auditor.d.ts +64 -68
  134. package/dist/rslang/semantic/type-auditor.js +594 -1564
  135. package/dist/rslang/semantic/type-auditor.js.map +1 -1
  136. package/dist/rslang/semantic/typification-api.d.ts +4 -7
  137. package/dist/rslang/semantic/typification-api.js +162 -303
  138. package/dist/rslang/semantic/typification-api.js.map +1 -1
  139. package/dist/rslang/semantic/typification-parser.d.ts +2 -12
  140. package/dist/rslang/semantic/typification-parser.js +165 -219
  141. package/dist/rslang/semantic/typification-parser.js.map +1 -1
  142. package/dist/rslang/semantic/typification.d.ts +2 -119
  143. package/dist/rslang/semantic/typification.js +66 -52
  144. package/dist/rslang/semantic/typification.js.map +1 -1
  145. package/dist/rslang/semantic/value-auditor.d.ts +32 -38
  146. package/dist/rslang/semantic/value-auditor.js +206 -518
  147. package/dist/rslang/semantic/value-auditor.js.map +1 -1
  148. package/dist/rslang/semantic/value-class.d.ts +2 -10
  149. package/dist/rslang/semantic/value-class.js +8 -7
  150. package/dist/rslang/semantic/value-class.js.map +1 -1
  151. package/dist/rslang/typification-graph.d.ts +2 -33
  152. package/dist/rslang/typification-graph.js +94 -306
  153. package/dist/rslang/typification-graph.js.map +1 -1
  154. package/dist/shared/branded.d.ts +2 -7
  155. package/dist/shared/branded.js +1 -1
  156. package/dist/shared/hash.d.ts +2 -6
  157. package/dist/shared/hash.js +13 -13
  158. package/dist/shared/hash.js.map +1 -1
  159. package/dist/shared/index.d.ts +3 -2
  160. package/dist/shared/index.js +2 -18
  161. package/dist/token-DeXAmzwr.d.ts +81 -0
  162. package/dist/typification-Dk-fisgO.d.ts +120 -0
  163. package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
  164. package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
  165. package/dist/value-B8UtCqaK.js +366 -0
  166. package/dist/value-B8UtCqaK.js.map +1 -0
  167. package/dist/value-CTjX6825.d.ts +33 -0
  168. package/dist/value-api-Bw-SgaYY.d.ts +49 -0
  169. package/dist/value-class-CNI-lqXJ.d.ts +12 -0
  170. package/package.json +8 -8
  171. package/src/library/rsform-api.test.ts +24 -0
  172. package/src/library/rsform-api.ts +12 -4
  173. package/dist/cctext/index.js.map +0 -1
  174. package/dist/graph/index.js.map +0 -1
  175. package/dist/index.js.map +0 -1
  176. package/dist/library/index.js.map +0 -1
  177. package/dist/library/oss-layout.js.map +0 -1
  178. package/dist/parsing/index.js.map +0 -1
  179. package/dist/rslang/eval/value-api.js.map +0 -1
  180. package/dist/rslang/eval/value.js.map +0 -1
  181. package/dist/rslang/index.js.map +0 -1
  182. package/dist/shared/branded.js.map +0 -1
  183. package/dist/shared/index.js.map +0 -1
@@ -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":"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"}
@@ -1,18 +1,2 @@
1
- import { AstNode } from '../parsing/ast.js';
2
- import { ExpressionType } from './semantic/typification.js';
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
- // src/rslang/ast-annotations.ts
2
- var AST_ERRORS_KEY = "rsErrors";
3
- var AST_TYPE_KEY = "rsType";
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
- node.annotation = {
6
- ...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
7
- [AST_TYPE_KEY]: type
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
- if (node.annotation && AST_TYPE_KEY in node.annotation) {
12
- return node.annotation[AST_TYPE_KEY];
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
- if (typeof node.annotation === "object" && node.annotation !== null && AST_ERRORS_KEY in node.annotation && isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])) {
18
- return;
19
- }
20
- const entry = params !== void 0 && params.length > 0 ? { code, params: [...params] } : { code };
21
- node.annotation = {
22
- ...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
23
- [AST_ERRORS_KEY]: entry
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
- const raw = node.annotation?.[AST_ERRORS_KEY];
28
- if (isAstNodeErrorRef(raw)) {
29
- return raw;
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
- if (typeof x !== "object" || x === null || !("code" in x)) {
35
- return false;
36
- }
37
- const code = x.code;
38
- if (typeof code !== "number") {
39
- return false;
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
- export {
51
- annotateError,
52
- annotateType,
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,IAAM,iBAAiB;AACvB,IAAM,eAAe;AAGd,SAAS,aAAa,MAAe,MAA4B;AACtE,OAAK,aAAa;AAAA,IAChB,GAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,OAAO,KAAK,aAAa,CAAC;AAAA,IACzF,CAAC,YAAY,GAAG;AAAA,EAClB;AACF;AAGO,SAAS,mBAAmB,MAAsC;AACvE,MAAI,KAAK,cAAc,gBAAgB,KAAK,YAAY;AACtD,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AACA,SAAO;AACT;AAGO,SAAS,cAAc,MAAe,MAAmB,QAAkC;AAChG,MACE,OAAO,KAAK,eAAe,YAC3B,KAAK,eAAe,QACpB,kBAAkB,KAAK,cACvB,kBAAkB,KAAK,WAAW,cAAc,CAAC,GACjD;AACA;AAAA,EACF;AACA,QAAM,QAAqB,WAAW,UAAa,OAAO,SAAS,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK;AAC9G,OAAK,aAAa;AAAA,IAChB,GAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,OAAO,KAAK,aAAa,CAAC;AAAA,IACzF,CAAC,cAAc,GAAG;AAAA,EACpB;AACF;AAGO,SAAS,oBAAoB,MAAmC;AACrE,QAAM,MAAM,KAAK,aAAa,cAAc;AAC5C,MAAI,kBAAkB,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,SAAS,kBAAkB,GAA8B;AACvD,MAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,EAAE,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,EAAE;AACf,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,EAAE,YAAY,IAAI;AACpB,WAAO;AAAA,EACT;AACA,QAAM,IAAK,EAA0B;AACrC,MAAI,MAAM,QAAW;AACnB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,UAAQ,OAAO,SAAS,QAAQ;AACrE;","names":[]}
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"}
@@ -1,85 +1,2 @@
1
- /** Module: Error types and functions. */
2
- /** Represents error class. */
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 };
@@ -1,159 +1,97 @@
1
- // src/rslang/error.ts
2
- var RSErrorClass = {
3
- LEXER: 0,
4
- PARSER: 1,
5
- SEMANTIC: 2,
6
- EVALUATION: 3,
7
- UNKNOWN: 4
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
- var RSErrorCode = {
10
- unknownSyntax: 33792,
11
- // 33792
12
- missingParenthesis: 33798,
13
- // 33798
14
- missingCurlyBrace: 33799,
15
- // 33799
16
- missingSquareBracket: 33800,
17
- // 33800
18
- bracketMismatch: 33801,
19
- // 33801
20
- doubleParenthesis: 33802,
21
- // 33802
22
- missingOpenBracket: 33803,
23
- // 33803
24
- expectedLocal: 33813,
25
- // 33813
26
- expectedType: 33814,
27
- // 33814
28
- localDoubleDeclare: 10241,
29
- // 10241
30
- localNotUsed: 10242,
31
- // 10242
32
- localUndeclared: 34817,
33
- // 34817
34
- localShadowing: 34818,
35
- // 34818
36
- typesNotEqual: 34819,
37
- // 34819
38
- globalNotTyped: 34820,
39
- // 34820
40
- invalidDecart: 34821,
41
- // 34821
42
- invalidBoolean: 34822,
43
- // 34822
44
- invalidTypeOperation: 34823,
45
- // 34823
46
- invalidCard: 34824,
47
- // 34824
48
- invalidDebool: 34825,
49
- // 34825
50
- globalFuncWithoutArgs: 34827,
51
- // 34827
52
- invalidReduce: 34832,
53
- // 34832
54
- invalidProjectionTuple: 34833,
55
- // 34833
56
- invalidProjectionSet: 34834,
57
- // 34834
58
- invalidEnumeration: 34835,
59
- // 34835
60
- invalidCortegeDeclare: 34836,
61
- // 34836
62
- localOutOfScope: 34837,
63
- // 34837
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
- var ERROR_EVALUATION_MASK = 256;
119
- var ERROR_LEXER_MASK = 512;
120
- var ERROR_PARSER_MASK = 1024;
121
- var ERROR_SEMANTIC_MASK = 2048;
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
- if ((error & ERROR_EVALUATION_MASK) !== 0) {
124
- return RSErrorClass.EVALUATION;
125
- } else if ((error & ERROR_LEXER_MASK) !== 0) {
126
- return RSErrorClass.LEXER;
127
- } else if ((error & ERROR_PARSER_MASK) !== 0) {
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
- const id = code.toString(16).toUpperCase();
137
- switch (inferErrorClass(code)) {
138
- case RSErrorClass.LEXER:
139
- return "L" + id;
140
- case RSErrorClass.PARSER:
141
- return "P" + id;
142
- case RSErrorClass.SEMANTIC:
143
- return "S" + id;
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
- return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;
92
+ return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;
152
93
  }
153
- export {
154
- RSErrorClass,
155
- RSErrorCode,
156
- getRSErrorPrefix,
157
- isCritical
158
- };
94
+ //#endregion
95
+ export { RSErrorClass, RSErrorCode, getRSErrorPrefix, isCritical };
96
+
159
97
  //# sourceMappingURL=error.js.map