@rsconcept/domain 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) 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 +258 -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/oss-api.test.ts +76 -0
  172. package/src/library/oss-api.ts +4 -1
  173. package/src/library/rsform-api.test.ts +24 -0
  174. package/src/library/rsform-api.ts +12 -4
  175. package/dist/cctext/index.js.map +0 -1
  176. package/dist/graph/index.js.map +0 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/library/index.js.map +0 -1
  179. package/dist/library/oss-layout.js.map +0 -1
  180. package/dist/parsing/index.js.map +0 -1
  181. package/dist/rslang/eval/value-api.js.map +0 -1
  182. package/dist/rslang/eval/value.js.map +0 -1
  183. package/dist/rslang/index.js.map +0 -1
  184. package/dist/shared/branded.js.map +0 -1
  185. 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/error.ts","../../../src/rslang/parser/parser.terms.ts","../../../src/rslang/parser/token.ts","../../../src/rslang/parser/normalize.ts","../../../src/rslang/parser/parser.ts","../../../src/rslang/parser/syntax-errors.ts","../../../src/rslang/semantic/typification.ts","../../../src/rslang/labels.ts","../../../src/rslang/semantic/typification-api.ts","../../../src/rslang/semantic/type-auditor.ts","../../../src/rslang/semantic/value-class.ts","../../../src/rslang/semantic/value-auditor.ts","../../../src/rslang/semantic/analyzer.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","/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n missingParenthesis: 0x8406, // 33798\n missingCurlyBrace: 0x8407, // 33799\n missingSquareBracket: 0x8408, // 33800\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localDoubleDeclare: 0x2801, // 10241\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n\n typesNotEqual: 0x8803, // 34819\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidProjectionTuple: 0x8811, // 34833\n invalidProjectionSet: 0x8812, // 34834\n invalidEnumeration: 0x8813, // 34835\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Expression = 1,\n Logic = 2,\n Logic_predicates = 3,\n Variable = 4,\n Local = 5,\n Tuple = 8,\n Expr_enum_min2 = 9,\n Logic_unary = 24,\n Predicate = 26,\n Logic_quantor = 29,\n Variable_pack = 31,\n Logic_binary = 33,\n Setexpr = 38,\n Integer = 39,\n EmptySet = 40,\n IntegerSet = 41,\n Global = 42,\n Radical = 43,\n Setexpr_binary = 44,\n Enumeration = 55,\n Boolean = 56,\n Filter_expression = 58,\n Filter = 59,\n Declarative = 60,\n PrefixD = 62,\n PrefixI = 63,\n Imperative = 64,\n Imp_blocks = 65,\n PrefixR = 67,\n Recursion = 68,\n Function = 69,\n BigPr = 70,\n SmallPr = 71,\n Card = 72,\n Bool = 73,\n Debool = 74,\n Red = 75,\n Function_decl = 76,\n Arguments = 77,\n Declaration = 78\n","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: Transforming AST to a simple form.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\n\nimport {\n Arguments,\n BigPr,\n Bool,\n Boolean,\n Card,\n Debool,\n Declaration,\n Declarative,\n EmptySet,\n Enumeration,\n Expr_enum_min2,\n Expression,\n Filter,\n Filter_expression,\n Function,\n Function_decl,\n Global,\n Imp_blocks,\n Imperative,\n Integer,\n IntegerSet,\n Local,\n Logic,\n Logic_binary,\n Logic_predicates,\n Logic_quantor,\n Logic_unary,\n Predicate,\n PrefixD,\n Radical,\n Recursion,\n Red,\n Setexpr,\n Setexpr_binary,\n SmallPr,\n Tuple,\n Variable,\n Variable_pack\n} from './parser.terms';\nimport { TokenID } from './token';\n\n/** Normalizes AST to a simple form. */\nexport function normalizeAST(ast: AstNode, input: string) {\n visitAstDFS(ast, node => normalizeNode(node, input));\n}\n\n// ====== Internals =========\nconst idRecord: Record<number, TokenID> = {\n [Global]: TokenID.ID_GLOBAL,\n [Local]: TokenID.ID_LOCAL,\n [Radical]: TokenID.ID_RADICAL,\n [Function]: TokenID.ID_FUNCTION,\n [Predicate]: TokenID.ID_PREDICATE,\n [Integer]: TokenID.LIT_INTEGER,\n [EmptySet]: TokenID.LIT_EMPTYSET,\n [IntegerSet]: TokenID.LIT_WHOLE_NUMBERS,\n\n [Boolean]: TokenID.BOOLEAN,\n\n [BigPr]: TokenID.BIGPR,\n [SmallPr]: TokenID.SMALLPR,\n [Filter]: TokenID.FILTER,\n\n [Bool]: TokenID.BOOL,\n [Debool]: TokenID.DEBOOL,\n [Red]: TokenID.REDUCE,\n [Card]: TokenID.CARD,\n\n [Enumeration]: TokenID.NT_ENUMERATION,\n [Tuple]: TokenID.NT_TUPLE,\n [Arguments]: TokenID.NT_ARGUMENTS,\n [Declaration]: TokenID.NT_ARG_DECL,\n [Function_decl]: TokenID.NT_FUNC_DEFINITION,\n [Variable_pack]: TokenID.NT_ENUM_DECL,\n [Declarative]: TokenID.NT_DECLARATIVE_EXPR,\n [Imperative]: TokenID.NT_IMPERATIVE_EXPR\n};\n\nfunction normalizeNode(node: AstNode, input: string) {\n if (node.hasError) {\n return;\n }\n switch (node.typeID) {\n case 0:\n return;\n\n case Expression:\n promoteSingleChild(node);\n return;\n\n case EmptySet:\n case IntegerSet:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'number';\n node.data.value = Number(input.slice(node.from, node.to));\n return;\n\n case Function:\n case Predicate:\n case Global:\n case Local:\n case Radical:\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string';\n node.data.value = input.slice(node.from, node.to);\n return;\n\n case Boolean:\n node.typeID = idRecord[node.typeID];\n if (node.children.length === 4) {\n node.children = [node.children[2]];\n } else {\n node.children = [node.children[1]];\n }\n clearData(node);\n return;\n\n case Filter:\n case BigPr:\n case SmallPr:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string[]';\n node.data.value = parseIndex(input.slice(node.from + 2, node.to));\n return;\n\n case Red:\n case Debool:\n case Bool:\n case Card:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Function_decl:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[1], node.children[3]];\n return;\n case Declaration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[0], node.children[2]];\n return;\n\n case Arguments:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children.length === 3) {\n processLeftEnum(node);\n }\n return;\n\n case Expr_enum_min2:\n processLeftEnum(node);\n return;\n\n case Setexpr:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else if (node.children.length === 4) {\n processTextFunction(node);\n }\n return;\n\n case Tuple:\n case Enumeration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[1].typeID === Expr_enum_min2) {\n for (const child of node.children[1].children) {\n child.parent = node;\n }\n node.children = node.children[1].children;\n } else {\n node.children = [node.children[1]];\n }\n return;\n\n case Logic_binary:\n case Logic_predicates:\n case Setexpr_binary:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n clearData(node);\n node.typeID = symbolToToken(node.children[1].data.value as string);\n if (node.typeID === TokenID.DECART) {\n processDecartChildren(node);\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n }\n return;\n\n case Filter_expression:\n processFilter(node);\n return;\n\n case Logic:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_unary:\n if (node.children[0].data.value === '¬') {\n clearData(node);\n node.typeID = TokenID.LOGIC_NOT;\n node.children = [node.children[1]];\n } else if (node.children[0].typeID === TokenID.ID_PREDICATE) {\n processTextFunction(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_quantor:\n clearData(node);\n node.typeID = symbolToToken(node.children[0].data.value as string);\n node.children = [node.children[1], node.children[3], node.children[4]];\n return;\n\n case Variable:\n convertTupleDeclaration(node.children[0]);\n promoteSingleChild(node);\n return;\n\n case Variable_pack:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else {\n node.typeID = idRecord[node.typeID];\n processLeftEnum(node);\n }\n return;\n\n case Declarative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[0].typeID === PrefixD) {\n node.children = [node.children[2], node.children[4], node.children[6]];\n } else {\n node.children = [node.children[1], node.children[3], node.children[5]];\n }\n return;\n\n case Imp_blocks:\n if (node.children.length === 1) {\n if (node.parent?.typeID === Imp_blocks) {\n promoteSingleChild(node);\n }\n } else {\n processLeftEnum(node);\n }\n return;\n\n case Imperative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n for (const child of node.children[4].children) {\n child.parent = node;\n }\n node.children = [node.children[2], ...node.children[4].children];\n return;\n\n case Recursion:\n if (node.children.length > 9) {\n node.typeID = TokenID.NT_RECURSIVE_FULL;\n node.children = [node.children[2], node.children[4], node.children[6], node.children[8]];\n } else {\n node.typeID = TokenID.NT_RECURSIVE_SHORT;\n node.children = [node.children[2], node.children[4], node.children[6]];\n }\n return;\n }\n}\n\nfunction convertTupleDeclaration(node: AstNode) {\n if (node.typeID !== TokenID.NT_TUPLE) {\n return;\n }\n node.typeID = TokenID.NT_TUPLE_DECL;\n for (const child of node.children) {\n convertTupleDeclaration(child);\n }\n}\n\nfunction clearData(node: AstNode) {\n node.data.value = null;\n node.data.dataType = 'null';\n}\n\nfunction promoteSingleChild(node: AstNode, index: number = 0) {\n for (const child of node.children[index].children) {\n child.parent = node;\n }\n node.typeID = node.children[index].typeID;\n node.data = node.children[index].data;\n node.parenthesis = node.children[index].parenthesis;\n node.children = node.children[index].children;\n}\n\nfunction parseIndex(text: string): string[] {\n return text.split(',');\n}\n\nfunction symbolToToken(symbol: string): TokenID {\n switch (symbol) {\n case '+':\n return TokenID.PLUS;\n case '-':\n return TokenID.MINUS;\n case '*':\n return TokenID.MULTIPLY;\n\n case '∪':\n return TokenID.SET_UNION;\n case '\\\\':\n return TokenID.SET_MINUS;\n case '∆':\n return TokenID.SET_SYMMETRIC_MINUS;\n case '∩':\n return TokenID.SET_INTERSECTION;\n case '×':\n return TokenID.DECART;\n\n case '∈':\n return TokenID.SET_IN;\n case '∉':\n return TokenID.SET_NOT_IN;\n case '⊆':\n return TokenID.SUBSET_OR_EQ;\n case '⊄':\n return TokenID.NOT_SUBSET;\n case '⊂':\n return TokenID.SUBSET;\n\n case '>':\n return TokenID.GREATER;\n case '≥':\n return TokenID.GREATER_OR_EQ;\n case '<':\n return TokenID.LESSER;\n case '≤':\n return TokenID.LESSER_OR_EQ;\n\n case '≠':\n return TokenID.NOTEQUAL;\n case '=':\n return TokenID.EQUAL;\n\n case ':∈':\n return TokenID.ITERATE;\n case ':=':\n return TokenID.ASSIGN;\n\n case '¬':\n return TokenID.LOGIC_NOT;\n\n case '⇔':\n return TokenID.LOGIC_EQUIVALENT;\n case '⇒':\n return TokenID.LOGIC_IMPLICATION;\n case '∨':\n return TokenID.LOGIC_OR;\n case '&':\n return TokenID.LOGIC_AND;\n\n case '∀':\n return TokenID.QUANTOR_UNIVERSAL;\n case '∃':\n return TokenID.QUANTOR_EXISTS;\n }\n return TokenID.ERROR;\n}\n\nfunction processParenthesis(node: AstNode) {\n promoteSingleChild(node, 1);\n node.parenthesis = true;\n}\n\nfunction processLeftEnum(node: AstNode) {\n if (node.children[0].typeID === node.typeID) {\n for (const child of node.children[0].children) {\n child.parent = node;\n }\n node.children = [...node.children[0].children, node.children[2]];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n}\n\nfunction processDecartChildren(node: AstNode) {\n const newChildren: AstNode[] = [];\n if (node.children[0].typeID === TokenID.DECART && !node.children[0].parenthesis) {\n for (const child of node.children[0].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[0]);\n }\n\n if (node.children[2].typeID === TokenID.DECART && !node.children[2].parenthesis) {\n for (const child of node.children[2].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[2]);\n }\n node.children = newChildren;\n}\n\nfunction processTextFunction(node: AstNode) {\n if (node.children[0].typeID === TokenID.ID_FUNCTION || node.children[0].typeID === TokenID.ID_PREDICATE) {\n node.typeID = TokenID.NT_FUNC_CALL;\n clearData(node);\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n }\n node.children = [node.children[0], ...node.children[2].children];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n } else {\n node.typeID = node.children[0].typeID;\n node.data = node.children[0].data;\n node.children = [node.children[2]];\n }\n}\n\nfunction processFilter(node: AstNode) {\n const children: AstNode[] = [];\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n children.push(child);\n }\n } else {\n children.push(node.children[2]);\n }\n children.push(node.children[5]);\n promoteSingleChild(node);\n node.children = children;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"2lO!sQPOOOVQPO'#CdO$qQPO'#C`O&pQPO'#C`O*bQPO'#C_Q*jQPOOO,TQPO'#CyOVQPO'#CtO,]QPO'#CtOOQO'#Ct'#CtOOQO'#C^'#C^OOQO'#ES'#ESOOQO'#ET'#ETO,bQPO'#DeO,iQPO'#DfO,qQPO'#DhO,vQPO'#DjO,{QPO'#DnO-QQPO'#DrOOQO'#EU'#EUOOQO'#EV'#EVOOQO'#DS'#DSO-VQPO'#DSO-[QPO'#DSOOQO'#EQ'#EQO,TQPO'#DzQOQPOOO-aQPO'#ERO-nQPO,59OO-vQPO'#CeO-{QPO,58xO/lQPO,59tOVQPO,58yOVQPO,58yOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO'#CdOOQO'#C`'#C`OOQO'#C{'#C{O1]QPO,59eO2rQPO,59`OVQPO,59`OOQO'#ER'#ERO5TQPO,5:PO5]QPO,5:UOVQPO,5:QOOQO,5:Q,5:QOVQPO,5:SO,TQPO,5:UOVQPO,5:YO,TQPO,5:^OVQPO,59nOVQPO,59nO5dQPO'#D|OOQO'#D{'#D{O5iQPO,5:fOOQO1G.j1G.jOVQPO,59POOQO1G.d1G.dOOQO1G/`1G/`O5qQPO1G.eO7vQPO1G.eO:zQPO1G/TO=]QPO1G/TO?nQPO1G/TOBPQPO1G/TOGyQPO1G/`OHQQPO1G/`OKpQPO1G/`O! `QPO1G/`O! gQPO1G/`O! nQPO1G/`O! uQPO1G/`O,TQPO,59gOVQPO1G/PO!%aQPO1G.zOOQO1G/k1G/kOVQPO1G/pO!%iQPO1G/lO!%pQPO1G/nO!%xQPO1G/pO!%}QPO1G/tO!&UQPO1G/xO!&ZQPO1G/YO!&cQPO1G/YOVQPO,5:hO,TQPO,5:gOVQPO1G0QO!&jQPO1G.kOOQO1G/R1G/RO!&zQPO7+$kOOQO7+$f7+$fO!(gQPO7+%[OOQO7+%W7+%WO!(nQPO7+%YOVQPO7+%[OVQPO7+%`OVQPO7+%dOOQO7+$t7+$tO!(sQPO1G0SOOQO1G0R1G0RO!(}QPO7+%lO!)UQPO<<HVOVQPO<<HvOVQPO<<HtO!+gQPO<<HvO!+nQPO'#DoO!+xQPO<<HzO!,QQPO<<IOO!,XQPOAN>bO!,`QPOAN>`OVQPOAN>bOVQPO,5:ZOOQOAN>fAN>fOVQPOAN>jOOQOG23|G23|OOQOG23zG23zO!,gQPOG23|O!,nQPO1G/uO!,xQPOG24UOOQOLD)hLD)hOOQOLD)pLD)pOVQPOLD)pO!-SQPO!$'M[OOQO!)9Bv!)9Bv\",\n stateData: \"!-l~O!sOS~OTQOVPOiVOjWOnUOpUOwZOxZOyZOz[O{[O!W]O!Z^O!]_O!``O!aaO!ebO!gfO!hdO!idO!jdO!kdO!ldO!mdO~OkiO~PVOZSX[SX]!wX^!wX_!wX`!wXa!wXb!wXc!wXd!wXe!wXf!wXg!wXr!wXs!wXt!wXu!wX}!wX!O!wX!P!wX!Q!wX!R!wX!S!wX!T!wX!U!wXY!wX!V!wX~O!q!wXU!wXl!wX!_!wXT!wXV!wXi!wXj!wXn!wXp!wXw!wXx!wXy!wXz!wX{!wX!W!wX!Z!wX!]!wX!`!wX!a!wX!e!wX!g!wX!h!wX!i!wX!j!wX!k!wX!l!wX!m!wX!d!wX~P!zOZSX[SX]!xX^!xX_!xX`!xXa!xXb!xXc!xXd!xXe!xXf!xXg!xXr!xXs!xXt!xXu!xX}!xX!O!xX!P!xX!Q!xX!R!xX!S!xX!T!xX!U!xX!q!xXY!xX!V!xXU!xXl!xX!_!xXT!xXV!xXi!xXj!xXn!xXp!xXw!xXx!xXy!xXz!xX{!xX!W!xX!Z!xX!]!xX!`!xX!a!xX!e!xX!g!xX!h!xX!i!xX!j!xX!k!xX!l!xX!m!xX!d!xX~OZpO[pO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~OT!POV!OO~Ok!TO~OT!WO~PYOV!XO!Z^O~Ok!ZO~O!W![O~O!W!]O~O!W!^O~Ok!_O~OV!`O~OY!uX!V!uXl!uX~P*jOU!dOY!uX~OY!eO~OU!fOY!tX]!tX^!tX_!tX`!tXa!tXb!tXc!tXd!tXe!tXf!tXg!tXr!tXs!tXt!tXu!tX}!tX!O!tX!P!tX!Q!tX!R!tX!S!tX!T!tX!U!tX~OU!gOYvX]vX^vX_vX`vXavXbvXcvXdvXevXfvXgvXrvXsvXtvXuvX}vX!OvX!PvX!QvX!RvX!SvX!TvX!UvX~OY!uO]!vO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~Orhashathauha!qhaUhaYha!Vhalha!_haThaVhaihajhanhaphawhaxhayhazha{ha!Wha!Zha!]ha!`ha!aha!eha!gha!hha!iha!jha!kha!lha!mha!dha~P1eOY!eO!V!xO~O]!yO~P!zO]#RO~OY#SOl#TO~O!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P*jO]Ri^Ri_Ri`RiaRibRicRidRieRifRigRirRisRitRiuRi!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P+iOssOttOuuOrqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOttOuuOrqisqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOuuOrqisqitqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOrqisqitqiuqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eO}vO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!P|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!O|i~PDbO!OwO~PDbO}vO!OwO!PxO!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!R|i!S|i!T|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!Q|i~PHXO}vO!OwO!PxO!QyO!T|O!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!S|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!R|i~PKwO!RzO~PKwO!QyO~PHXO}vO!OwO!PxO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~OY!eOl#XO~OU#ZO~P*jOY!eOl#[O~O]#]O~O!_#^O~P*jO[#_O~OY!eOl#`O~OU#`O~P*jOUXiYXi!VXilXi~P*jO]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~PVO!_#eO~P*jOV#fO~OY!pil!pi~P*jO!q!nq~P*jOrmysmytmyumy!qmyUmyYmy!Vmylmy!_myTmyVmyimyjmynmypmywmyxmyymyzmy{my!Wmy!Zmy!]my!`my!amy!emy!gmy!hmy!imy!jmy!kmy!lmy!mmy!dmy~P1eO!_#mO~P*jO!V!cX!d!cX~P*jO!V#oO!d#nO~O!_#pO~P*jO!V#qO~P*jOU#rO~P*jO!V#vO~P*jO!V!ci!d!ci~P*jO!V#wO!_#xO~P*jO!V#zO~P*jO!]!hj!gz{!j!k!l!m!iT!e!a!`!a~\",\n goto: \"1O!zPP!{#y$uPPP&R'VPPPPPPPPPPPPPP#yPPPP'aP(]P#yPPPP(`PPPPP)[PPPPPPPPPP*Y+UP*YP*YPPP*Y,TPP*YPPPPPPP,W,Z,^PPP,d.v/W/W/W0S!phOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRnP!sYOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rSOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xQ!QUS!ai#SQ!|![Q#O!^R#V!u!rROPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x]!PUi![!^!u#SSlP!OX!U]!T!Z!_!sXOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!RU!shOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!peOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRoP!scOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rcOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!Y^R#i#^RjOR!ciQ!biR#b#SQTO[kP]!O!T!Z!_Q!SVQ!gvQ!hpQ!iqQ!jrQ!ksQ!ltQ!muQ!nwQ!oxQ!pyQ!qzQ!r{Q!s|Q!t}Q!z!XQ!}!]Q#Q!`Q#U!eQ#W!vQ#Y!yQ#a#RQ#c#TQ#d#WQ#g#]Q#h#^Q#j#_Q#k#eQ#l#fQ#s#mQ#t#nQ#u#pR#y#xSmP!OQ!V]Q!w!TQ!{!ZR#P!_!seOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!sgOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x\",\n nodeNames: \"⚠ Expression Logic Logic_predicates Variable Local ) ( Tuple Expr_enum_min2 , :∈ := ∈ ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = Logic_unary ¬ Predicate [ ] Logic_quantor ∀ Variable_pack ∃ Logic_binary ⇔ ⇒ ∨ & Setexpr Integer EmptySet IntegerSet Global Radical Setexpr_binary * + - ∪ \\\\ ∆ ∩ × } { Enumeration Boolean ℬ Filter_expression Filter Declarative | PrefixD PrefixI Imperative Imp_blocks ; PrefixR Recursion Function BigPr SmallPr Card Bool Debool Red Function_decl Arguments Declaration\",\n maxTerm: 87,\n nodeProps: [\n [\"openedBy\", 6,\"(\",53,\"{\"],\n [\"closedBy\", 7,\")\",54,\"}\"]\n ],\n skippedNodes: [0],\n repeatNodeCount: 0,\n tokenData: \"6j~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q![']![!]'e!]!^'x!^!_'}!_!`(S!`!a(X!c!d(^!e!f(^!f!g(l!h!i(t!k!l)h!p!q(^!r!s)m!t!u*a!u!v(^!v!w(^!z!{(^!|!}*q!}#O*v#O#P*{#P#Q+Q#R#S+V#T#U+V#U#V+m#V#W-]#W#X.x#X#d+V#d#e1b#e#f+V#f#g2w#g#o+V#o#p4R#p#q4W#q#r4]#y#z%s$f$g%s$r$s4b%o%p4g5i6S+V#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s% l% m4l%%Y%%Z4q%%[%%]4v%&Y%&Z4{%&]%&^5Q%&_%&`5V%&`%&a5[%&b%&c5a%&c%&d5f%'S%'T5k%'T%'U5p%'U%'V5u%(^%(_5z%(b%(c6P%(c%(d6U%)Q%)R6Z%)S%)T6`%)U%)V6e&FU&FV%s~%xY!s~X^%spq%s#y#z%s$f$g%s#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s&FU&FV%s~&mOu~~&rOV~~&wOU~~&|O}~~'RO!O~~'WOY~~']O!P~~'bPw~!Q![']~'hQ!_!`'n%&b%&c's~'sO[~~'xOZ~~'}O!d~~(SOd~~(XOg~~(^Ob~~(aP!Q![(d~(iPz~!Q![(d~(qP!`~!Q![(d~(wQ!Q![(}#]#^)V~)SP!g~!Q![(}~)YP!R![)]~)bQ!]~|})V!Q![)]~)mO!a~~)pQ!Q![)v#f#g*O~){Pj~!Q![)v~*RP!R![*U~*ZQ!h~|}*O!Q![*U~*fP!e~!Q![*i~*nP{~!Q![*i~*vOy~~*{Ok~~+QO!R~~+VOl~~+[RT~!Q![+e#T#o+V5i6S+V~+jPT~!Q![+e~+rTT~!Q![+e#T#c+V#c#d,R#d#o+V5i6S+V~,WTT~!Q![+e#T#c+V#c#d,g#d#o+V5i6S+V~,lTT~!Q![+e#T#`+V#`#a,{#a#o+V5i6S+V~-SR!k~T~!Q![+e#T#o+V5i6S+V~-bST~!Q![+e#T#U-n#U#o+V5i6S+V~-sTT~!Q![+e#T#f+V#f#g.S#g#o+V5i6S+V~.XTT~!Q![+e#T#W+V#W#X.h#X#o+V5i6S+V~.oR!j~T~!Q![+e#T#o+V5i6S+V~.}TT~!Q![+e#T#X+V#X#Y/^#Y#o+V5i6S+V~/cTT~!Q![+e#T#U+V#U#V/r#V#o+V5i6S+V~/wTT~!Q![+e#T#c+V#c#d0W#d#o+V5i6S+V~0]TT~!Q![+e#T#c+V#c#d0l#d#o+V5i6S+V~0qTT~!Q![+e#T#`+V#`#a1Q#a#o+V5i6S+V~1XR!l~T~!Q![+e#T#o+V5i6S+V~1gTT~!Q![+e#T#f+V#f#g1v#g#o+V5i6S+V~1{ST~!Q!R+e!R![2X#T#o+V5i6S+V~2`Q!i~T~|}2f!Q![2X~2iP!R![2l~2qQ!i~|}2f!Q![2l~2|TT~!Q![+e#T#X+V#X#Y3]#Y#o+V5i6S+V~3bTT~!Q![+e#T#W+V#W#X3q#X#o+V5i6S+V~3xR!m~T~!Q![+e#T#o+V5i6S+V~4WO!W~~4]O!_~~4bO!V~~4gOi~~4lO!U~~4qO!Z~~4vOs~~4{Or~~5QOn~~5VOp~~5[Ox~~5aO!S~~5fO]~~5kO^~~5pOt~~5uO!T~~5zO!Q~~6POf~~6UOe~~6ZOc~~6`Oa~~6eO`~~6jO_~\",\n tokenizers: [0],\n topRules: {\"Expression\":[0,1]},\n tokenPrec: 2679\n})\n","/**\n * Module: Syntactic errors reporting.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode, type RSErrorDescription } from '../error';\n\nimport { Variable } from './parser.terms';\nimport { TokenID } from './token';\n\nexport function extractSyntaxErrors(\n ast: AstNode,\n expression: string,\n reporter: ErrorReporter,\n annotateErrors: boolean = false\n) {\n const bracketError = extractBracketErrors(expression);\n if (bracketError !== null) {\n reporter(bracketError);\n if (annotateErrors) {\n annotateError(ast, bracketError.code, bracketError.params);\n }\n }\n const hasBracketErrors = bracketError !== null;\n visitAstDFS(ast, node => extractInternal(node, reporter, annotateErrors, hasBracketErrors));\n}\n\n// ====== Internals =========\nfunction extractInternal(\n node: AstNode,\n reporter: ErrorReporter,\n annotateErrors: boolean,\n ignoreUnknownErrors: boolean\n) {\n if (node.typeID !== TokenID.ERROR) {\n return;\n }\n\n function emit(target: AstNode, code: RSErrorCode) {\n reporter({ code: code, from: target.from, to: target.to });\n if (annotateErrors) {\n annotateError(target, code);\n }\n }\n\n const parent = node.parent;\n if (parent === null) {\n if (!ignoreUnknownErrors) {\n return emit(node, RSErrorCode.unknownSyntax);\n }\n return;\n }\n\n if (parent.typeID === Variable) {\n return emit(parent, RSErrorCode.expectedLocal);\n }\n\n if (!ignoreUnknownErrors) {\n emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);\n }\n}\n\ntype OpenBracket = '(' | '[' | '{';\ntype CloseBracket = ')' | ']' | '}';\n\ninterface BracketFrame {\n bracket: OpenBracket;\n index: number;\n}\n\nfunction extractBracketErrors(expression: string): RSErrorDescription | null {\n const stack: BracketFrame[] = [];\n\n for (let pos = 0; pos < expression.length; pos++) {\n const symbol = expression[pos];\n if (isOpenBracket(symbol)) {\n if (isDoubleParenthesis(expression, pos)) {\n return {\n code: RSErrorCode.doubleParenthesis,\n from: pos,\n to: pos + 2\n };\n }\n stack.push({ bracket: symbol, index: pos });\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n\n const expectedOpen = closeToOpen(symbol);\n const top = stack[stack.length - 1];\n if (top === undefined) {\n return {\n code: RSErrorCode.missingOpenBracket,\n from: pos,\n to: pos + 1,\n params: [expectedOpen]\n };\n }\n\n if (top.bracket !== expectedOpen) {\n return {\n code: RSErrorCode.bracketMismatch,\n from: pos,\n to: pos + 1,\n params: [openToClose(top.bracket), symbol]\n };\n }\n\n stack.pop();\n }\n\n if (stack.length > 0) {\n const unclosed = stack[0];\n const code = missingBracketCode(unclosed.bracket);\n return {\n code,\n from: expression.length,\n to: expression.length\n };\n }\n\n return null;\n}\n\nfunction missingBracketCode(bracket: OpenBracket): RSErrorCode {\n switch (bracket) {\n case '(':\n return RSErrorCode.missingParenthesis;\n case '[':\n return RSErrorCode.missingSquareBracket;\n case '{':\n return RSErrorCode.missingCurlyBrace;\n }\n}\n\nfunction isOpenBracket(symbol: string): symbol is OpenBracket {\n return symbol === '(' || symbol === '[' || symbol === '{';\n}\n\nfunction isCloseBracket(symbol: string): symbol is CloseBracket {\n return symbol === ')' || symbol === ']' || symbol === '}';\n}\n\nfunction openToClose(symbol: OpenBracket): CloseBracket {\n switch (symbol) {\n case '(':\n return ')';\n case '[':\n return ']';\n case '{':\n return '}';\n }\n}\n\nfunction closeToOpen(symbol: CloseBracket): OpenBracket {\n switch (symbol) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n }\n}\n\nfunction isDoubleParenthesis(expression: string, pos: number): boolean {\n const isOpenDoubleParenthesis = expression[pos] === '(' && expression[pos + 1] === '(';\n if (!isOpenDoubleParenthesis) {\n return false;\n }\n\n const outerClose = findMatchingCloseBracket(expression, pos);\n const innerClose = findMatchingCloseBracket(expression, pos + 1);\n if (outerClose < 0 || innerClose < 0) {\n return false;\n }\n\n return outerClose === innerClose + 1;\n}\n\nfunction findMatchingCloseBracket(expression: string, openPos: number): number {\n if (expression[openPos] !== '(') {\n return -1;\n }\n\n const stack: OpenBracket[] = [];\n for (let index = openPos; index < expression.length; index++) {\n const symbol = expression[index];\n if (isOpenBracket(symbol)) {\n stack.push(symbol);\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n const top = stack.pop();\n if (top === undefined || top !== closeToOpen(symbol)) {\n return -1;\n }\n if (stack.length === 0) {\n return index;\n }\n }\n\n return -1;\n}\n","/*\n * Module: Typification for RSLang.\n */\n\nimport { type Branded } from '../../shared';\n\n/** Typification structure enumeration. */\nexport const TypeID = {\n anyTypification: 1,\n integer: 2,\n basic: 3,\n tuple: 4,\n collection: 5,\n logic: 6,\n function: 7,\n predicate: 8\n} as const;\nexport type TypeID = (typeof TypeID)[keyof typeof TypeID];\n\n/** Represents type class. */\nexport const TypeClass = {\n logic: 1,\n typification: 2,\n function: 3,\n predicate: 4\n} as const;\nexport type TypeClass = (typeof TypeClass)[keyof typeof TypeClass];\n\n/** Logic type object. */\nexport const LogicT = { typeID: TypeID.logic } as const;\n\n/** Integer type object. */\nexport const IntegerT = {\n typeID: TypeID.integer,\n isOrdered: true,\n isArithmetic: true,\n isIntegerCompatible: true\n} as const;\n\n/** Type transformation path. */\nexport type TypePath = Branded<number[], 'TypePath'>;\n\n/** Creates type path. */\nexport function makeTypePath(path: number[]): TypePath {\n return path as TypePath;\n}\n\n/** AnyTyped type object. */\nexport const AnyTypificationT = { typeID: TypeID.anyTypification } as const;\n\n/** Empty set typification. */\nexport const EmptySetT = bool(AnyTypificationT);\n\n/** Parametrized typification. */\nexport type Parametrized = EchelonFunctional | EchelonPredicate;\n\n/** General expression types. */\nexport type ExpressionType =\n | EchelonLogic\n | EchelonBase\n | EchelonTuple\n | EchelonCollection\n | EchelonFunctional\n | EchelonPredicate\n | EchelonAnyTyped\n | EchelonInteger;\n\n/** Setexpr type. */\nexport type Typification = EchelonBase | EchelonAnyTyped | EchelonInteger | EchelonCollection | EchelonTuple;\n\n/** Typification context. */\nexport type TypeContext = Map<string, ExpressionType>;\n\n/** Functional argument. */\nexport interface Argument {\n readonly alias: string;\n readonly type: Typification;\n}\n\n/** Type: Logic. */\nexport interface EchelonLogic {\n readonly typeID: typeof TypeID.logic;\n}\n\n/** Type: AnyTyped. */\nexport interface EchelonAnyTyped {\n readonly typeID: typeof TypeID.anyTypification;\n}\n\n/** Type: Integer. */\nexport interface EchelonInteger {\n readonly typeID: typeof TypeID.integer;\n readonly isOrdered: true;\n readonly isArithmetic: true;\n readonly isIntegerCompatible: true;\n}\n\n/** Type: Element of basic set. */\nexport interface EchelonBase {\n readonly typeID: typeof TypeID.basic;\n readonly baseID: string;\n readonly isOrdered?: boolean;\n readonly isArithmetic?: boolean;\n readonly isIntegerCompatible?: boolean;\n}\n\n/** Type: Tuple. */\nexport interface EchelonTuple {\n readonly typeID: typeof TypeID.tuple;\n readonly factors: readonly Typification[];\n}\n\n/** Type: Collection. */\nexport interface EchelonCollection {\n readonly typeID: typeof TypeID.collection;\n readonly base: Typification;\n}\n\n/** Type: Functional. */\nexport interface EchelonFunctional {\n readonly typeID: typeof TypeID.function;\n readonly result: Typification;\n readonly args: readonly Argument[];\n}\n\n/** Type: Predicate. */\nexport interface EchelonPredicate {\n readonly typeID: typeof TypeID.predicate;\n readonly result: EchelonLogic;\n readonly args: readonly Argument[];\n}\n\n/** Create basic element typification. */\nexport function basic(alias: string): EchelonBase {\n return { typeID: TypeID.basic, baseID: alias };\n}\n\n/** Create constant element typification. */\nexport function constant(alias: string): EchelonBase {\n return { typeID: TypeID.basic, baseID: alias, isOrdered: true, isArithmetic: true, isIntegerCompatible: true };\n}\n\n/** Create boolean typification. */\nexport function bool(base: Typification): EchelonCollection {\n return { typeID: TypeID.collection, base };\n}\n\n/** Create tuple typification. */\nexport function tuple(factors: Typification[]): EchelonTuple {\n if (factors.length < 2) {\n throw new Error('Tuple with less than two factors is not allowed');\n }\n return { typeID: TypeID.tuple, factors };\n}\n\n/** Remove boolean from typification. */\nexport function debool(target: EchelonCollection): Typification {\n return target.base;\n}\n\n/** Extract component from tuple. */\nexport function component(target: EchelonTuple, index: number): Typification | null {\n return target.factors[index - 1] ?? null;\n}\n\n/** Checks if given type is typification. */\nexport function isTypification(type: ExpressionType | null): boolean {\n return (\n type?.typeID === TypeID.basic ||\n type?.typeID === TypeID.anyTypification ||\n type?.typeID === TypeID.integer ||\n type?.typeID === TypeID.collection ||\n type?.typeID === TypeID.tuple\n );\n}\n\n/** Checks if given type is radical. */\nexport function isRadical(alias: string): boolean {\n return alias.length > 0 && alias.startsWith('R') && alias[1] !== '0';\n}\n","import { type AstNodeBase } from '../parsing';\n\nimport { TokenID } from './parser/token';\nimport { type ExpressionType, TypeID } from './semantic/typification';\n\nconst INTEGER_TYPE_NAME = 'Z';\nconst ANY_TYPE_NAME = 'R0';\nconst LOGIC_TYPE_NAME = 'Logic';\n\nconst labelTokenRecord: Partial<Record<TokenID, string>> = {\n [TokenID.DECART]: '×',\n [TokenID.PUNCTUATION_PL]: '( )',\n [TokenID.PUNCTUATION_SL]: '[ ]',\n [TokenID.QUANTOR_UNIVERSAL]: '∀',\n [TokenID.QUANTOR_EXISTS]: '∃',\n [TokenID.LOGIC_NOT]: '¬',\n [TokenID.LOGIC_AND]: '&',\n [TokenID.LOGIC_OR]: '∨',\n [TokenID.LOGIC_IMPLICATION]: '⇒',\n [TokenID.LOGIC_EQUIVALENT]: '⇔',\n [TokenID.LIT_EMPTYSET]: '∅',\n [TokenID.LIT_WHOLE_NUMBERS]: 'Z',\n [TokenID.MULTIPLY]: '*',\n [TokenID.EQUAL]: '=',\n [TokenID.NOTEQUAL]: '≠',\n [TokenID.GREATER_OR_EQ]: '≥',\n [TokenID.LESSER_OR_EQ]: '≤',\n [TokenID.SET_IN]: '∈',\n [TokenID.SET_NOT_IN]: '∉',\n [TokenID.SUBSET_OR_EQ]: '⊆',\n [TokenID.SUBSET]: '⊂',\n [TokenID.NOT_SUBSET]: '⊄',\n [TokenID.SET_INTERSECTION]: '∩',\n [TokenID.SET_UNION]: '∪',\n [TokenID.SET_MINUS]: '\\\\',\n [TokenID.SET_SYMMETRIC_MINUS]: '∆',\n [TokenID.BOOLEAN]: 'ℬ()',\n [TokenID.NT_DECLARATIVE_EXPR]: 'D{}',\n [TokenID.NT_IMPERATIVE_EXPR]: 'I{}',\n [TokenID.NT_RECURSIVE_FULL]: 'R{}',\n [TokenID.BIGPR]: 'Pr1()',\n [TokenID.SMALLPR]: 'pr1()',\n [TokenID.FILTER]: 'Fi1[]()',\n [TokenID.REDUCE]: 'red()',\n [TokenID.CARD]: 'card()',\n [TokenID.BOOL]: 'bool()',\n [TokenID.DEBOOL]: 'debool()',\n [TokenID.ASSIGN]: ':=',\n [TokenID.ITERATE]: ':∈'\n};\n\n/** Retrieves label for {@link TokenID}. */\nexport function labelToken(id: TokenID): string {\n const text = labelTokenRecord[id];\n return text ?? 'UNKNOWN TOKEN: ' + String(id);\n}\n\n/** Generates label for {@link AstNodeBase}. */\nexport function labelRSLangNode(node: AstNodeBase): string {\n // prettier-ignore\n switch (node.typeID) {\n case TokenID.ERROR: return '[ERROR]';\n case TokenID.ID_LOCAL:\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n case TokenID.ID_RADICAL:\n return node.data.value as string;\n\n case TokenID.LIT_INTEGER: return String(node.data.value);\n\n case TokenID.BIGPR: return 'Pr' + (node.data.value as string[]).toString();\n case TokenID.SMALLPR: return 'pr' + (node.data.value as string[]).toString();\n case TokenID.FILTER: return 'Fi' + (node.data.value as string[]).toString();\n\n case TokenID.NT_DECLARATIVE_EXPR: return 'DECLARATIVE';\n case TokenID.NT_IMPERATIVE_EXPR: return 'IMPERATIVE';\n case TokenID.NT_RECURSIVE_FULL: return 'RECURSIVE';\n case TokenID.NT_RECURSIVE_SHORT: return 'RECURSIVE';\n\n case TokenID.BOOLEAN: return 'ℬ';\n case TokenID.REDUCE: return 'red';\n case TokenID.CARD: return 'card';\n case TokenID.BOOL: return 'bool';\n case TokenID.DEBOOL: return 'debool';\n\n case TokenID.PLUS: return '+';\n case TokenID.MINUS: return '-';\n case TokenID.MULTIPLY: return '*';\n case TokenID.GREATER: return '>';\n case TokenID.LESSER: return '<';\n\n case TokenID.NT_TUPLE: return 'TUPLE';\n case TokenID.NT_ENUMERATION: return 'ENUM';\n\n case TokenID.NT_ENUM_DECL: return 'ENUM_DECLARE';\n case TokenID.NT_TUPLE_DECL: return 'TUPLE_DECLARE';\n case TokenID.PUNCTUATION_DEFINE: return 'DEFINITION';\n case TokenID.PUNCTUATION_STRUCT: return 'STRUCTURE_DEFINE';\n\n case TokenID.NT_ARG_DECL: return 'ARG';\n case TokenID.NT_FUNC_CALL: return 'CALL';\n case TokenID.NT_ARGUMENTS: return 'ARGS';\n\n case TokenID.NT_FUNC_DEFINITION: return 'FUNCTION_DEFINE';\n\n case TokenID.DECART:\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.LOGIC_NOT:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\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_OR_EQ:\n case TokenID.SUBSET:\n case TokenID.NOT_SUBSET:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_UNION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.ASSIGN:\n case TokenID.ITERATE:\n return labelToken(node.typeID);\n }\n if (node.data.value) {\n return node.data.value as string;\n }\n return 'UNKNOWN NODE: ' + String(node.typeID);\n}\n\n/** Converts expression type to string. */\nexport function labelType(type: ExpressionType | null): string {\n if (!type) {\n return 'N/A';\n }\n switch (type.typeID) {\n case TypeID.anyTypification:\n return ANY_TYPE_NAME;\n case TypeID.integer:\n return INTEGER_TYPE_NAME;\n case TypeID.basic:\n return type.baseID;\n case TypeID.tuple:\n return type.factors\n .map(factor => (factor.typeID === TypeID.tuple ? `(${labelType(factor)})` : labelType(factor)))\n .join('×');\n case TypeID.collection:\n return type.base.typeID === TypeID.collection ? `ℬ${labelType(type.base)}` : `ℬ(${labelType(type.base)})`;\n case TypeID.logic:\n return LOGIC_TYPE_NAME;\n case TypeID.predicate:\n case TypeID.function:\n const argsText = type.args.map(arg => labelType(arg.type)).join(', ');\n return `[${argsText}] → ${labelType(type.result)}`;\n }\n}\n\n/** Converts expression type to normalized string. */\nexport function normalizeType(type: ExpressionType | null): string {\n if (!type) {\n return 'N/A';\n }\n switch (type.typeID) {\n case TypeID.anyTypification:\n return ANY_TYPE_NAME;\n case TypeID.integer:\n case TypeID.basic:\n return 'X1';\n case TypeID.tuple:\n return type.factors\n .map(factor => (factor.typeID === TypeID.tuple ? `(${normalizeType(factor)})` : normalizeType(factor)))\n .join('×');\n case TypeID.collection:\n return type.base.typeID === TypeID.collection ? `ℬ${normalizeType(type.base)}` : `ℬ(${normalizeType(type.base)})`;\n case TypeID.logic:\n return LOGIC_TYPE_NAME;\n case TypeID.predicate:\n case TypeID.function:\n const argsText = type.args.map(arg => normalizeType(arg.type)).join(', ');\n return `[${argsText}] → ${normalizeType(type.result)}`;\n }\n}\n","/**\n * Module: Typification API for RSLang.\n */\n\nimport {\n bool,\n component,\n type EchelonBase,\n type EchelonCollection,\n type EchelonTuple,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n tuple,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification\n} from './typification';\n\n/** Record map from typeID to typeClass. */\nconst TypeIDToClass: Record<TypeID, TypeClass> = {\n [TypeID.anyTypification]: TypeClass.typification,\n [TypeID.integer]: TypeClass.typification,\n [TypeID.basic]: TypeClass.typification,\n [TypeID.tuple]: TypeClass.typification,\n [TypeID.collection]: TypeClass.typification,\n [TypeID.logic]: TypeClass.logic,\n [TypeID.function]: TypeClass.function,\n [TypeID.predicate]: TypeClass.predicate\n};\n\n/** Returns the TypeClass associated with the given TypeID. */\nexport function getTypeClass(typeID: TypeID): TypeClass {\n return TypeIDToClass[typeID];\n}\n\n/** Returns true if the given typification is generic. */\nexport function hasGenerics(type: Typification): boolean {\n switch (type.typeID) {\n case TypeID.anyTypification:\n return true;\n case TypeID.integer:\n return false;\n case TypeID.basic:\n return isRadical(type.baseID);\n case TypeID.collection:\n return hasGenerics(type.base);\n case TypeID.tuple:\n for (const factor of type.factors) {\n if (hasGenerics(factor)) {\n return true;\n }\n }\n return false;\n }\n}\n\n/** Checks if two typifications are equal. */\nexport function checkEquality(type1: Typification, type2: Typification): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.anyTypification:\n return true;\n case TypeID.basic:\n return type1.baseID === (type2 as EchelonBase).baseID;\n case TypeID.collection:\n return checkEquality(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple: {\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkEquality(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Merge two types to get result of binary operation. */\nexport function mergeTypifications(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2) ? type2 : null;\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1) ? type1 : null;\n }\n\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.basic:\n return commonType(type1, type2);\n case TypeID.collection:\n if (type2.typeID !== TypeID.collection) {\n return null;\n }\n const base = mergeTypifications(type1.base, type2.base);\n return base ? bool(base) : null;\n case TypeID.tuple:\n if (type2.typeID !== TypeID.tuple) {\n return null;\n }\n if (type1.factors.length !== type2.factors.length) {\n return null;\n }\n const components: Typification[] = [];\n for (let index = 0; index < type1.factors.length; ++index) {\n const component = mergeTypifications(type1.factors[index], type2.factors[index]);\n if (component === null) {\n return null;\n }\n components.push(component);\n }\n return tuple(components);\n }\n}\n\n/** Check compatibility of typifications. */\nexport function checkCompatibility(type1: ExpressionType, type2: ExpressionType): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2);\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1);\n }\n if (isTypification(type1) !== isTypification(type2)) {\n return false;\n }\n if (\n type1.typeID === TypeID.integer ||\n type1.typeID === TypeID.basic ||\n type2.typeID === TypeID.integer ||\n type2.typeID === TypeID.basic\n ) {\n return commonType(type1 as Typification, type2 as Typification) !== null;\n }\n\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.collection:\n return checkCompatibility(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple:\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkCompatibility(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n case TypeID.logic:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Compare typification with substitutions. */\nexport function compareTemplated(\n substitutes: Map<string, Typification>,\n arg: Typification,\n value: Typification\n): boolean {\n if (arg === value) {\n return true;\n }\n if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {\n if (!substitutes.has(arg.baseID)) {\n substitutes.set(arg.baseID, value);\n return true;\n } else {\n const mergeType = mergeTypifications(substitutes.get(arg.baseID)!, value);\n if (mergeType === null) {\n return false;\n }\n substitutes.set(arg.baseID, mergeType);\n return true;\n }\n }\n if (value.typeID === TypeID.anyTypification) {\n return true;\n }\n if (\n arg.typeID === TypeID.integer ||\n arg.typeID === TypeID.basic ||\n value.typeID === TypeID.integer ||\n value.typeID === TypeID.basic\n ) {\n return commonType(arg, value) !== null;\n }\n if (arg.typeID !== value.typeID) {\n return false;\n }\n switch (arg.typeID) {\n case TypeID.collection:\n return compareTemplated(substitutes, arg.base, (value as EchelonCollection).base);\n case TypeID.tuple: {\n if (arg.factors.length !== (value as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < arg.factors.length; ++index) {\n if (!compareTemplated(substitutes, arg.factors[index], (value as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Apply substitutions to typification. */\nexport function substituteBase(target: Typification, substitutes: Map<string, Typification>): void {\n switch (target.typeID) {\n case TypeID.basic: {\n if (substitutes.has(target.baseID)) {\n Object.assign(target, substitutes.get(target.baseID)!);\n }\n return;\n }\n case TypeID.collection: {\n substituteBase(target.base, substitutes);\n return;\n }\n case TypeID.tuple: {\n for (const factor of target.factors) {\n substituteBase(factor, substitutes);\n }\n return;\n }\n }\n}\n\n/** Extract bases from typification. */\nexport function extractBases(target: ExpressionType): Set<string> {\n return new Set(extractBasesImpl(target));\n}\n\n/** Apply type path to typification. */\nexport function applyPath(target: Typification, path: TypePath, index = 0): Typification | null {\n let current: Typification | null = target;\n let i = index;\n while (i < path.length && current) {\n switch (current.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return null;\n case TypeID.collection:\n current = current.base;\n i++;\n break;\n case TypeID.tuple:\n current = component(current, path[i]);\n if (current === null) {\n return null;\n }\n i++;\n break;\n }\n }\n return current;\n}\n\n// ===== Internals =====\nfunction commonType(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n const int1 = 'isIntegerCompatible' in type1 && type1.isIntegerCompatible;\n const int2 = 'isIntegerCompatible' in type2 && type2.isIntegerCompatible;\n if (!int1 || !int2) {\n if (type1.typeID === TypeID.basic && type2.typeID === TypeID.basic) {\n return type1.baseID === type2.baseID ? type1 : null;\n }\n return null;\n }\n if (type1.typeID === TypeID.integer) {\n return type2;\n } else if (type2.typeID === TypeID.integer) {\n return type1;\n } else {\n return IntegerT;\n }\n}\n\nfunction extractBasesImpl(target: ExpressionType): string[] {\n switch (target.typeID) {\n case TypeID.basic:\n return [target.baseID];\n case TypeID.collection:\n return extractBasesImpl(target.base);\n case TypeID.tuple:\n return target.factors.reduce((result, factor) => result.concat(extractBasesImpl(factor)), [] as string[]);\n case TypeID.function:\n const result = extractBasesImpl(target.result);\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), result);\n case TypeID.predicate:\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), [] as string[]);\n default:\n return [];\n }\n}\n","/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError, annotateType } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { labelRSLangNode, labelToken, labelType } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport {\n type Argument,\n bool,\n component,\n debool,\n type EchelonTuple,\n EmptySetT,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n LogicT,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n compareTemplated,\n hasGenerics,\n mergeTypifications,\n substituteBase\n} from './typification-api';\n\n/** Type auditor for AST type checking. */\nexport class TypeAuditor {\n private static readonly TYPE_DEDUCTION_DEPTH = 5;\n\n private context: TypeContext;\n private reporter?: ErrorReporter;\n private locals: LocalContext;\n private annotateTypes: boolean;\n private annotateErrors: boolean;\n\n constructor(context: TypeContext) {\n this.annotateTypes = false;\n this.annotateErrors = false;\n this.context = context;\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n public run(\n ast: AstNode,\n annotateTypes: boolean,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false\n ): ExpressionType | null {\n if (ast.hasError) {\n return null;\n }\n this.annotateTypes = annotateTypes;\n this.annotateErrors = annotateErrors;\n this.reporter = reporter;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n private dispatchDeclare(node: AstNode, domain: Typification): boolean {\n const result = this.processDeclare(node, domain);\n if (result === true && this.annotateTypes) {\n annotateType(node, domain);\n }\n return result;\n }\n\n private processDeclare(node: AstNode, domain: Typification): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, domain);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, domain);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node, domain);\n }\n return false;\n }\n\n private declareLocal(node: AstNode, domain: Typification): boolean {\n return this.locals.pushLocal(node, domain);\n }\n\n private declareTuple(node: AstNode, domain: Typification): boolean {\n if (domain.typeID !== TypeID.tuple || domain.factors.length !== node.children.length) {\n this.onError(RSErrorCode.invalidCortegeDeclare, node.children[0]);\n return false;\n }\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child, component(domain, child + 1)!)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode, domain: Typification): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child, domain)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): ExpressionType | null {\n const result = this.processVisit(node);\n if (result !== null && this.annotateTypes) {\n annotateType(node, result);\n }\n return result;\n }\n\n private processVisit(node: AstNode): ExpressionType | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n case TokenID.ID_RADICAL:\n return this.visitRadical(node);\n\n case TokenID.LIT_INTEGER:\n return IntegerT;\n case TokenID.LIT_WHOLE_NUMBERS:\n return bool(IntegerT);\n case TokenID.LIT_EMPTYSET:\n return this.visitEmptySet(node);\n\n case TokenID.NT_ARGUMENTS:\n return this.visitArgumentsEnum(node);\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n case TokenID.REDUCE:\n return this.visitReduce(node);\n case TokenID.BOOL:\n return this.visitBool(node);\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.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 return this.visitIterate(node);\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\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 null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ExpressionType | null {\n if (index >= node.children.length) {\n return null;\n }\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number, domain: Typification): boolean {\n if (index >= node.children.length) {\n return false;\n }\n if (!this.dispatchDeclare(node.children[index], domain)) {\n return false;\n }\n return true;\n }\n\n private visitAllAndReturn(node: AstNode, type: ExpressionType | null): ExpressionType | null {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return null;\n }\n }\n return type;\n }\n\n private childTypification(node: AstNode, index: number): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.expectedSetexpr, node.children[index], [labelType(result)]);\n return null;\n }\n return result as Typification;\n }\n\n private childLogic(node: AstNode, index: number): boolean {\n const result = this.visitChild(node, index);\n if (result === null) {\n return false;\n }\n if (result.typeID !== TypeID.logic) {\n this.onError(RSErrorCode.expectedLogic, node.children[index], [labelType(result)]);\n return false;\n }\n return true;\n }\n\n private childTypeDebool(node: AstNode, index: number, errorCode: RSErrorCode): Typification | null {\n const result = this.childTypification(node, index);\n if (result === null) {\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(errorCode, node.children[index], [labelType(result)]);\n return null;\n }\n return debool(result);\n }\n\n private visitLocal(node: AstNode): ExpressionType | null {\n return this.locals.getLocalType(node);\n }\n\n private visitGlobal(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n const type = this.context.get(alias);\n if (!type) {\n return this.onError(RSErrorCode.globalNotTyped, node, [alias]);\n }\n return type;\n }\n\n private visitFunctionDefinition(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return null;\n }\n\n const args: Argument[] = [];\n for (const local of this.locals.data) {\n if (local.level === 1) {\n args.push({ alias: local.alias, type: local.type });\n }\n }\n\n const result = this.visitChild(node, 1);\n if (result === null || result.typeID === TypeID.function || result.typeID === TypeID.predicate) {\n return null;\n }\n this.locals.endScope(node.children[1]);\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: result,\n args: args\n };\n } else {\n return {\n typeID: TypeID.function,\n result: result,\n args: args\n };\n }\n }\n\n private visitFunctionCall(node: AstNode): ExpressionType | null {\n const funcName = getNodeText(node.children[0]);\n const funcType = this.context.get(funcName);\n if (funcType?.typeID !== TypeID.function && funcType?.typeID !== TypeID.predicate) {\n return this.onError(RSErrorCode.globalNotTyped, node.children[0], [funcName]);\n }\n if (this.annotateTypes) {\n annotateType(node.children[0], funcType);\n }\n\n const substitutes = this.checkFuncArguments(node, funcName, funcType);\n if (substitutes === null) {\n return null;\n }\n if (funcType.result.typeID === TypeID.logic) {\n return funcType.result;\n } else {\n const result = mangleRadicals(funcName, funcType.result);\n if (substitutes.size > 0) {\n substituteBase(result, substitutes);\n }\n return result;\n }\n }\n\n private visitRadical(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n if (!this.isInsideFuncArgument(node)) {\n return this.onError(RSErrorCode.radicalUsage, node, [alias]);\n }\n return bool({ typeID: TypeID.basic, baseID: alias });\n }\n\n private visitEmptySet(node: AstNode): ExpressionType | null {\n const invalidParents: TokenID[] = [\n TokenID.CARD,\n TokenID.DEBOOL,\n TokenID.SET_UNION,\n TokenID.SET_INTERSECTION,\n TokenID.SET_MINUS,\n TokenID.SET_SYMMETRIC_MINUS,\n TokenID.REDUCE,\n TokenID.BIGPR,\n TokenID.SMALLPR\n ];\n if (invalidParents.includes(node.parent?.typeID as TokenID)) {\n return this.onError(RSErrorCode.invalidEmptySetUsage, node);\n }\n return EmptySetT;\n }\n\n private visitArgument(node: AstNode): ExpressionType | null {\n const variable = node.children[0];\n if (variable.typeID === TokenID.NT_TUPLE_DECL) {\n return this.onError(RSErrorCode.invalidArgumentCortegeDeclare, variable);\n }\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return domain;\n }\n\n private visitCard(node: AstNode): ExpressionType | null {\n if (!this.childTypeDebool(node, 0, RSErrorCode.invalidCard)) {\n return null;\n }\n return IntegerT;\n }\n\n private visitArithmetic(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isArithmetic' in type1 && type1.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[0], [labelType(type1)]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isArithmetic' in type2 && type2.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[1], [labelType(type2)]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isOrdered' in type1 && type1.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[0], [labelType(type1)]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isOrdered' in type2 && type2.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[1], [labelType(type2)]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return LogicT;\n }\n\n private visitNegation(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0)) {\n return null;\n }\n return LogicT;\n }\n\n private visitLogicBinary(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0) || !this.childLogic(node, 1)) {\n return null;\n }\n return LogicT;\n }\n\n private visitEquals(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (type2 === null) {\n return null;\n }\n const isSubset = this.isSubset(node.typeID as TokenID);\n if (isSubset) {\n type2 = bool(type2);\n }\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n if (!checkCompatibility(type1, type2)) {\n if (isSubset) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(type1), labelType(type2)]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n labelToken(node.typeID as TokenID),\n labelType(bool(type2))\n ]);\n }\n }\n return LogicT;\n }\n\n private visitDecart(node: AstNode): ExpressionType | null {\n const factors: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypeDebool(node, child, RSErrorCode.invalidDecart);\n if (type === null) {\n return null;\n } else {\n factors.push(type);\n }\n }\n return bool(tuple(factors));\n }\n\n private visitBoolean(node: AstNode): ExpressionType | null {\n const type = this.childTypeDebool(node, 0, RSErrorCode.invalidBoolean);\n if (type === null) {\n return null;\n }\n return bool(bool(type));\n }\n\n private visitTuple(node: AstNode): ExpressionType | null {\n const components: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypification(node, child);\n if (type === null) {\n return null;\n }\n components.push(type);\n }\n return tuple(components);\n }\n\n private visitEnumeration(node: AstNode): ExpressionType | null {\n let type: ExpressionType | null = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n\n const merge = mergeTypifications(type, childType);\n if (merge === null) {\n return this.onError(RSErrorCode.invalidEnumeration, node.children[child], [\n labelType(type),\n labelType(childType)\n ]);\n }\n type = merge;\n }\n return bool(type);\n }\n\n private visitBool(node: AstNode): ExpressionType | null {\n return this.visitEnumeration(node);\n }\n\n private visitDebool(node: AstNode): ExpressionType | null {\n return this.childTypeDebool(node, 0, RSErrorCode.invalidDebool);\n }\n\n private visitSetexprBinary(node: AstNode): ExpressionType | null {\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (type2 === null) {\n return null;\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(bool(type1)), labelType(bool(type2))]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const argument = this.childTypeDebool(node, 0, RSErrorCode.invalidProjectionSet);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return bool(components[0]);\n } else {\n return bool(tuple(components));\n }\n }\n\n private visitProjectTuple(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return argument;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return components[0];\n } else {\n return tuple(components);\n }\n }\n\n private visitFilter(node: AstNode): ExpressionType | null {\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n return this.onError(RSErrorCode.invalidFilterArity, node);\n }\n\n const argument = this.childTypification(node, node.children.length - 1);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n\n const argBase = debool(argument) as EchelonTuple;\n const bases: Typification[] = [];\n for (const index of indices) {\n const newBase = component(argBase, index);\n if (newBase === null) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n bases.push(newBase);\n }\n\n if (tupleParam) {\n for (let child = 0; child + 1 < node.children.length; child++) {\n const param = this.childTypification(node, child);\n if (param === null) {\n return null;\n }\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[child], [\n labelType(param),\n labelType(bool(bases[child]))\n ]);\n }\n }\n } else {\n const param = this.childTypification(node, 0);\n if (param === null) {\n return null;\n }\n const paramType = param;\n const expected = bool(tuple(bases));\n if (paramType.typeID !== TypeID.collection || !checkCompatibility(expected, paramType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[0], [labelType(paramType), labelType(expected)]);\n }\n }\n return argument;\n }\n\n private visitReduce(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.invalidReduce, node.children[0], [labelType(argument)]);\n }\n return debool(argument);\n }\n\n private visitArgumentsEnum(node: AstNode): ExpressionType | null {\n return this.visitAllAndReturn(node, LogicT);\n }\n\n private visitDeclarative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return bool(domain);\n }\n\n private visitImperative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.childLogic(node, child)) {\n return null;\n }\n }\n\n const type = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n\n this.locals.endScope(node);\n return bool(type);\n }\n\n private visitIterate(node: AstNode): ExpressionType | null {\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitAssign(node: AstNode): ExpressionType | null {\n const domain = this.childTypification(node, 1);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitRecursion(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const initType = this.childTypification(node, 1);\n if (initType === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, initType)) {\n return null;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n let iterationValue = this.childTypification(node, iterationIndex);\n if (iterationValue === null) {\n return null;\n }\n if (!checkCompatibility(iterationValue, initType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[iterationIndex], [\n labelType(iterationValue),\n labelType(initType)\n ]);\n }\n\n if (hasGenerics(initType)) {\n for (let retries = TypeAuditor.TYPE_DEDUCTION_DEPTH; retries > 0; retries--) {\n this.locals.endScope(node);\n this.locals.clearUnused();\n this.locals.startScope();\n if (!this.visitChildDeclaration(node, 0, iterationValue)) {\n return null;\n }\n const newIteration = this.childTypification(node, iterationIndex);\n if (newIteration === null) {\n return null;\n }\n if (checkEquality(newIteration, iterationValue)) {\n break;\n }\n iterationValue = newIteration;\n }\n }\n\n if (isFull) {\n if (!this.childLogic(node, 2)) {\n return null;\n }\n }\n\n this.locals.endScope(node);\n return iterationValue;\n }\n\n private isSubset(token: TokenID): boolean {\n return token === TokenID.SUBSET || token === TokenID.SUBSET_OR_EQ || token === TokenID.NOT_SUBSET;\n }\n\n private isInsideFuncArgument(node: AstNode): boolean {\n while (node.parent && node.parent !== node) {\n if (node.typeID === TokenID.NT_ARGUMENTS) return true;\n node = node.parent;\n }\n return false;\n }\n\n private checkFuncArguments(node: AstNode, alias: string, type: Parametrized): Map<string, Typification> | null {\n if (node.children.length - 1 !== type.args.length) {\n return this.onError(RSErrorCode.invalidArgsArity, node.children[1], [\n String(type.args.length),\n String(node.children.length - 1)\n ]);\n }\n\n const substitutes = new Map<string, Typification>();\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n const argType = mangleRadicals(alias, type.args[child - 1].type);\n if (!compareTemplated(substitutes, argType, childType)) {\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(argType)}`,\n labelType(childType)\n ]);\n return null;\n }\n }\n return substitutes;\n }\n}\n\n// ========= Internals ========\nfunction mangleRadicals(funcName: string, type: Typification): Typification {\n switch (type.typeID) {\n default:\n throw new Error(`Unexpected type: ${type.typeID}`);\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: type.baseID + funcName\n };\n }\n return type;\n }\n case TypeID.collection: {\n return {\n typeID: type.typeID,\n base: mangleRadicals(funcName, debool(type))\n };\n }\n case TypeID.tuple: {\n const factors: Typification[] = [];\n for (let index = 1; index <= type.factors.length; ++index) {\n factors.push(mangleRadicals(funcName, component(type, index)!));\n }\n return {\n typeID: type.typeID,\n factors: factors\n };\n }\n }\n}\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n useCount: number;\n type: Typification;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private onError: (code: RSErrorCode, node: AstNode, params: string[]) => null;\n\n public data: LocalData[] = [];\n\n constructor(onError: (code: RSErrorCode, node: AstNode, params: string[]) => null) {\n this.onError = onError;\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(node: AstNode, skipUnused: boolean = false): void {\n for (const local of this.data) {\n local.level--;\n if (!skipUnused && local.level === 0 && local.useCount === 0) {\n this.onError(RSErrorCode.localNotUsed, node, [local.alias]);\n }\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode, type: Typification): boolean {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n this.onError(RSErrorCode.localShadowing, node, [alias]);\n return false;\n } else {\n this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);\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, type, level: 1, useCount: 0 });\n return true;\n }\n\n getLocalType(node: AstNode): Typification | null {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n if (local === undefined) {\n this.onError(RSErrorCode.localUndeclared, node, [alias]);\n return null;\n } else if (local.level < 1) {\n this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n return null;\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n","/* Module: Calculation for RSLang. */\n\n/** Represents computability class. */\nexport const ValueClass = {\n VALUE: 'value',\n PROPERTY: 'property'\n} as const;\nexport type ValueClass = (typeof ValueClass)[keyof typeof ValueClass];\n\n/** ValueClass context. */\nexport type ValueClassContext = Map<string, ValueClass>;\n","/**\n * Module: Value auditor for AST value class checking.\n *\n * Determines whether an expression yields a concrete value (computable)\n * or a property (e.g., depends on a quantified variable).\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { TokenID } from '../parser/token';\n\nimport { ValueClass, type ValueClassContext } from './value-class';\n\n/** Value auditor for AST value class checking. */\nexport class ValueAuditor {\n private context: ValueClassContext;\n private annotateErrors: boolean;\n private reporter?: ErrorReporter;\n\n constructor(context: ValueClassContext) {\n this.context = context;\n this.annotateErrors = false;\n }\n\n /**\n * Runs value audit on the AST. Returns the value class on success, null on failure.\n */\n run(ast: AstNode, reporter?: ErrorReporter, annotateErrors: boolean = false): ValueClass | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n return this.dispatchVisit(ast);\n }\n\n private dispatchVisit(node: AstNode): ValueClass | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n return ValueClass.VALUE;\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return ValueClass.PROPERTY;\n\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ARG_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.assertAllValues(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n return this.assertAllValues(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n return this.assertChildIsValue(node, 0);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\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.assertAllValues(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterateOrAssign(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ValueClass | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode, value: ValueClass): ValueClass | null {\n for (const child of node.children) {\n if (this.dispatchVisit(child) === null) {\n return null;\n }\n }\n return value;\n }\n\n private assertChildIsValue(node: AstNode, index: number): ValueClass | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (result !== ValueClass.VALUE) {\n const child = node.children[index];\n return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);\n }\n return ValueClass.VALUE;\n }\n\n private assertAllValues(node: AstNode): ValueClass | null {\n for (let i = 0; i < node.children.length; i++) {\n if (this.assertChildIsValue(node, i) === null) {\n return null;\n }\n }\n return ValueClass.VALUE;\n }\n\n private visitFunctionDefinition(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitFunctionCall(node: AstNode): ValueClass | null {\n const result = this.visitChild(node, 0);\n if (result === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n if (this.assertChildIsValue(node, child) === null) {\n return null;\n }\n }\n return result;\n }\n\n private visitGlobal(node: AstNode): ValueClass | null {\n const alias = getNodeText(node);\n const result = this.context.get(alias);\n if (!result) {\n return this.onError(RSErrorCode.globalNoValue, node, [alias]);\n }\n return result;\n }\n\n private visitQuantifier(node: AstNode): ValueClass | null {\n if (this.assertChildIsValue(node, 1) === null) {\n return null;\n }\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return ValueClass.VALUE;\n }\n\n private visitSetexprPredicate(node: AstNode): ValueClass | null {\n const tokenId = node.typeID as TokenID;\n switch (tokenId) {\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET_OR_EQ:\n if (this.assertChildIsValue(node, 0) === null) {\n return null;\n }\n if (this.visitChild(node, 1) === null) {\n return null;\n }\n return ValueClass.VALUE;\n\n case TokenID.SUBSET:\n case TokenID.NOT_SUBSET:\n return this.assertAllValues(node);\n }\n return null;\n }\n\n private visitDeclarative(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitImperative(node: AstNode): ValueClass | null {\n for (let child = 1; child < node.children.length; child++) {\n if (this.visitChild(node, child) === null) {\n return null;\n }\n }\n return this.assertChildIsValue(node, 0);\n }\n\n private visitIterateOrAssign(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.assertChildIsValue(node, 1);\n }\n\n private visitDecart(node: AstNode): ValueClass | null {\n let result: ValueClass = ValueClass.VALUE;\n for (let child = 0; child < node.children.length; child++) {\n const childClass = this.visitChild(node, child);\n if (childClass === null) {\n return null;\n }\n if (childClass === ValueClass.PROPERTY) {\n result = ValueClass.PROPERTY;\n }\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return ValueClass.PROPERTY;\n }\n\n private visitFilter(node: AstNode): ValueClass | null {\n let last: ValueClass | null = null;\n for (const child of node.children) {\n last = this.dispatchVisit(child);\n if (last === null) {\n return null;\n }\n }\n return last;\n }\n\n private visitSetexprBinary(node: AstNode): ValueClass | null {\n const first = this.visitChild(node, 0);\n if (first === null) {\n return null;\n }\n const second = this.visitChild(node, 1);\n if (second === null) {\n return null;\n }\n const isValue = combineOperationValues(\n node.typeID as TokenID,\n first === ValueClass.VALUE,\n second === ValueClass.VALUE\n );\n return isValue ? ValueClass.VALUE : ValueClass.PROPERTY;\n }\n}\n\n// ====== Internals ======\n\n/** Combines value flags for set operations. */\nfunction combineOperationValues(op: TokenID, v1: boolean, v2: boolean): boolean {\n switch (op) {\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.SET_UNION:\n return v1 && v2;\n case TokenID.SET_INTERSECTION:\n return v1 || v2;\n case TokenID.SET_MINUS:\n return v1;\n default:\n return v1 && v2;\n }\n}\n","import { type AstNode, buildTree } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { RSErrorCode, type RSErrorDescription } from '../error';\nimport { normalizeAST } from '../parser/normalize';\nimport { parser as rslangParser } from '../parser/parser';\nimport { extractSyntaxErrors } from '../parser/syntax-errors';\nimport { TokenID } from '../parser/token';\n\nimport { TypeAuditor } from './type-auditor';\nimport {\n basic,\n bool,\n constant,\n debool,\n type ExpressionType,\n type TypeClass,\n type TypeContext,\n TypeID\n} from './typification';\nimport { getTypeClass } from './typification-api';\nimport { ValueAuditor } from './value-auditor';\nimport { ValueClass, type ValueClassContext } from './value-class';\n\nexport interface AnalysisBase {\n success: boolean;\n type: ExpressionType | null;\n valueClass: ValueClass | null;\n}\n\nexport interface AnalysisFast extends AnalysisBase {\n ast: AstNode | null;\n}\n\nexport interface AnalysisFull extends AnalysisBase {\n ast: AstNode | null;\n errors: RSErrorDescription[];\n}\n\nexport interface AnalysisOptions {\n expected?: TypeClass;\n isDomain?: boolean;\n annotateTypes?: boolean;\n annotateErrors?: boolean;\n}\n\nexport class RSLangAnalyzer {\n private typeContext: TypeContext = new Map<string, ExpressionType>();\n private valueContext: ValueClassContext = new Map<string, ValueClass>();\n private typeAuditor: TypeAuditor = new TypeAuditor(this.typeContext);\n private valueAuditor: ValueAuditor = new ValueAuditor(this.valueContext);\n\n public addBase(alias: string, isNumeric: boolean = false, valueClass: ValueClass = ValueClass.VALUE): void {\n if (isNumeric) {\n this.typeContext.set(alias, bool(constant(alias)));\n this.valueContext.set(alias, valueClass);\n } else {\n this.typeContext.set(alias, bool(basic(alias)));\n this.valueContext.set(alias, valueClass);\n }\n }\n\n public setGlobal(alias: string, type: ExpressionType | null, value: ValueClass | null): void {\n if (type) {\n this.typeContext.set(alias, type);\n }\n if (value) {\n this.valueContext.set(alias, value);\n }\n }\n\n public getType(alias: string): ExpressionType | null {\n return this.typeContext.get(alias) ?? null;\n }\n\n public checkFast(expression: string, options?: AnalysisOptions): AnalysisFast {\n if (expression.length === 0) {\n return { success: false, type: null, valueClass: null, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, ast: ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n return {\n success: true,\n type: type,\n valueClass: options?.isDomain ? ValueClass.VALUE : this.valueAuditor.run(ast),\n ast: ast\n };\n }\n\n public checkFull(expression: string, options?: AnalysisOptions): AnalysisFull {\n const errors: RSErrorDescription[] = [];\n const reporter = (error: RSErrorDescription) => {\n errors.push(error);\n };\n if (expression.length === 0) {\n reporter({ code: RSErrorCode.cstEmptyDerived, from: 0, to: 0 });\n return { success: false, type: null, valueClass: null, errors: errors, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n extractSyntaxErrors(ast, expression, reporter, options?.annotateErrors ?? false);\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false, reporter, options?.annotateErrors ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n reporter({ code: RSErrorCode.globalStructure, from: ast.from, to: ast.to });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.globalStructure);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, errors, ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n reporter({\n code: RSErrorCode.expectedType,\n from: ast.from,\n to: ast.to\n });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.expectedType);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n const valueClass = options?.isDomain\n ? ValueClass.VALUE\n : this.valueAuditor.run(ast, reporter, options?.annotateErrors ?? false);\n return { success: true, type, valueClass, errors, ast };\n }\n\n private parse(expression: string): AstNode {\n const tree = rslangParser.parse(expression);\n const ast = buildTree(tree.cursor());\n normalizeAST(ast, expression);\n return ast;\n }\n}\n\n// ======= Internals ========\nfunction isStructureDomain(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_GLOBAL:\n case TokenID.BOOLEAN:\n case TokenID.DECART:\n case TokenID.NT_ENUMERATION:\n break;\n default:\n return false;\n }\n for (const child of node.children) {\n if (!isStructureDomain(child)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["component"]}
1
+ {"version":3,"file":"analyzer.js","names":["rslangParser"],"sources":["../../../src/rslang/semantic/analyzer.ts"],"sourcesContent":["import { type AstNode, buildTree } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { RSErrorCode, type RSErrorDescription } from '../error';\nimport { normalizeAST } from '../parser/normalize';\nimport { parser as rslangParser } from '../parser/parser';\nimport { extractSyntaxErrors } from '../parser/syntax-errors';\nimport { TokenID } from '../parser/token';\n\nimport { TypeAuditor } from './type-auditor';\nimport {\n basic,\n bool,\n constant,\n debool,\n type ExpressionType,\n type TypeClass,\n type TypeContext,\n TypeID\n} from './typification';\nimport { getTypeClass } from './typification-api';\nimport { ValueAuditor } from './value-auditor';\nimport { ValueClass, type ValueClassContext } from './value-class';\n\nexport interface AnalysisBase {\n success: boolean;\n type: ExpressionType | null;\n valueClass: ValueClass | null;\n}\n\nexport interface AnalysisFast extends AnalysisBase {\n ast: AstNode | null;\n}\n\nexport interface AnalysisFull extends AnalysisBase {\n ast: AstNode | null;\n errors: RSErrorDescription[];\n}\n\nexport interface AnalysisOptions {\n expected?: TypeClass;\n isDomain?: boolean;\n annotateTypes?: boolean;\n annotateErrors?: boolean;\n}\n\nexport class RSLangAnalyzer {\n private typeContext: TypeContext = new Map<string, ExpressionType>();\n private valueContext: ValueClassContext = new Map<string, ValueClass>();\n private typeAuditor: TypeAuditor = new TypeAuditor(this.typeContext);\n private valueAuditor: ValueAuditor = new ValueAuditor(this.valueContext);\n\n public addBase(alias: string, isNumeric: boolean = false, valueClass: ValueClass = ValueClass.VALUE): void {\n if (isNumeric) {\n this.typeContext.set(alias, bool(constant(alias)));\n this.valueContext.set(alias, valueClass);\n } else {\n this.typeContext.set(alias, bool(basic(alias)));\n this.valueContext.set(alias, valueClass);\n }\n }\n\n public setGlobal(alias: string, type: ExpressionType | null, value: ValueClass | null): void {\n if (type) {\n this.typeContext.set(alias, type);\n }\n if (value) {\n this.valueContext.set(alias, value);\n }\n }\n\n public getType(alias: string): ExpressionType | null {\n return this.typeContext.get(alias) ?? null;\n }\n\n public checkFast(expression: string, options?: AnalysisOptions): AnalysisFast {\n if (expression.length === 0) {\n return { success: false, type: null, valueClass: null, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, ast: ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n return {\n success: true,\n type: type,\n valueClass: options?.isDomain ? ValueClass.VALUE : this.valueAuditor.run(ast),\n ast: ast\n };\n }\n\n public checkFull(expression: string, options?: AnalysisOptions): AnalysisFull {\n const errors: RSErrorDescription[] = [];\n const reporter = (error: RSErrorDescription) => {\n errors.push(error);\n };\n if (expression.length === 0) {\n reporter({ code: RSErrorCode.cstEmptyDerived, from: 0, to: 0 });\n return { success: false, type: null, valueClass: null, errors: errors, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n extractSyntaxErrors(ast, expression, reporter, options?.annotateErrors ?? false);\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false, reporter, options?.annotateErrors ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n reporter({ code: RSErrorCode.globalStructure, from: ast.from, to: ast.to });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.globalStructure);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, errors, ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n reporter({\n code: RSErrorCode.expectedType,\n from: ast.from,\n to: ast.to\n });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.expectedType);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n const valueClass = options?.isDomain\n ? ValueClass.VALUE\n : this.valueAuditor.run(ast, reporter, options?.annotateErrors ?? false);\n return { success: true, type, valueClass, errors, ast };\n }\n\n private parse(expression: string): AstNode {\n const tree = rslangParser.parse(expression);\n const ast = buildTree(tree.cursor());\n normalizeAST(ast, expression);\n return ast;\n }\n}\n\n// ======= Internals ========\nfunction isStructureDomain(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_GLOBAL:\n case TokenID.BOOLEAN:\n case TokenID.DECART:\n case TokenID.NT_ENUMERATION:\n break;\n default:\n return false;\n }\n for (const child of node.children) {\n if (!isStructureDomain(child)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;AA6CA,IAAa,iBAAb,MAA4B;CAC1B,8BAAmC,IAAI,IAA4B;CACnE,+BAA0C,IAAI,IAAwB;CACtE,cAAmC,IAAI,YAAY,KAAK,WAAW;CACnE,eAAqC,IAAI,aAAa,KAAK,YAAY;CAEvE,QAAe,OAAe,YAAqB,OAAO,aAAyB,WAAW,OAAa;EACzG,IAAI,WAAW;GACb,KAAK,YAAY,IAAI,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC;GACjD,KAAK,aAAa,IAAI,OAAO,UAAU;EACzC,OAAO;GACL,KAAK,YAAY,IAAI,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC;GAC9C,KAAK,aAAa,IAAI,OAAO,UAAU;EACzC;CACF;CAEA,UAAiB,OAAe,MAA6B,OAAgC;EAC3F,IAAI,MACF,KAAK,YAAY,IAAI,OAAO,IAAI;EAElC,IAAI,OACF,KAAK,aAAa,IAAI,OAAO,KAAK;CAEtC;CAEA,QAAe,OAAsC;EACnD,OAAO,KAAK,YAAY,IAAI,KAAK,KAAK;CACxC;CAEA,UAAiB,YAAoB,SAAyC;EAC5E,IAAI,WAAW,WAAW,GACxB,OAAO;GAAE,SAAS;GAAO,MAAM;GAAM,YAAY;GAAM,KAAK;EAAK;EAEnE,MAAM,MAAM,KAAK,MAAM,UAAU;EACjC,IAAI,IAAI,UACN,OAAO;GAAE,SAAS;GAAO,MAAM;GAAM,YAAY;GAAW;EAAI;EAElE,MAAM,OAAO,KAAK,YAAY,IAAI,KAAK,SAAS,iBAAiB,KAAK;EACtE,IAAI,SAAS,MACX,OAAO;GAAE,SAAS;GAAO,MAAM;GAAM,YAAY;GAAW;EAAI;EAGlE,IAAI,SAAS,UAAU;GACrB,IAAI,CAAC,kBAAkB,GAAG,KAAK,KAAK,WAAW,OAAO,YACpD,OAAO;IAAE,SAAS;IAAO,MAAM;IAAM,YAAY;IAAW;GAAI;GAElE,OAAO;IAAE,SAAS;IAAM,MAAM,OAAO,IAAI;IAAG,YAAY,WAAW;IAAY;GAAI;EACrF;EACA,IAAI,SAAS,YAAY,aAAa,KAAK,MAAM,MAAM,QAAQ,UAC7D,OAAO;GAAE,SAAS;GAAO,MAAM;GAAM,YAAY;GAAW;EAAI;EAGlE,OAAO;GACL,SAAS;GACH;GACN,YAAY,SAAS,WAAW,WAAW,QAAQ,KAAK,aAAa,IAAI,GAAG;GACvE;EACP;CACF;CAEA,UAAiB,YAAoB,SAAyC;EAC5E,MAAM,SAA+B,CAAC;EACtC,MAAM,YAAY,UAA8B;GAC9C,OAAO,KAAK,KAAK;EACnB;EACA,IAAI,WAAW,WAAW,GAAG;GAC3B,SAAS;IAAE,MAAM,YAAY;IAAiB,MAAM;IAAG,IAAI;GAAE,CAAC;GAC9D,OAAO;IAAE,SAAS;IAAO,MAAM;IAAM,YAAY;IAAc;IAAQ,KAAK;GAAK;EACnF;EACA,MAAM,MAAM,KAAK,MAAM,UAAU;EACjC,IAAI,IAAI,UAAU;GAChB,oBAAoB,KAAK,YAAY,UAAU,SAAS,kBAAkB,KAAK;GAC/E,OAAO;IAAE,SAAS;IAAO,MAAM;IAAM,YAAY;IAAM;IAAQ;GAAI;EACrE;EAEA,MAAM,OAAO,KAAK,YAAY,IAAI,KAAK,SAAS,iBAAiB,OAAO,UAAU,SAAS,kBAAkB,KAAK;EAClH,IAAI,SAAS,MACX,OAAO;GAAE,SAAS;GAAO,MAAM;GAAM,YAAY;GAAM;GAAQ;EAAI;EAGrE,IAAI,SAAS,UAAU;GACrB,IAAI,CAAC,kBAAkB,GAAG,KAAK,KAAK,WAAW,OAAO,YAAY;IAChE,SAAS;KAAE,MAAM,YAAY;KAAiB,MAAM,IAAI;KAAM,IAAI,IAAI;IAAG,CAAC;IAC1E,IAAI,SAAS,gBACX,cAAc,KAAK,YAAY,eAAe;IAEhD,OAAO;KAAE,SAAS;KAAO,MAAM;KAAM,YAAY;KAAM;KAAQ;IAAI;GACrE;GACA,OAAO;IAAE,SAAS;IAAM,MAAM,OAAO,IAAI;IAAG,YAAY,WAAW;IAAO;IAAQ;GAAI;EACxF;EACA,IAAI,SAAS,YAAY,aAAa,KAAK,MAAM,MAAM,QAAQ,UAAU;GACvE,SAAS;IACP,MAAM,YAAY;IAClB,MAAM,IAAI;IACV,IAAI,IAAI;GACV,CAAC;GACD,IAAI,SAAS,gBACX,cAAc,KAAK,YAAY,YAAY;GAE7C,OAAO;IAAE,SAAS;IAAO,MAAM;IAAM,YAAY;IAAM;IAAQ;GAAI;EACrE;EAIA,OAAO;GAAE,SAAS;GAAM;GAAM,YAHX,SAAS,WACxB,WAAW,QACX,KAAK,aAAa,IAAI,KAAK,UAAU,SAAS,kBAAkB,KAAK;GAC/B;GAAQ;EAAI;CACxD;CAEA,MAAc,YAA6B;EAEzC,MAAM,MAAM,UADCA,OAAa,MAAM,UACV,CAAA,CAAK,OAAO,CAAC;EACnC,aAAa,KAAK,UAAU;EAC5B,OAAO;CACT;AACF;AAGA,SAAS,kBAAkB,MAAwB;CACjD,QAAQ,KAAK,QAAb;EACE,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,KAAK,QAAQ,gBACX;EACF,SACE,OAAO;CACX;CACA,KAAK,MAAM,SAAS,KAAK,UACvB,IAAI,CAAC,kBAAkB,KAAK,GAC1B,OAAO;CAGX,OAAO;AACT"}
@@ -1,42 +1,2 @@
1
- import { AstNode } from '../../parsing/ast.js';
2
- import { ExpressionType } from './typification.js';
3
- import '@lezer/common';
4
- import '../../shared/branded.js';
5
-
6
- /**
7
- * Module: Type auditor for AST type checking.
8
- */
9
-
10
- /** Represents function argument definition. */
11
- interface ArgumentsType {
12
- alias: string;
13
- type: ExpressionType | null;
14
- }
15
- /** Type auditor for AST type checking.
16
- * Warning! Assumes that the AST is well-formed and annotated with types.
17
- */
18
- declare class ArgumentsExtractor {
19
- private locals;
20
- private result;
21
- run(ast: AstNode): ArgumentsType[];
22
- private dispatchDeclare;
23
- private processDeclare;
24
- private declareLocal;
25
- private declareTuple;
26
- private declareEnumeration;
27
- private dispatchVisit;
28
- private processVisit;
29
- private visitChild;
30
- private visitChildDeclaration;
31
- private visitAllAndReturn;
32
- private visitLocal;
33
- private visitFunctionDefinition;
34
- private visitFunctionCall;
35
- private visitArgument;
36
- private visitQuantifier;
37
- private visitImperative;
38
- private visitIterate;
39
- private visitRecursion;
40
- }
41
-
42
- export { ArgumentsExtractor, type ArgumentsType };
1
+ import { n as ArgumentsType, t as ArgumentsExtractor } from "../../arguments-extractor-1acwjQNc.js";
2
+ export { ArgumentsExtractor, ArgumentsType };