@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/parser/token.ts","../../../src/rslang/parser/expression-generator.ts"],"sourcesContent":["import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","import { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\n\nimport { TokenID } from './token';\n\ninterface ExpressionGeneratorOptions {\n normalize?: boolean;\n}\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nexport function generateExpressionFromAst(ast: AstNode, options: ExpressionGeneratorOptions = {}): string {\n return new ExpressionGenerator(options).run(ast);\n}\n\ninterface VisitContext {\n localDeclaration: boolean;\n}\n\ntype ScopeFrame = Map<string, string>;\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nclass ExpressionGenerator {\n private readonly options: ExpressionGeneratorOptions;\n private readonly freeLocals = new Map<string, string>();\n private readonly radicals = new Map<string, string>();\n private readonly scopes: ScopeFrame[] = [];\n private localCounter = 0;\n private radicalCounter = 0;\n\n constructor(options: ExpressionGeneratorOptions) {\n this.options = options;\n }\n\n /** Run generator. Requires that the AST has no syntax errors. */\n run(ast: AstNode): string {\n if (ast.hasError) {\n throw new Error('Cannot generate expression: AST has error');\n }\n return this.visit(ast, { localDeclaration: false });\n }\n\n private visit(node: AstNode, context: VisitContext): string {\n const shouldScope = this.shouldStartScope(node.typeID);\n if (shouldScope) {\n this.startScope();\n }\n\n const result = this.renderNode(node, context);\n\n if (shouldScope) {\n this.endScope();\n }\n return result;\n }\n\n private renderNode(node: AstNode, context: VisitContext): string {\n switch (node.typeID) {\n case TokenID.ID_LOCAL: {\n const alias = getNodeText(node);\n return this.options.normalize\n ? context.localDeclaration\n ? this.declareLocal(alias)\n : this.resolveLocal(alias)\n : alias;\n }\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return getNodeText(node);\n case TokenID.ID_RADICAL: {\n const alias = getNodeText(node);\n return this.options.normalize ? this.resolveRadical(alias) : alias;\n }\n case TokenID.LIT_INTEGER:\n return String(node.data.value);\n case TokenID.LIT_WHOLE_NUMBERS:\n return 'Z';\n case TokenID.LIT_EMPTYSET:\n return '∅';\n\n case TokenID.BIGPR:\n return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.SMALLPR:\n return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.FILTER: {\n const args = node.children\n .slice(0, -1)\n .map(child => this.visit(child, context))\n .join(', ');\n const body = this.visitChild(node, node.children.length - 1, context);\n return `Fi${this.formatIndices(node)}[${args}](${body})`;\n }\n case TokenID.CARD:\n return `card(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOL:\n return `bool(${this.visitChild(node, 0, context)})`;\n case TokenID.DEBOOL:\n return `debool(${this.visitChild(node, 0, context)})`;\n case TokenID.REDUCE:\n return `red(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOLEAN:\n return this.renderBoolean(node, context);\n\n case TokenID.NT_FUNC_CALL: {\n const callee = this.visitChild(node, 0, context);\n const args = node.children\n .slice(1)\n .map(child => this.visit(child, context))\n .join(', ');\n return `${callee}[${args}]`;\n }\n case TokenID.NT_TUPLE:\n return `(${node.children.map(child => this.visit(child, context)).join(', ')})`;\n case TokenID.NT_ENUMERATION:\n return `{${node.children.map(child => this.visit(child, context)).join(', ')}}`;\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ENUM_DECL:\n return node.children\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index, context)))\n .join(', ');\n case TokenID.NT_TUPLE_DECL:\n return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(', ')})`;\n case TokenID.NT_ARG_DECL:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)}`;\n case TokenID.QUANTOR_UNIVERSAL:\n return this.renderQuantifier('∀', node, context);\n case TokenID.QUANTOR_EXISTS:\n return this.renderQuantifier('∃', node, context);\n case TokenID.NT_DECLARATIVE_EXPR:\n return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_FUNC_DEFINITION:\n return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;\n case TokenID.ITERATE:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:∈${this.visitChild(node, 1, context)}`;\n case TokenID.ASSIGN:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;\n case TokenID.NT_IMPERATIVE_EXPR: {\n const statements = node.children\n .slice(1)\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));\n const target = this.visitChild(node, 0, context);\n return `I{${target} | ${statements.join('; ')}}`;\n }\n case TokenID.NT_RECURSIVE_SHORT:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_RECURSIVE_FULL:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)} | ${this.visitChild(node, 3, context)}}`;\n\n case TokenID.PLUS:\n return this.renderInfix('+', node, context);\n case TokenID.MINUS:\n return this.renderInfix('-', node, context);\n case TokenID.MULTIPLY:\n return this.renderInfix('*', node, context);\n case TokenID.GREATER:\n return this.renderInfix('>', node, context);\n case TokenID.LESSER:\n return this.renderInfix('<', node, context);\n case TokenID.GREATER_OR_EQ:\n return this.renderInfix('≥', node, context);\n case TokenID.LESSER_OR_EQ:\n return this.renderInfix('≤', node, context);\n case TokenID.EQUAL:\n return this.renderInfix('=', node, context);\n case TokenID.NOTEQUAL:\n return this.renderInfix('≠', node, context);\n case TokenID.LOGIC_AND:\n return this.renderInfix('&', node, context);\n case TokenID.LOGIC_OR:\n return this.renderInfix('∨', node, context);\n case TokenID.LOGIC_IMPLICATION:\n return this.renderInfix('⇒', node, context);\n case TokenID.LOGIC_EQUIVALENT:\n return this.renderInfix('⇔', node, context);\n case TokenID.SET_IN:\n return this.renderInfix('∈', node, context);\n case TokenID.SET_NOT_IN:\n return this.renderInfix('∉', node, context);\n case TokenID.SUBSET:\n return this.renderInfix('⊂', node, context);\n case TokenID.SUBSET_OR_EQ:\n return this.renderInfix('⊆', node, context);\n case TokenID.NOT_SUBSET:\n return this.renderInfix('⊄', node, context);\n case TokenID.DECART:\n return this.renderInfix('×', node, context);\n case TokenID.SET_UNION:\n return this.renderInfix('∪', node, context);\n case TokenID.SET_INTERSECTION:\n return this.renderInfix('∩', node, context);\n case TokenID.SET_MINUS:\n return this.renderInfix('\\\\', node, context);\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.renderInfix('∆', node, context);\n case TokenID.LOGIC_NOT:\n return `¬${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;\n default:\n return node.children.map(child => this.visit(child, context)).join('');\n }\n }\n\n private visitChild(node: AstNode, index: number, context: VisitContext): string {\n const child = node.children[index];\n if (!child) {\n return '';\n }\n return this.visit(child, this.childContext(node.typeID, index, context));\n }\n\n private renderQuantifier(symbol: string, node: AstNode, context: VisitContext): string {\n const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));\n const domain = this.visitChild(node, 1, context);\n const bodyNode = node.children[2];\n const bodyText = this.visitChild(node, 2, context);\n const body = bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText;\n return `${symbol}${declaration}∈${domain} ${body}`;\n }\n\n private shouldWrapQuantifierBody(node: AstNode): boolean {\n const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);\n const bodyPrecedence = this.getPrecedence(node.typeID);\n if (quantifierPrecedence === null || bodyPrecedence === null) {\n return false;\n }\n return bodyPrecedence < quantifierPrecedence;\n }\n\n private renderInfix(symbol: string, node: AstNode, context: VisitContext): string {\n if (this.isLogicBinary(node.typeID)) {\n const parts = node.children.map((child, index) => {\n const text = this.visit(child, context);\n return this.needParen(node, child, index) ? `(${text})` : text;\n });\n return parts.join(` ${symbol} `);\n }\n const parts = node.children.map(child => this.wrapIfNeeded(this.visit(child, context), child));\n return parts.join(symbol);\n }\n\n private needParen(parent: AstNode, child: AstNode, childIndex: number): boolean {\n if (this.isAtomic(child.typeID)) {\n return false;\n }\n const parentPrecedence = this.getPrecedence(parent.typeID);\n const childPrecedence = this.getPrecedence(child.typeID);\n if (parentPrecedence === null || childPrecedence === null) {\n return true;\n }\n if (childPrecedence > parentPrecedence) {\n return false;\n }\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) {\n return false;\n }\n if (this.isLeftAssociative(parent.typeID)) {\n return childIndex > 0;\n }\n return true;\n }\n\n private getPrecedence(typeID: number): number | null {\n switch (typeID) {\n case TokenID.LOGIC_EQUIVALENT:\n return 1;\n case TokenID.LOGIC_IMPLICATION:\n return 2;\n case TokenID.LOGIC_OR:\n return 3;\n case TokenID.LOGIC_AND:\n return 4;\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return 5;\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return 6;\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.SET_UNION:\n case TokenID.SET_SYMMETRIC_MINUS:\n return 7;\n case TokenID.MULTIPLY:\n case TokenID.DECART:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n return 8;\n default:\n return null;\n }\n }\n\n private isAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.PLUS ||\n typeID === TokenID.MULTIPLY ||\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_EQUIVALENT ||\n typeID === TokenID.SET_UNION ||\n typeID === TokenID.SET_INTERSECTION ||\n typeID === TokenID.DECART\n );\n }\n\n private isLeftAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.MINUS ||\n typeID === TokenID.SET_MINUS ||\n typeID === TokenID.SET_SYMMETRIC_MINUS\n );\n }\n\n private renderBoolean(node: AstNode, context: VisitContext): string {\n let current: AstNode = node;\n let depth = 0;\n while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {\n depth += 1;\n current = current.children[0];\n }\n return `${'ℬ'.repeat(depth)}(${this.visit(current, context)})`;\n }\n\n private wrapIfNeeded(text: string, node: AstNode): string {\n if (this.isAtomic(node.typeID)) {\n return text;\n }\n return `(${text})`;\n }\n\n private isAtomic(typeID: number): boolean {\n return (\n typeID === TokenID.ID_LOCAL ||\n typeID === TokenID.ID_GLOBAL ||\n typeID === TokenID.ID_FUNCTION ||\n typeID === TokenID.ID_PREDICATE ||\n typeID === TokenID.ID_RADICAL ||\n typeID === TokenID.LIT_INTEGER ||\n typeID === TokenID.LIT_WHOLE_NUMBERS ||\n typeID === TokenID.LIT_EMPTYSET ||\n typeID === TokenID.NT_FUNC_CALL ||\n typeID === TokenID.NT_TUPLE ||\n typeID === TokenID.NT_ENUMERATION ||\n typeID === TokenID.BIGPR ||\n typeID === TokenID.SMALLPR ||\n typeID === TokenID.FILTER ||\n typeID === TokenID.REDUCE ||\n typeID === TokenID.BOOL ||\n typeID === TokenID.DEBOOL ||\n typeID === TokenID.CARD ||\n typeID === TokenID.BOOLEAN\n );\n }\n\n private isLogicBinary(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.LOGIC_EQUIVALENT\n );\n }\n\n private formatIndices(node: AstNode): string {\n return getNodeIndices(node).join(',');\n }\n\n private shouldStartScope(typeID: number): boolean {\n return (\n typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.NT_FUNC_DEFINITION ||\n typeID === TokenID.NT_IMPERATIVE_EXPR ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL\n );\n }\n\n private childContext(typeID: number, index: number, parent: VisitContext): VisitContext {\n if (!this.options.normalize) {\n return parent;\n }\n\n const isDeclaration =\n ((typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.ITERATE ||\n typeID === TokenID.ASSIGN ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL) &&\n index === 0) ||\n (typeID === TokenID.NT_FUNC_DEFINITION && index === 0) ||\n (typeID === TokenID.NT_ARG_DECL && index === 0) ||\n typeID === TokenID.NT_TUPLE_DECL ||\n typeID === TokenID.NT_ENUM_DECL;\n\n return { localDeclaration: isDeclaration };\n }\n\n private declareLocal(alias: string): string {\n const scope = this.currentScope();\n const local = this.nextLocal();\n scope.set(alias, local);\n return local;\n }\n\n private resolveLocal(alias: string): string {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const local = this.scopes[index].get(alias);\n if (local) {\n return local;\n }\n }\n\n let local = this.freeLocals.get(alias);\n if (!local) {\n local = this.nextLocal();\n this.freeLocals.set(alias, local);\n }\n return local;\n }\n\n private resolveRadical(alias: string): string {\n let radical = this.radicals.get(alias);\n if (!radical) {\n this.radicalCounter += 1;\n radical = `R${this.radicalCounter}`;\n this.radicals.set(alias, radical);\n }\n return radical;\n }\n\n private startScope(): void {\n this.scopes.push(new Map());\n }\n\n private endScope(): void {\n this.scopes.pop();\n }\n\n private currentScope(): ScopeFrame {\n const scope = this.scopes.at(-1);\n if (!scope) {\n throw new Error('Attempted to declare local outside of scope');\n }\n return scope;\n }\n\n private nextLocal(): string {\n this.localCounter += 1;\n return `a${this.localCounter}`;\n }\n}\n"],"mappings":"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","names":["parts","local"]}
1
+ {"version":3,"file":"expression-generator.js","names":[],"sources":["../../../src/rslang/parser/expression-generator.ts"],"sourcesContent":["import { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\n\nimport { TokenID } from './token';\n\ninterface ExpressionGeneratorOptions {\n normalize?: boolean;\n}\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nexport function generateExpressionFromAst(ast: AstNode, options: ExpressionGeneratorOptions = {}): string {\n return new ExpressionGenerator(options).run(ast);\n}\n\ninterface VisitContext {\n localDeclaration: boolean;\n}\n\ntype ScopeFrame = Map<string, string>;\n\n/** Generates Math-syntax RS expression from AST, with optional identifier normalization. */\nclass ExpressionGenerator {\n private readonly options: ExpressionGeneratorOptions;\n private readonly freeLocals = new Map<string, string>();\n private readonly radicals = new Map<string, string>();\n private readonly scopes: ScopeFrame[] = [];\n private localCounter = 0;\n private radicalCounter = 0;\n\n constructor(options: ExpressionGeneratorOptions) {\n this.options = options;\n }\n\n /** Run generator. Requires that the AST has no syntax errors. */\n run(ast: AstNode): string {\n if (ast.hasError) {\n throw new Error('Cannot generate expression: AST has error');\n }\n return this.visit(ast, { localDeclaration: false });\n }\n\n private visit(node: AstNode, context: VisitContext): string {\n const shouldScope = this.shouldStartScope(node.typeID);\n if (shouldScope) {\n this.startScope();\n }\n\n const result = this.renderNode(node, context);\n\n if (shouldScope) {\n this.endScope();\n }\n return result;\n }\n\n private renderNode(node: AstNode, context: VisitContext): string {\n switch (node.typeID) {\n case TokenID.ID_LOCAL: {\n const alias = getNodeText(node);\n return this.options.normalize\n ? context.localDeclaration\n ? this.declareLocal(alias)\n : this.resolveLocal(alias)\n : alias;\n }\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return getNodeText(node);\n case TokenID.ID_RADICAL: {\n const alias = getNodeText(node);\n return this.options.normalize ? this.resolveRadical(alias) : alias;\n }\n case TokenID.LIT_INTEGER:\n return String(node.data.value);\n case TokenID.LIT_WHOLE_NUMBERS:\n return 'Z';\n case TokenID.LIT_EMPTYSET:\n return '∅';\n\n case TokenID.BIGPR:\n return `Pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.SMALLPR:\n return `pr${this.formatIndices(node)}(${this.visitChild(node, 0, context)})`;\n case TokenID.FILTER: {\n const args = node.children\n .slice(0, -1)\n .map(child => this.visit(child, context))\n .join(', ');\n const body = this.visitChild(node, node.children.length - 1, context);\n return `Fi${this.formatIndices(node)}[${args}](${body})`;\n }\n case TokenID.CARD:\n return `card(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOL:\n return `bool(${this.visitChild(node, 0, context)})`;\n case TokenID.DEBOOL:\n return `debool(${this.visitChild(node, 0, context)})`;\n case TokenID.REDUCE:\n return `red(${this.visitChild(node, 0, context)})`;\n case TokenID.BOOLEAN:\n return this.renderBoolean(node, context);\n\n case TokenID.NT_FUNC_CALL: {\n const callee = this.visitChild(node, 0, context);\n const args = node.children\n .slice(1)\n .map(child => this.visit(child, context))\n .join(', ');\n return `${callee}[${args}]`;\n }\n case TokenID.NT_TUPLE:\n return `(${node.children.map(child => this.visit(child, context)).join(', ')})`;\n case TokenID.NT_ENUMERATION:\n return `{${node.children.map(child => this.visit(child, context)).join(', ')}}`;\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ENUM_DECL:\n return node.children\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index, context)))\n .join(', ');\n case TokenID.NT_TUPLE_DECL:\n return `(${node.children.map((child, index) => this.visit(child, this.childContext(node.typeID, index, context))).join(', ')})`;\n case TokenID.NT_ARG_DECL:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)}`;\n case TokenID.QUANTOR_UNIVERSAL:\n return this.renderQuantifier('∀', node, context);\n case TokenID.QUANTOR_EXISTS:\n return this.renderQuantifier('∃', node, context);\n case TokenID.NT_DECLARATIVE_EXPR:\n return `D{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}∈${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_FUNC_DEFINITION:\n return `[${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}] ${this.visitChild(node, 1, context)}`;\n case TokenID.ITERATE:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:∈${this.visitChild(node, 1, context)}`;\n case TokenID.ASSIGN:\n return `${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)}`;\n case TokenID.NT_IMPERATIVE_EXPR: {\n const statements = node.children\n .slice(1)\n .map((child, index) => this.visit(child, this.childContext(node.typeID, index + 1, context)));\n const target = this.visitChild(node, 0, context);\n return `I{${target} | ${statements.join('; ')}}`;\n }\n case TokenID.NT_RECURSIVE_SHORT:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)}}`;\n case TokenID.NT_RECURSIVE_FULL:\n return `R{${this.visitChild(node, 0, this.childContext(node.typeID, 0, context))}:=${this.visitChild(node, 1, context)} | ${this.visitChild(node, 2, context)} | ${this.visitChild(node, 3, context)}}`;\n\n case TokenID.PLUS:\n return this.renderInfix('+', node, context);\n case TokenID.MINUS:\n return this.renderInfix('-', node, context);\n case TokenID.MULTIPLY:\n return this.renderInfix('*', node, context);\n case TokenID.GREATER:\n return this.renderInfix('>', node, context);\n case TokenID.LESSER:\n return this.renderInfix('<', node, context);\n case TokenID.GREATER_OR_EQ:\n return this.renderInfix('≥', node, context);\n case TokenID.LESSER_OR_EQ:\n return this.renderInfix('≤', node, context);\n case TokenID.EQUAL:\n return this.renderInfix('=', node, context);\n case TokenID.NOTEQUAL:\n return this.renderInfix('≠', node, context);\n case TokenID.LOGIC_AND:\n return this.renderInfix('&', node, context);\n case TokenID.LOGIC_OR:\n return this.renderInfix('∨', node, context);\n case TokenID.LOGIC_IMPLICATION:\n return this.renderInfix('⇒', node, context);\n case TokenID.LOGIC_EQUIVALENT:\n return this.renderInfix('⇔', node, context);\n case TokenID.SET_IN:\n return this.renderInfix('∈', node, context);\n case TokenID.SET_NOT_IN:\n return this.renderInfix('∉', node, context);\n case TokenID.SUBSET:\n return this.renderInfix('⊂', node, context);\n case TokenID.SUBSET_OR_EQ:\n return this.renderInfix('⊆', node, context);\n case TokenID.NOT_SUBSET:\n return this.renderInfix('⊄', node, context);\n case TokenID.DECART:\n return this.renderInfix('×', node, context);\n case TokenID.SET_UNION:\n return this.renderInfix('∪', node, context);\n case TokenID.SET_INTERSECTION:\n return this.renderInfix('∩', node, context);\n case TokenID.SET_MINUS:\n return this.renderInfix('\\\\', node, context);\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.renderInfix('∆', node, context);\n case TokenID.LOGIC_NOT:\n return `¬${this.wrapIfNeeded(this.visitChild(node, 0, context), node.children[0])}`;\n default:\n return node.children.map(child => this.visit(child, context)).join('');\n }\n }\n\n private visitChild(node: AstNode, index: number, context: VisitContext): string {\n const child = node.children[index];\n if (!child) {\n return '';\n }\n return this.visit(child, this.childContext(node.typeID, index, context));\n }\n\n private renderQuantifier(symbol: string, node: AstNode, context: VisitContext): string {\n const declaration = this.visitChild(node, 0, this.childContext(node.typeID, 0, context));\n const domain = this.visitChild(node, 1, context);\n const bodyNode = node.children[2];\n const bodyText = this.visitChild(node, 2, context);\n const body = bodyNode && this.shouldWrapQuantifierBody(bodyNode) ? `(${bodyText})` : bodyText;\n return `${symbol}${declaration}∈${domain} ${body}`;\n }\n\n private shouldWrapQuantifierBody(node: AstNode): boolean {\n const quantifierPrecedence = this.getPrecedence(TokenID.QUANTOR_UNIVERSAL);\n const bodyPrecedence = this.getPrecedence(node.typeID);\n if (quantifierPrecedence === null || bodyPrecedence === null) {\n return false;\n }\n return bodyPrecedence < quantifierPrecedence;\n }\n\n private renderInfix(symbol: string, node: AstNode, context: VisitContext): string {\n if (this.isLogicBinary(node.typeID)) {\n const parts = node.children.map((child, index) => {\n const text = this.visit(child, context);\n return this.needParen(node, child, index) ? `(${text})` : text;\n });\n return parts.join(` ${symbol} `);\n }\n const parts = node.children.map(child => this.wrapIfNeeded(this.visit(child, context), child));\n return parts.join(symbol);\n }\n\n private needParen(parent: AstNode, child: AstNode, childIndex: number): boolean {\n if (this.isAtomic(child.typeID)) {\n return false;\n }\n const parentPrecedence = this.getPrecedence(parent.typeID);\n const childPrecedence = this.getPrecedence(child.typeID);\n if (parentPrecedence === null || childPrecedence === null) {\n return true;\n }\n if (childPrecedence > parentPrecedence) {\n return false;\n }\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n if (this.isAssociative(parent.typeID) && child.typeID === parent.typeID) {\n return false;\n }\n if (this.isLeftAssociative(parent.typeID)) {\n return childIndex > 0;\n }\n return true;\n }\n\n private getPrecedence(typeID: number): number | null {\n switch (typeID) {\n case TokenID.LOGIC_EQUIVALENT:\n return 1;\n case TokenID.LOGIC_IMPLICATION:\n return 2;\n case TokenID.LOGIC_OR:\n return 3;\n case TokenID.LOGIC_AND:\n return 4;\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return 5;\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return 6;\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.SET_UNION:\n case TokenID.SET_SYMMETRIC_MINUS:\n return 7;\n case TokenID.MULTIPLY:\n case TokenID.DECART:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n return 8;\n default:\n return null;\n }\n }\n\n private isAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.PLUS ||\n typeID === TokenID.MULTIPLY ||\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_EQUIVALENT ||\n typeID === TokenID.SET_UNION ||\n typeID === TokenID.SET_INTERSECTION ||\n typeID === TokenID.DECART\n );\n }\n\n private isLeftAssociative(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.MINUS ||\n typeID === TokenID.SET_MINUS ||\n typeID === TokenID.SET_SYMMETRIC_MINUS\n );\n }\n\n private renderBoolean(node: AstNode, context: VisitContext): string {\n let current: AstNode = node;\n let depth = 0;\n while (current.typeID === TokenID.BOOLEAN && current.children.length === 1) {\n depth += 1;\n current = current.children[0];\n }\n return `${'ℬ'.repeat(depth)}(${this.visit(current, context)})`;\n }\n\n private wrapIfNeeded(text: string, node: AstNode): string {\n if (this.isAtomic(node.typeID)) {\n return text;\n }\n return `(${text})`;\n }\n\n private isAtomic(typeID: number): boolean {\n return (\n typeID === TokenID.ID_LOCAL ||\n typeID === TokenID.ID_GLOBAL ||\n typeID === TokenID.ID_FUNCTION ||\n typeID === TokenID.ID_PREDICATE ||\n typeID === TokenID.ID_RADICAL ||\n typeID === TokenID.LIT_INTEGER ||\n typeID === TokenID.LIT_WHOLE_NUMBERS ||\n typeID === TokenID.LIT_EMPTYSET ||\n typeID === TokenID.NT_FUNC_CALL ||\n typeID === TokenID.NT_TUPLE ||\n typeID === TokenID.NT_ENUMERATION ||\n typeID === TokenID.BIGPR ||\n typeID === TokenID.SMALLPR ||\n typeID === TokenID.FILTER ||\n typeID === TokenID.REDUCE ||\n typeID === TokenID.BOOL ||\n typeID === TokenID.DEBOOL ||\n typeID === TokenID.CARD ||\n typeID === TokenID.BOOLEAN\n );\n }\n\n private isLogicBinary(typeID: number): boolean {\n return (\n typeID === TokenID.LOGIC_AND ||\n typeID === TokenID.LOGIC_OR ||\n typeID === TokenID.LOGIC_IMPLICATION ||\n typeID === TokenID.LOGIC_EQUIVALENT\n );\n }\n\n private formatIndices(node: AstNode): string {\n return getNodeIndices(node).join(',');\n }\n\n private shouldStartScope(typeID: number): boolean {\n return (\n typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.NT_FUNC_DEFINITION ||\n typeID === TokenID.NT_IMPERATIVE_EXPR ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL\n );\n }\n\n private childContext(typeID: number, index: number, parent: VisitContext): VisitContext {\n if (!this.options.normalize) {\n return parent;\n }\n\n const isDeclaration =\n ((typeID === TokenID.QUANTOR_UNIVERSAL ||\n typeID === TokenID.QUANTOR_EXISTS ||\n typeID === TokenID.NT_DECLARATIVE_EXPR ||\n typeID === TokenID.ITERATE ||\n typeID === TokenID.ASSIGN ||\n typeID === TokenID.NT_RECURSIVE_SHORT ||\n typeID === TokenID.NT_RECURSIVE_FULL) &&\n index === 0) ||\n (typeID === TokenID.NT_FUNC_DEFINITION && index === 0) ||\n (typeID === TokenID.NT_ARG_DECL && index === 0) ||\n typeID === TokenID.NT_TUPLE_DECL ||\n typeID === TokenID.NT_ENUM_DECL;\n\n return { localDeclaration: isDeclaration };\n }\n\n private declareLocal(alias: string): string {\n const scope = this.currentScope();\n const local = this.nextLocal();\n scope.set(alias, local);\n return local;\n }\n\n private resolveLocal(alias: string): string {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const local = this.scopes[index].get(alias);\n if (local) {\n return local;\n }\n }\n\n let local = this.freeLocals.get(alias);\n if (!local) {\n local = this.nextLocal();\n this.freeLocals.set(alias, local);\n }\n return local;\n }\n\n private resolveRadical(alias: string): string {\n let radical = this.radicals.get(alias);\n if (!radical) {\n this.radicalCounter += 1;\n radical = `R${this.radicalCounter}`;\n this.radicals.set(alias, radical);\n }\n return radical;\n }\n\n private startScope(): void {\n this.scopes.push(new Map());\n }\n\n private endScope(): void {\n this.scopes.pop();\n }\n\n private currentScope(): ScopeFrame {\n const scope = this.scopes.at(-1);\n if (!scope) {\n throw new Error('Attempted to declare local outside of scope');\n }\n return scope;\n }\n\n private nextLocal(): string {\n this.localCounter += 1;\n return `a${this.localCounter}`;\n }\n}\n"],"mappings":"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"}
@@ -1,11 +1,7 @@
1
- import { AstNode } from '../../parsing/ast.js';
2
- import '@lezer/common';
3
-
4
- /**
5
- * Module: Transforming AST to a simple form.
6
- */
7
-
1
+ import { t as AstNode } from "../../ast-C8sIpKdL.js";
2
+ //#region src/rslang/parser/normalize.d.ts
8
3
  /** Normalizes AST to a simple form. */
9
4
  declare function normalizeAST(ast: AstNode, input: string): void;
10
-
5
+ //#endregion
11
6
  export { normalizeAST };
7
+ //# sourceMappingURL=normalize.d.ts.map