@rsconcept/domain 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{diagnostics-D1Cp21nP.js → diagnostics-D_4TpAH4.js} +4 -5
- package/dist/{diagnostics-D1Cp21nP.js.map → diagnostics-D_4TpAH4.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/library/diagnostics.js +1 -1
- package/dist/library/index.js +1 -1
- package/dist/library/oss-api.js +2 -4
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss.js +1 -1
- package/dist/library/rsengine.js +4 -3
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api/index.js +1 -1
- package/dist/library/rsmodel-api.js +6 -4
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/structure-planner.js +1 -1
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.js +9 -6
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/eval/calculator.js +1 -1
- package/dist/rslang/eval/evaluation-cache.js +1 -3
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.js +5 -3
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.js +1 -1
- package/dist/rslang/eval/value.js +1 -1
- package/dist/rslang/index.js +1 -1
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/semantic/arguments-extractor.js +6 -4
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.js +20 -16
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.js +10 -9
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.js +4 -1
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/{value-COprb2Je.js → value-BDISzQqI.js} +3 -2
- package/dist/{value-COprb2Je.js.map → value-BDISzQqI.js.map} +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-auditor.js","names":[],"sources":["../../../src/rslang/semantic/type-auditor.ts"],"sourcesContent":["/**\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 isTemplateRadical,\n isTypification,\n LogicT,\n mangleParamAlias,\n mangleRadicalId,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n cloneTypification,\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(\n node: AstNode,\n index: number,\n errorCode: RSErrorCode,\n operation?: string\n ): 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 const params =\n errorCode === RSErrorCode.invalidTypeOperation && operation !== undefined\n ? [operation, labelType(result)]\n : [labelType(result)];\n this.onError(errorCode, node.children[index], params);\n return null;\n }\n return debool(result);\n }\n\n private childQuantifierDomain(node: AstNode, index: number, operator: string): 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.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, 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 if (type.typeID === TypeID.function || type.typeID === TypeID.predicate) {\n return this.onError(RSErrorCode.globalFuncWithoutArgs, 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, labelToken(TokenID.ITERATE));\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 operator = labelRSLangNode(node);\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), operator]);\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), operator]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\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), operator]);\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), operator]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const operator = labelRSLangNode(node);\n const domain = this.childQuantifierDomain(node, 1, operator);\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 operator = labelRSLangNode(node);\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), operator]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\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), operator]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n operator,\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 operator = labelRSLangNode(node);\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation, operator);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\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)), operator]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argType = this.childTypification(node, 0);\n if (argType === null) {\n return null;\n }\n if (argType.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argType.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.projectionSetArgumentNotSet, argNode, [operator, labelType(argType)]);\n }\n const argument = debool(argType);\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionSetArgumentNotTupleSet, argNode, [operator, labelType(bool(argument))]);\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.projectionSetIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\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 operator = labelRSLangNode(node);\n const argNode = node.children[0];\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.projectionTupleArgumentNotTuple, argNode, [operator, labelType(argument)]);\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.projectionTupleIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\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 operator = labelRSLangNode(node);\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n const extraParam = node.children[indices.length];\n return this.onError(RSErrorCode.invalidFilterArity, extraParam ?? node, [\n String(indices.length),\n String(node.children.length - 1),\n operator\n ]);\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 const expectedArgument = this.expectedFilterArgumentLabel(indices);\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n expectedArgument\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.invalidFilterIndex, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n String(index),\n String(argBase.factors.length)\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 const expectedParam = bool(bases[child]);\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.reportFilterParameterError(node, child, param, expectedParam, operator);\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.reportFilterParameterError(node, 0, paramType, expected, operator);\n }\n }\n return argument;\n }\n\n private expectedFilterArgumentLabel(indices: number[]): string {\n const maxIndex = Math.max(...indices, 0);\n if (maxIndex <= 1) {\n return labelType(bool({ typeID: TypeID.anyTypification }));\n }\n const factors: Typification[] = [];\n for (let index = 1; index <= maxIndex; index++) {\n factors.push({ typeID: TypeID.anyTypification });\n }\n return labelType(bool(tuple(factors)));\n }\n\n private reportFilterParameterError(\n node: AstNode,\n childIndex: number,\n param: Typification,\n expected: Typification,\n operator: string\n ): null {\n const wrapped = bool(param);\n if (checkEquality(wrapped, expected) || checkCompatibility(wrapped, expected)) {\n return this.onError(RSErrorCode.invalidFilterBooleanEchelon, node.children[childIndex], [\n operator,\n labelType(param)\n ]);\n }\n return this.onError(RSErrorCode.invalidFilterParameterType, node.children[childIndex], [\n labelType(param),\n labelType(expected),\n operator\n ]);\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(\n node,\n 1,\n RSErrorCode.invalidTypeOperation,\n labelToken(TokenID.NT_DECLARATIVE_EXPR)\n );\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, labelToken(TokenID.ITERATE));\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 labelToken(node.typeID as TokenID)\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, [\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 const expectedType = cloneTypification(argType);\n if (substitutes.size > 0) {\n substituteBase(expectedType, substitutes);\n }\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${mangleParamAlias(type.args[child - 1].alias, alias)}∈${labelType(expectedType)}`,\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 for ${funcName}: ${JSON.stringify(type)}`);\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isTemplateRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: mangleRadicalId(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\nfunction isLogicBinaryNode(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\nfunction isQuantifierNode(typeID: number): boolean {\n return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS;\n}\n\n/** Quantifier on the path from `node` up through `stopAt` (inclusive). */\nfunction pathContainsQuantifier(node: AstNode, stopAt: AstNode): boolean {\n let current: AstNode | null = node;\n while (current !== null) {\n if (isQuantifierNode(current.typeID)) {\n return true;\n }\n if (current === stopAt) {\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\n/** Right operand subtree of the innermost logic binary containing `node`. */\nfunction findRightLogicOperandRoot(node: AstNode): AstNode | null {\n let current: AstNode | null = node;\n while (current !== null && current.parent !== null) {\n const parent: AstNode = current.parent;\n if (isLogicBinaryNode(parent.typeID)) {\n const childIndex = parent.children.indexOf(current);\n if (childIndex > 0) {\n return current;\n }\n }\n current = parent;\n }\n return null;\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 return false;\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 return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n } else if (local.level < 1) {\n const subexprRoot = findRightLogicOperandRoot(node);\n if (subexprRoot !== null) {\n if (pathContainsQuantifier(node, subexprRoot)) {\n return this.onError(RSErrorCode.localUndeclaredInSubexpr, node, [alias, labelType(local.type)]);\n }\n return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);\n }\n return this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"type-auditor.js","names":[],"sources":["../../../src/rslang/semantic/type-auditor.ts"],"sourcesContent":["/**\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 isTemplateRadical,\n isTypification,\n LogicT,\n mangleParamAlias,\n mangleRadicalId,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n cloneTypification,\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(\n node: AstNode,\n index: number,\n errorCode: RSErrorCode,\n operation?: string\n ): 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 const params =\n errorCode === RSErrorCode.invalidTypeOperation && operation !== undefined\n ? [operation, labelType(result)]\n : [labelType(result)];\n this.onError(errorCode, node.children[index], params);\n return null;\n }\n return debool(result);\n }\n\n private childQuantifierDomain(node: AstNode, index: number, operator: string): 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.invalidQuantifierDomain, node.children[index], [operator, labelType(result)]);\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(RSErrorCode.invalidQuantifierDomain, node.children[index], [operator, 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 if (type.typeID === TypeID.function || type.typeID === TypeID.predicate) {\n return this.onError(RSErrorCode.globalFuncWithoutArgs, 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, labelToken(TokenID.ITERATE));\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 operator = labelRSLangNode(node);\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), operator]);\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), operator]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\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), operator]);\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), operator]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2), operator]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const operator = labelRSLangNode(node);\n const domain = this.childQuantifierDomain(node, 1, operator);\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 operator = labelRSLangNode(node);\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), operator]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\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), operator]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n operator,\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 operator = labelRSLangNode(node);\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation, operator);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation, operator);\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)), operator]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const operator = labelRSLangNode(node);\n const argNode = node.children[0];\n const argType = this.childTypification(node, 0);\n if (argType === null) {\n return null;\n }\n if (argType.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argType.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.projectionSetArgumentNotSet, argNode, [operator, labelType(argType)]);\n }\n const argument = debool(argType);\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.projectionSetArgumentNotTupleSet, argNode, [operator, labelType(bool(argument))]);\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.projectionSetIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\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 operator = labelRSLangNode(node);\n const argNode = node.children[0];\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.projectionTupleArgumentNotTuple, argNode, [operator, labelType(argument)]);\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.projectionTupleIndexOutOfRange, argNode, [\n operator,\n String(index),\n String(argument.factors.length),\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 operator = labelRSLangNode(node);\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n const extraParam = node.children[indices.length];\n return this.onError(RSErrorCode.invalidFilterArity, extraParam ?? node, [\n String(indices.length),\n String(node.children.length - 1),\n operator\n ]);\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 const expectedArgument = this.expectedFilterArgumentLabel(indices);\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n expectedArgument\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.invalidFilterIndex, node.children[node.children.length - 1], [\n operator,\n labelType(argument),\n String(index),\n String(argBase.factors.length)\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 const expectedParam = bool(bases[child]);\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.reportFilterParameterError(node, child, param, expectedParam, operator);\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.reportFilterParameterError(node, 0, paramType, expected, operator);\n }\n }\n return argument;\n }\n\n private expectedFilterArgumentLabel(indices: number[]): string {\n const maxIndex = Math.max(...indices, 0);\n if (maxIndex <= 1) {\n return labelType(bool({ typeID: TypeID.anyTypification }));\n }\n const factors: Typification[] = [];\n for (let index = 1; index <= maxIndex; index++) {\n factors.push({ typeID: TypeID.anyTypification });\n }\n return labelType(bool(tuple(factors)));\n }\n\n private reportFilterParameterError(\n node: AstNode,\n childIndex: number,\n param: Typification,\n expected: Typification,\n operator: string\n ): null {\n const wrapped = bool(param);\n if (checkEquality(wrapped, expected) || checkCompatibility(wrapped, expected)) {\n return this.onError(RSErrorCode.invalidFilterBooleanEchelon, node.children[childIndex], [\n operator,\n labelType(param)\n ]);\n }\n return this.onError(RSErrorCode.invalidFilterParameterType, node.children[childIndex], [\n labelType(param),\n labelType(expected),\n operator\n ]);\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(\n node,\n 1,\n RSErrorCode.invalidTypeOperation,\n labelToken(TokenID.NT_DECLARATIVE_EXPR)\n );\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, labelToken(TokenID.ITERATE));\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 labelToken(node.typeID as TokenID)\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, [\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 const expectedType = cloneTypification(argType);\n if (substitutes.size > 0) {\n substituteBase(expectedType, substitutes);\n }\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${mangleParamAlias(type.args[child - 1].alias, alias)}∈${labelType(expectedType)}`,\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 for ${funcName}: ${JSON.stringify(type)}`);\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isTemplateRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: mangleRadicalId(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\nfunction isLogicBinaryNode(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\nfunction isQuantifierNode(typeID: number): boolean {\n return typeID === TokenID.QUANTOR_UNIVERSAL || typeID === TokenID.QUANTOR_EXISTS;\n}\n\n/** Quantifier on the path from `node` up through `stopAt` (inclusive). */\nfunction pathContainsQuantifier(node: AstNode, stopAt: AstNode): boolean {\n let current: AstNode | null = node;\n while (current !== null) {\n if (isQuantifierNode(current.typeID)) {\n return true;\n }\n if (current === stopAt) {\n return false;\n }\n current = current.parent;\n }\n return false;\n}\n\n/** Right operand subtree of the innermost logic binary containing `node`. */\nfunction findRightLogicOperandRoot(node: AstNode): AstNode | null {\n let current: AstNode | null = node;\n while (current !== null && current.parent !== null) {\n const parent: AstNode = current.parent;\n if (isLogicBinaryNode(parent.typeID)) {\n const childIndex = parent.children.indexOf(current);\n if (childIndex > 0) {\n return current;\n }\n }\n current = parent;\n }\n return null;\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 return false;\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 return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n } else if (local.level < 1) {\n const subexprRoot = findRightLogicOperandRoot(node);\n if (subexprRoot !== null) {\n if (pathContainsQuantifier(node, subexprRoot)) {\n return this.onError(RSErrorCode.localUndeclaredInSubexpr, node, [alias, labelType(local.type)]);\n }\n return this.onError(RSErrorCode.localOutOfScopeParentheses, node, [alias]);\n }\n return this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -91,14 +91,16 @@ function checkCompatibility(type1, type2) {
|
|
|
91
91
|
/** Compare typification with substitutions. */
|
|
92
92
|
function compareTemplated(substitutes, arg, value) {
|
|
93
93
|
if (arg === value) return true;
|
|
94
|
-
if (arg.typeID === TypeID.basic && isRadical(arg.baseID))
|
|
95
|
-
substitutes.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
94
|
+
if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {
|
|
95
|
+
if (!substitutes.has(arg.baseID)) {
|
|
96
|
+
substitutes.set(arg.baseID, value);
|
|
97
|
+
return true;
|
|
98
|
+
} else {
|
|
99
|
+
const mergeType = mergeTypifications(substitutes.get(arg.baseID), value);
|
|
100
|
+
if (mergeType === null) return false;
|
|
101
|
+
substitutes.set(arg.baseID, mergeType);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
102
104
|
}
|
|
103
105
|
if (arg.typeID === TypeID.anyTypification || value.typeID === TypeID.anyTypification) return true;
|
|
104
106
|
if (arg.typeID === TypeID.integer || arg.typeID === TypeID.basic || value.typeID === TypeID.integer || value.typeID === TypeID.basic) return commonType(arg, value) !== null;
|
|
@@ -161,7 +163,6 @@ function applyPath(target, path, index = 0) {
|
|
|
161
163
|
current = component(current, path[i]);
|
|
162
164
|
if (current === null) return null;
|
|
163
165
|
i++;
|
|
164
|
-
break;
|
|
165
166
|
}
|
|
166
167
|
return current;
|
|
167
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typification-api.js","names":[],"sources":["../../../src/rslang/semantic/typification-api.ts"],"sourcesContent":["/**\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 (arg.typeID === TypeID.anyTypification || 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/** Clone typification tree. */\nexport function cloneTypification(type: Typification): Typification {\n switch (type.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic:\n return { ...type };\n case TypeID.collection:\n return { typeID: type.typeID, base: cloneTypification(type.base) };\n case TypeID.tuple:\n return { typeID: type.typeID, factors: type.factors.map(cloneTypification) };\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typification-api.js","names":[],"sources":["../../../src/rslang/semantic/typification-api.ts"],"sourcesContent":["/**\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 (arg.typeID === TypeID.anyTypification || 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/** Clone typification tree. */\nexport function cloneTypification(type: Typification): Typification {\n switch (type.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n return type;\n case TypeID.basic:\n return { ...type };\n case TypeID.collection:\n return { typeID: type.typeID, base: cloneTypification(type.base) };\n case TypeID.tuple:\n return { typeID: type.typeID, factors: type.factors.map(cloneTypification) };\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"],"mappings":"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"}
|
|
@@ -98,7 +98,10 @@ var TypificationParser = class {
|
|
|
98
98
|
return bool(base);
|
|
99
99
|
}
|
|
100
100
|
this.skipSpaces();
|
|
101
|
-
if (this.input.startsWith("ℬ", this.index))
|
|
101
|
+
if (this.input.startsWith("ℬ", this.index)) {
|
|
102
|
+
const base = this.parseTypification();
|
|
103
|
+
return bool(base);
|
|
104
|
+
}
|
|
102
105
|
throw new Error("Expected \"(\" after \"ℬ\"");
|
|
103
106
|
}
|
|
104
107
|
const first = this.parseTypificationAtom();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typification-parser.js","names":[],"sources":["../../../src/rslang/semantic/typification-parser.ts"],"sourcesContent":["import {\n bool,\n type ExpressionType,\n IntegerT,\n isTypification,\n LogicT,\n tuple,\n TypeID,\n type Typification\n} from './typification';\n\nexport interface TypificationParseResult {\n type: ExpressionType | null;\n error: string | null;\n}\n\nexport function parseTypeText(input: string): TypificationParseResult {\n const normalized = input.trim().replaceAll('->', '→');\n if (normalized.length === 0) {\n return { type: null, error: null };\n }\n const parser = new TypificationParser(normalized);\n return parser.parse();\n}\n\n/** ASCII substitutions while editing typification text */\nexport function applyAsciiTypeSubstitutions(raw: string): string {\n return raw.replaceAll('->', '→').replaceAll('*', '×').replaceAll('B', 'ℬ');\n}\n\nclass TypificationParser {\n private index = 0;\n private input: string;\n\n constructor(input: string) {\n this.index = 0;\n this.input = input;\n }\n\n parse(): TypificationParseResult {\n try {\n const result = this.parseExpressionType();\n this.skipSpaces();\n if (!this.eof()) {\n throw new Error('Unexpected trailing symbols');\n }\n return { type: result, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { type: null, error: message };\n }\n }\n\n private parseExpressionType(): ExpressionType {\n this.skipSpaces();\n if (this.peek() === '[') {\n return this.parseCallableType();\n } else {\n return this.parseTypification();\n }\n }\n\n private parseCallableType(): ExpressionType {\n this.expect('[');\n const args: Typification[] = [];\n this.skipSpaces();\n if (this.peek() !== ']') {\n while (true) {\n args.push(this.parseTypification());\n this.skipSpaces();\n if (this.peek() === ',') {\n this.next();\n this.skipSpaces();\n if (this.peek() === ']') {\n throw new Error('Empty argument in callable typification');\n }\n continue;\n }\n break;\n }\n }\n this.expect(']');\n this.skipSpaces();\n this.expect('→');\n const result = this.parseCallableResult();\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: LogicT,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n if (!isTypification(result)) {\n throw new Error('Invalid callable result type');\n }\n return {\n typeID: TypeID.function,\n result: result as Typification,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n\n private parseCallableResult(): ExpressionType {\n this.skipSpaces();\n const lookahead = this.readToken();\n this.index -= lookahead.length;\n if (lookahead === 'Logic') {\n this.index += lookahead.length;\n return LogicT;\n }\n return this.parseTypification();\n }\n\n private parseTypification(): Typification {\n this.skipSpaces();\n if (this.match('ℬ')) {\n this.skipSpaces();\n if (this.peek() === '(') {\n this.next();\n const base = this.parseTypification();\n this.expect(')');\n return bool(base);\n }\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n const base = this.parseTypification();\n return bool(base);\n }\n throw new Error('Expected \"(\" after \"ℬ\"');\n }\n const first = this.parseTypificationAtom();\n const factors: Typification[] = [first];\n while (true) {\n this.skipSpaces();\n if (!this.match('×')) {\n break;\n }\n factors.push(this.parseTypificationAtom());\n }\n if (factors.length === 1) {\n return first;\n }\n return tuple(factors);\n }\n\n private parseTypificationAtom(): Typification {\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n return this.parseTypification();\n }\n if (this.peek() === '(') {\n this.next();\n const wrapped = this.parseTypification();\n this.expect(')');\n return wrapped;\n }\n const token = this.readToken();\n if (token === 'Z') {\n return IntegerT;\n }\n if (token === 'R0') {\n return { typeID: TypeID.anyTypification };\n }\n if (!/^[A-Z]\\d+$/.test(token)) {\n throw new Error(`Unknown typification token \"${token}\"`);\n }\n return { typeID: TypeID.basic, baseID: token };\n }\n\n private readToken(): string {\n this.skipSpaces();\n const start = this.index;\n while (!this.eof()) {\n const char = this.peek();\n if (!char || /[\\s,()[\\]→×]/.test(char)) {\n break;\n }\n this.next();\n }\n if (start === this.index) {\n throw new Error('Expected typification token');\n }\n return this.input.slice(start, this.index);\n }\n\n private skipSpaces(): void {\n while (!this.eof() && /\\s/.test(this.peek()!)) {\n this.index += 1;\n }\n }\n\n private expect(symbol: string): void {\n this.skipSpaces();\n if (!this.match(symbol)) {\n throw new Error(`Expected \"${symbol}\"`);\n }\n }\n\n private match(symbol: string): boolean {\n if (this.input.startsWith(symbol, this.index)) {\n this.index += symbol.length;\n return true;\n }\n return false;\n }\n\n private peek(): string | undefined {\n return this.input[this.index];\n }\n\n private next(): string | undefined {\n const value = this.input[this.index];\n this.index += 1;\n return value;\n }\n\n private eof(): boolean {\n return this.index >= this.input.length;\n }\n}\n"],"mappings":";;AAgBA,SAAgB,cAAc,OAAwC;CACpE,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,WAAW,MAAM,GAAG;CACpD,IAAI,WAAW,WAAW,GACxB,OAAO;EAAE,MAAM;EAAM,OAAO;CAAK;CAGnC,OAAO,IADY,mBAAmB,UAC/B,CAAA,CAAO,MAAM;AACtB;;AAGA,SAAgB,4BAA4B,KAAqB;CAC/D,OAAO,IAAI,WAAW,MAAM,GAAG,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,WAAW,KAAK,GAAG;AAC3E;AAEA,IAAM,qBAAN,MAAyB;CACvB,QAAgB;CAChB;CAEA,YAAY,OAAe;EACzB,KAAK,QAAQ;EACb,KAAK,QAAQ;CACf;CAEA,QAAiC;EAC/B,IAAI;GACF,MAAM,SAAS,KAAK,oBAAoB;GACxC,KAAK,WAAW;GAChB,IAAI,CAAC,KAAK,IAAI,GACZ,MAAM,IAAI,MAAM,6BAA6B;GAE/C,OAAO;IAAE,MAAM;IAAQ,OAAO;GAAK;EACrC,SAAS,OAAO;GAEd,OAAO;IAAE,MAAM;IAAM,OADL,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GACjC;EACtC;CACF;CAEA,sBAA8C;EAC5C,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,KAClB,OAAO,KAAK,kBAAkB;OAE9B,OAAO,KAAK,kBAAkB;CAElC;CAEA,oBAA4C;EAC1C,KAAK,OAAO,GAAG;EACf,MAAM,OAAuB,CAAC;EAC9B,KAAK,WAAW;EAChB,IAAI,KAAK,KAAK,MAAM,KAClB,OAAO,MAAM;GACX,KAAK,KAAK,KAAK,kBAAkB,CAAC;GAClC,KAAK,WAAW;GAChB,IAAI,KAAK,KAAK,MAAM,KAAK;IACvB,KAAK,KAAK;IACV,KAAK,WAAW;IAChB,IAAI,KAAK,KAAK,MAAM,KAClB,MAAM,IAAI,MAAM,yCAAyC;IAE3D;GACF;GACA;EACF;EAEF,KAAK,OAAO,GAAG;EACf,KAAK,WAAW;EAChB,KAAK,OAAO,GAAG;EACf,MAAM,SAAS,KAAK,oBAAoB;EACxC,IAAI,OAAO,WAAW,OAAO,OAC3B,OAAO;GACL,QAAQ,OAAO;GACf,QAAQ;GACR,MAAM,KAAK,KAAK,KAAK,WAAW;IAAE,OAAO,IAAI,QAAQ;IAAK,MAAM;GAAI,EAAE;EACxE;EAEF,IAAI,CAAC,eAAe,MAAM,GACxB,MAAM,IAAI,MAAM,8BAA8B;EAEhD,OAAO;GACL,QAAQ,OAAO;GACP;GACR,MAAM,KAAK,KAAK,KAAK,WAAW;IAAE,OAAO,IAAI,QAAQ;IAAK,MAAM;GAAI,EAAE;EACxE;CACF;CAEA,sBAA8C;EAC5C,KAAK,WAAW;EAChB,MAAM,YAAY,KAAK,UAAU;EACjC,KAAK,SAAS,UAAU;EACxB,IAAI,cAAc,SAAS;GACzB,KAAK,SAAS,UAAU;GACxB,OAAO;EACT;EACA,OAAO,KAAK,kBAAkB;CAChC;CAEA,oBAA0C;EACxC,KAAK,WAAW;EAChB,IAAI,KAAK,MAAM,GAAG,GAAG;GACnB,KAAK,WAAW;GAChB,IAAI,KAAK,KAAK,MAAM,KAAK;IACvB,KAAK,KAAK;IACV,MAAM,OAAO,KAAK,kBAAkB;IACpC,KAAK,OAAO,GAAG;IACf,OAAO,KAAK,IAAI;GAClB;GACA,KAAK,WAAW;GAChB,IAAI,KAAK,MAAM,WAAW,KAAK,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"typification-parser.js","names":[],"sources":["../../../src/rslang/semantic/typification-parser.ts"],"sourcesContent":["import {\n bool,\n type ExpressionType,\n IntegerT,\n isTypification,\n LogicT,\n tuple,\n TypeID,\n type Typification\n} from './typification';\n\nexport interface TypificationParseResult {\n type: ExpressionType | null;\n error: string | null;\n}\n\nexport function parseTypeText(input: string): TypificationParseResult {\n const normalized = input.trim().replaceAll('->', '→');\n if (normalized.length === 0) {\n return { type: null, error: null };\n }\n const parser = new TypificationParser(normalized);\n return parser.parse();\n}\n\n/** ASCII substitutions while editing typification text */\nexport function applyAsciiTypeSubstitutions(raw: string): string {\n return raw.replaceAll('->', '→').replaceAll('*', '×').replaceAll('B', 'ℬ');\n}\n\nclass TypificationParser {\n private index = 0;\n private input: string;\n\n constructor(input: string) {\n this.index = 0;\n this.input = input;\n }\n\n parse(): TypificationParseResult {\n try {\n const result = this.parseExpressionType();\n this.skipSpaces();\n if (!this.eof()) {\n throw new Error('Unexpected trailing symbols');\n }\n return { type: result, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { type: null, error: message };\n }\n }\n\n private parseExpressionType(): ExpressionType {\n this.skipSpaces();\n if (this.peek() === '[') {\n return this.parseCallableType();\n } else {\n return this.parseTypification();\n }\n }\n\n private parseCallableType(): ExpressionType {\n this.expect('[');\n const args: Typification[] = [];\n this.skipSpaces();\n if (this.peek() !== ']') {\n while (true) {\n args.push(this.parseTypification());\n this.skipSpaces();\n if (this.peek() === ',') {\n this.next();\n this.skipSpaces();\n if (this.peek() === ']') {\n throw new Error('Empty argument in callable typification');\n }\n continue;\n }\n break;\n }\n }\n this.expect(']');\n this.skipSpaces();\n this.expect('→');\n const result = this.parseCallableResult();\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: LogicT,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n if (!isTypification(result)) {\n throw new Error('Invalid callable result type');\n }\n return {\n typeID: TypeID.function,\n result: result as Typification,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n\n private parseCallableResult(): ExpressionType {\n this.skipSpaces();\n const lookahead = this.readToken();\n this.index -= lookahead.length;\n if (lookahead === 'Logic') {\n this.index += lookahead.length;\n return LogicT;\n }\n return this.parseTypification();\n }\n\n private parseTypification(): Typification {\n this.skipSpaces();\n if (this.match('ℬ')) {\n this.skipSpaces();\n if (this.peek() === '(') {\n this.next();\n const base = this.parseTypification();\n this.expect(')');\n return bool(base);\n }\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n const base = this.parseTypification();\n return bool(base);\n }\n throw new Error('Expected \"(\" after \"ℬ\"');\n }\n const first = this.parseTypificationAtom();\n const factors: Typification[] = [first];\n while (true) {\n this.skipSpaces();\n if (!this.match('×')) {\n break;\n }\n factors.push(this.parseTypificationAtom());\n }\n if (factors.length === 1) {\n return first;\n }\n return tuple(factors);\n }\n\n private parseTypificationAtom(): Typification {\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n return this.parseTypification();\n }\n if (this.peek() === '(') {\n this.next();\n const wrapped = this.parseTypification();\n this.expect(')');\n return wrapped;\n }\n const token = this.readToken();\n if (token === 'Z') {\n return IntegerT;\n }\n if (token === 'R0') {\n return { typeID: TypeID.anyTypification };\n }\n if (!/^[A-Z]\\d+$/.test(token)) {\n throw new Error(`Unknown typification token \"${token}\"`);\n }\n return { typeID: TypeID.basic, baseID: token };\n }\n\n private readToken(): string {\n this.skipSpaces();\n const start = this.index;\n while (!this.eof()) {\n const char = this.peek();\n if (!char || /[\\s,()[\\]→×]/.test(char)) {\n break;\n }\n this.next();\n }\n if (start === this.index) {\n throw new Error('Expected typification token');\n }\n return this.input.slice(start, this.index);\n }\n\n private skipSpaces(): void {\n while (!this.eof() && /\\s/.test(this.peek()!)) {\n this.index += 1;\n }\n }\n\n private expect(symbol: string): void {\n this.skipSpaces();\n if (!this.match(symbol)) {\n throw new Error(`Expected \"${symbol}\"`);\n }\n }\n\n private match(symbol: string): boolean {\n if (this.input.startsWith(symbol, this.index)) {\n this.index += symbol.length;\n return true;\n }\n return false;\n }\n\n private peek(): string | undefined {\n return this.input[this.index];\n }\n\n private next(): string | undefined {\n const value = this.input[this.index];\n this.index += 1;\n return value;\n }\n\n private eof(): boolean {\n return this.index >= this.input.length;\n }\n}\n"],"mappings":"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"}
|
|
@@ -190,7 +190,8 @@ function printValue(data) {
|
|
|
190
190
|
/** Generates stub ID for value. */
|
|
191
191
|
function valueStub(value) {
|
|
192
192
|
if (value == null) return "";
|
|
193
|
-
|
|
193
|
+
const str = printValue(value);
|
|
194
|
+
return generateStub(str);
|
|
194
195
|
}
|
|
195
196
|
/** Checks if value is a set representation, not a tuple representation. */
|
|
196
197
|
function isSetValue(data) {
|
|
@@ -374,4 +375,4 @@ function set(elements) {
|
|
|
374
375
|
//#endregion
|
|
375
376
|
export { setUnion as A, printValue as C, setIntersection as D, setDiff as E, validateValue as M, valueStub as N, setNestedValue as O, normalizeValue as S, reduce as T, extractValue as _, SET_INFINITY as a, isTupleValue as b, VALUE_TRUE as c, set as d, tuple as f, convertPathToType as g, contains as h, INVALID_ELEMENT as i, testInvalid as j, setSymDiff as k, compare as l, cartesianProduct as m, CalcInvalidDataError as n, TUPLE_ID as o, boolean as p, EmptySetV as r, VALUE_FALSE as s, BOOL_INFINITY as t, makeValuePath as u, isSetValue as v, projection as w, makeDefaultValue as x, isSubsetOrEq as y };
|
|
376
377
|
|
|
377
|
-
//# sourceMappingURL=value-
|
|
378
|
+
//# sourceMappingURL=value-BDISzQqI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-COprb2Je.js","names":[],"sources":["../src/rslang/eval/value-api.ts","../src/rslang/eval/value.ts"],"sourcesContent":["import { generateStub } from '../../shared';\nimport { type ExpressionType, TypeID, type TypePath, type Typification } from '../semantic/typification';\n\nimport {\n BOOL_INFINITY,\n compare,\n EmptySetV,\n INVALID_ELEMENT,\n makeValuePath,\n set,\n SET_INFINITY,\n tuple,\n TUPLE_ID,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext,\n type ValuePath\n} from './value';\n\n/** Cartesian product of factor sets. */\nexport function cartesianProduct(factors: Value[][]): Value[] | null {\n const cardinality = factors.reduce((acc, f) => acc * f.length, 1);\n if (cardinality > SET_INFINITY) {\n return null;\n }\n if (cardinality === 0 || factors.length === 0) {\n return EmptySetV;\n }\n\n let accumulator: Value[][] = [[]];\n for (const factor of factors) {\n const next: Value[][] = [];\n for (const prefix of accumulator) {\n for (const value of factor) {\n next.push([...prefix, value]);\n }\n }\n accumulator = next;\n }\n return accumulator.map(tuple);\n}\n\n/** Boolean power set ℬ(X). No cache - materialized. */\nexport function boolean(base: Value[]): Value[] | null {\n if (base.length > BOOL_INFINITY) {\n return null;\n }\n return powerset(base);\n}\n\n/** Powerset of array. */\nfunction powerset(arr: readonly Value[]): Value[][] {\n const result: Value[][] = [[]];\n if (arr.length === 0) {\n return result;\n }\n\n let current: Value[][] = [[]];\n let maxIndex: number[] = [-1];\n while (current.length > 0) {\n const next: Value[][] = [];\n const nextMaxIndex: number[] = [];\n for (let i = 0; i < current.length; i++) {\n for (let j = maxIndex[i] + 1; j < arr.length; j++) {\n const subset = [...current[i], arr[j]];\n result.push(subset);\n if (j < arr.length - 1) {\n next.push(subset);\n nextMaxIndex.push(j);\n }\n }\n }\n current = next;\n maxIndex = nextMaxIndex;\n }\n return result;\n}\n\n/** Check if set contains element. */\nexport function contains(setData: Value[], element: Value): boolean {\n let left = 0;\n let right = setData.length - 1;\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const cmp = compare(setData[mid], element);\n if (cmp === 0) {\n return true;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return false;\n}\n\n/** Is A ⊆ B. */\nexport function isSubsetOrEq(a: Value[], b: Value[]): boolean {\n let i = 0,\n j = 0;\n while (i < a.length && j < b.length) {\n const cmp = compare(a[i], b[j]);\n if (cmp === 0) {\n i++;\n j++;\n } else if (cmp > 0) {\n j++;\n } else {\n return false;\n }\n }\n return i === a.length;\n}\n\n/** Reduce: flatten double boolean to single boolean. */\nexport function reduce(target: Value[][]): Value[] {\n const result: Value[] = [];\n for (const element of target) {\n result.push(...element);\n }\n return set(result);\n}\n\n/** Union A ∪ B. */\nexport function setUnion(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Intersection A ∩ B. */\nexport function setIntersection(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n for (let i = 0, j = 0; i < set1.length && j < set2.length; ) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n return result;\n}\n\n/** Difference A \\ B. */\nexport function setDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n return result;\n}\n\n/** Symmetric difference A ∆ B. */\nexport function setSymDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Projection of set by indices (BigPr). */\nexport function projection(target: Value[][], indices: number[]): Value[] {\n const projectedElements: Value[] = target.map(element => {\n const newComponents = indices.map(idx => element[idx]);\n return indices.length === 1 ? newComponents[0] : tuple(newComponents);\n });\n return set(projectedElements);\n}\n\n/** Condensed string representation. */\nexport function printValue(data: Value | null): string {\n if (!Array.isArray(data)) {\n return String(data);\n }\n const len = data.length;\n if (data.length === 0) {\n return '{}';\n }\n\n const isTuple = data[0] === TUPLE_ID;\n const start = isTuple ? 1 : 0;\n\n let result = isTuple ? '(' : '{';\n for (let i = start; i < len; i++) {\n if (i > start) result += ', ';\n result += printValue(data[i]);\n }\n result += isTuple ? ')' : '}';\n return result;\n}\n\n/** Generates stub ID for value. */\nexport function valueStub(value: Value | null): string {\n if (value == null) {\n return '';\n }\n const str = printValue(value);\n return generateStub(str);\n}\n\n/** Checks if value is a set representation, not a tuple representation. */\nexport function isSetValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && (data.length === 0 || data[0] !== TUPLE_ID);\n}\n\n/** Checks if value is a tuple representation. */\nexport function isTupleValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && data.length > 1 && data[0] === TUPLE_ID;\n}\n\n/** Normalize unsorted array of values. */\nexport function normalizeValue(data: Value): void {\n if (!Array.isArray(data) || data.length === 0) {\n return;\n }\n\n if (data[0] === TUPLE_ID) {\n for (let i = 1; i < data.length; i++) {\n normalizeValue(data[i]);\n }\n return;\n }\n\n for (const item of data) {\n normalizeValue(item);\n }\n\n data.sort((a, b) => compare(a, b));\n let i = 1;\n while (i < data.length) {\n if (compare(data[i - 1], data[i]) === 0) {\n data.splice(i, 1);\n } else {\n i++;\n }\n }\n}\n\n/** Validates value for {@link ExpressionType} and value of basic sets. */\nexport function validateValue(value: Value, type: ExpressionType, basics: ValueContext): boolean {\n switch (type.typeID) {\n case TypeID.integer:\n return typeof value === 'number';\n case TypeID.logic: {\n if (typeof value !== 'number') {\n return false;\n }\n return value === VALUE_TRUE || value === VALUE_FALSE;\n }\n case TypeID.basic: {\n if (typeof value !== 'number') {\n return false;\n }\n const domain = basics.get(type.baseID);\n return !!domain && Array.isArray(domain) && domain.includes(value);\n }\n\n case TypeID.tuple: {\n if (!Array.isArray(value) || value.length !== type.factors.length + 1 || value[0] !== TUPLE_ID) {\n return false;\n }\n for (let i = 0; i < type.factors.length; i++) {\n if (!validateValue(value[i + 1], type.factors[i], basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.collection: {\n if (!isSetValue(value)) {\n return false;\n }\n for (const item of value) {\n if (!validateValue(item, type.base, basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.anyTypification:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Converts value path to type path. */\nexport function convertPathToType(path: ValuePath, type: Typification): TypePath | null {\n const result: number[] = [];\n if (path.length === 0) {\n return result as TypePath;\n }\n\n let curType = type;\n let index = 0;\n while (index < path.length) {\n switch (curType.typeID) {\n case TypeID.collection: {\n result.push(0);\n curType = curType.base;\n index++;\n break;\n }\n case TypeID.tuple: {\n const tupleIdx = path[index];\n if (typeof tupleIdx !== 'number' || tupleIdx < 1 || tupleIdx > curType.factors.length) {\n return null;\n }\n result.push(tupleIdx);\n curType = curType.factors[tupleIdx - 1];\n index++;\n break;\n }\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return null;\n }\n }\n return result as TypePath;\n}\n\n/** Extracts value from a target by path. */\nexport function extractValue(target: Value, path: ValuePath): Value | null {\n let current: Value = target;\n let i = 0;\n while (i < path.length) {\n if (!Array.isArray(current) || current.length <= path[i]) {\n return null;\n }\n current = current[path[i]];\n i++;\n }\n return current;\n}\n\n/** Makes default value for a type. */\nexport function makeDefaultValue(type: Typification): Value {\n switch (type.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return INVALID_ELEMENT;\n case TypeID.collection:\n return [];\n case TypeID.tuple:\n return tuple(type.factors.map(item => makeDefaultValue(item)));\n }\n}\n\n/** Perform immutable deep copy update. */\nexport function setNestedValue(target: Value | null, path: ValuePath, newVal: Value): Value {\n if (path.length === 0) {\n return newVal;\n }\n const [head, ...rest] = path;\n const arr = Array.isArray(target) ? [...target] : [];\n arr[head] = setNestedValue(arr[head], makeValuePath(rest), newVal);\n return arr;\n}\n\n/** Test if value contains invalid elements. */\nexport function testInvalid(value: Value): boolean {\n const stack = [value];\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === INVALID_ELEMENT) {\n return true;\n }\n if (Array.isArray(current)) {\n for (const element of current) {\n stack.push(element);\n }\n }\n }\n return false;\n}\n","/**\n * Module: Structured data for RSLang expression evaluation.\n */\n\nimport { type Branded } from '../../shared';\n\nimport { printValue } from './value-api';\n\n/** Tuple ID for array distinction. */\nexport const TUPLE_ID = -111;\n\n/** Invalid value for structured data. */\nexport const INVALID_ELEMENT = -1;\n\n/** Boolean values: true. */\nexport const VALUE_TRUE = 1;\n\n/** Boolean values: false. */\nexport const VALUE_FALSE = 0;\n\n/** Cardinality threshold for \"infinite\" sets (e.g. Z). */\nexport const SET_INFINITY = 10_000_000;\n\n/** Cardinality threshold for Boolean power set. */\nexport const BOOL_INFINITY = 18;\n\n/** Expression evaluation result: structured data. */\nexport type Value = number | Value[];\n\n/** Values context. */\nexport type ValueContext = Map<string, Value>;\n\n/** Value extraction path. */\nexport type ValuePath = Branded<number[], 'ValuePath'>;\n\n/** Creates value path. */\nexport function makeValuePath(path: number[]): ValuePath {\n return path as ValuePath;\n}\n\n/** Empty set ∅. */\nexport const EmptySetV = [];\n\n/** Thrown when a runtime value operation cannot be applied to the given operands. */\nexport class CalcInvalidDataError extends Error {\n readonly left: string;\n readonly right: string;\n\n constructor(left: string, right: string) {\n super(`Cannot compare different types ${left} and ${right}`);\n this.name = 'CalcInvalidDataError';\n this.left = left;\n this.right = right;\n }\n}\n\n/** Compare two structured data without recursive calls. */\nexport function compare(v1: Value, v2: Value): number {\n const stack1: Value[] = [v1];\n const stack2: Value[] = [v2];\n\n while (stack1.length > 0 && stack2.length > 0) {\n const el1 = stack1.pop();\n const el2 = stack2.pop();\n if (el1 === el2) {\n continue;\n }\n\n const type1 = typeof el1;\n const type2 = typeof el2;\n if (type1 === 'number' && type2 === 'number') {\n const numDiff = (el1 as number) - (el2 as number);\n if (numDiff !== 0) return numDiff;\n continue;\n }\n\n const isArray1 = Array.isArray(el1);\n const isArray2 = Array.isArray(el2);\n if (!isArray1 || !isArray2) {\n throw new CalcInvalidDataError(printValue(el1!), printValue(el2!));\n }\n\n const arr1 = el1;\n const arr2 = el2;\n const len1 = arr1.length;\n const len2 = arr2.length;\n if (len1 !== len2) {\n return len1 - len2;\n }\n\n for (let i = len1 - 1; i >= 0; i--) {\n stack1.push(arr1[i]);\n stack2.push(arr2[i]);\n }\n }\n return 0;\n}\n\n/** Tuple from components. */\nexport function tuple(components: Value[]): Value {\n return [TUPLE_ID, ...components];\n}\n\n/** Set from elements (unique). Value[] - materialized. */\nexport function set(elements: Value[]): Value[] {\n const sorted = [...elements].sort(compare);\n for (let i = 1; i < sorted.length; ) {\n if (compare(sorted[i - 1], sorted[i]) === 0) {\n sorted.splice(i, 1);\n } else {\n i++;\n }\n }\n return sorted;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"value-BDISzQqI.js","names":[],"sources":["../src/rslang/eval/value-api.ts","../src/rslang/eval/value.ts"],"sourcesContent":["import { generateStub } from '../../shared';\nimport { type ExpressionType, TypeID, type TypePath, type Typification } from '../semantic/typification';\n\nimport {\n BOOL_INFINITY,\n compare,\n EmptySetV,\n INVALID_ELEMENT,\n makeValuePath,\n set,\n SET_INFINITY,\n tuple,\n TUPLE_ID,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext,\n type ValuePath\n} from './value';\n\n/** Cartesian product of factor sets. */\nexport function cartesianProduct(factors: Value[][]): Value[] | null {\n const cardinality = factors.reduce((acc, f) => acc * f.length, 1);\n if (cardinality > SET_INFINITY) {\n return null;\n }\n if (cardinality === 0 || factors.length === 0) {\n return EmptySetV;\n }\n\n let accumulator: Value[][] = [[]];\n for (const factor of factors) {\n const next: Value[][] = [];\n for (const prefix of accumulator) {\n for (const value of factor) {\n next.push([...prefix, value]);\n }\n }\n accumulator = next;\n }\n return accumulator.map(tuple);\n}\n\n/** Boolean power set ℬ(X). No cache - materialized. */\nexport function boolean(base: Value[]): Value[] | null {\n if (base.length > BOOL_INFINITY) {\n return null;\n }\n return powerset(base);\n}\n\n/** Powerset of array. */\nfunction powerset(arr: readonly Value[]): Value[][] {\n const result: Value[][] = [[]];\n if (arr.length === 0) {\n return result;\n }\n\n let current: Value[][] = [[]];\n let maxIndex: number[] = [-1];\n while (current.length > 0) {\n const next: Value[][] = [];\n const nextMaxIndex: number[] = [];\n for (let i = 0; i < current.length; i++) {\n for (let j = maxIndex[i] + 1; j < arr.length; j++) {\n const subset = [...current[i], arr[j]];\n result.push(subset);\n if (j < arr.length - 1) {\n next.push(subset);\n nextMaxIndex.push(j);\n }\n }\n }\n current = next;\n maxIndex = nextMaxIndex;\n }\n return result;\n}\n\n/** Check if set contains element. */\nexport function contains(setData: Value[], element: Value): boolean {\n let left = 0;\n let right = setData.length - 1;\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const cmp = compare(setData[mid], element);\n if (cmp === 0) {\n return true;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return false;\n}\n\n/** Is A ⊆ B. */\nexport function isSubsetOrEq(a: Value[], b: Value[]): boolean {\n let i = 0,\n j = 0;\n while (i < a.length && j < b.length) {\n const cmp = compare(a[i], b[j]);\n if (cmp === 0) {\n i++;\n j++;\n } else if (cmp > 0) {\n j++;\n } else {\n return false;\n }\n }\n return i === a.length;\n}\n\n/** Reduce: flatten double boolean to single boolean. */\nexport function reduce(target: Value[][]): Value[] {\n const result: Value[] = [];\n for (const element of target) {\n result.push(...element);\n }\n return set(result);\n}\n\n/** Union A ∪ B. */\nexport function setUnion(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Intersection A ∩ B. */\nexport function setIntersection(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n for (let i = 0, j = 0; i < set1.length && j < set2.length; ) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n return result;\n}\n\n/** Difference A \\ B. */\nexport function setDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n return result;\n}\n\n/** Symmetric difference A ∆ B. */\nexport function setSymDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Projection of set by indices (BigPr). */\nexport function projection(target: Value[][], indices: number[]): Value[] {\n const projectedElements: Value[] = target.map(element => {\n const newComponents = indices.map(idx => element[idx]);\n return indices.length === 1 ? newComponents[0] : tuple(newComponents);\n });\n return set(projectedElements);\n}\n\n/** Condensed string representation. */\nexport function printValue(data: Value | null): string {\n if (!Array.isArray(data)) {\n return String(data);\n }\n const len = data.length;\n if (data.length === 0) {\n return '{}';\n }\n\n const isTuple = data[0] === TUPLE_ID;\n const start = isTuple ? 1 : 0;\n\n let result = isTuple ? '(' : '{';\n for (let i = start; i < len; i++) {\n if (i > start) result += ', ';\n result += printValue(data[i]);\n }\n result += isTuple ? ')' : '}';\n return result;\n}\n\n/** Generates stub ID for value. */\nexport function valueStub(value: Value | null): string {\n if (value == null) {\n return '';\n }\n const str = printValue(value);\n return generateStub(str);\n}\n\n/** Checks if value is a set representation, not a tuple representation. */\nexport function isSetValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && (data.length === 0 || data[0] !== TUPLE_ID);\n}\n\n/** Checks if value is a tuple representation. */\nexport function isTupleValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && data.length > 1 && data[0] === TUPLE_ID;\n}\n\n/** Normalize unsorted array of values. */\nexport function normalizeValue(data: Value): void {\n if (!Array.isArray(data) || data.length === 0) {\n return;\n }\n\n if (data[0] === TUPLE_ID) {\n for (let i = 1; i < data.length; i++) {\n normalizeValue(data[i]);\n }\n return;\n }\n\n for (const item of data) {\n normalizeValue(item);\n }\n\n data.sort((a, b) => compare(a, b));\n let i = 1;\n while (i < data.length) {\n if (compare(data[i - 1], data[i]) === 0) {\n data.splice(i, 1);\n } else {\n i++;\n }\n }\n}\n\n/** Validates value for {@link ExpressionType} and value of basic sets. */\nexport function validateValue(value: Value, type: ExpressionType, basics: ValueContext): boolean {\n switch (type.typeID) {\n case TypeID.integer:\n return typeof value === 'number';\n case TypeID.logic: {\n if (typeof value !== 'number') {\n return false;\n }\n return value === VALUE_TRUE || value === VALUE_FALSE;\n }\n case TypeID.basic: {\n if (typeof value !== 'number') {\n return false;\n }\n const domain = basics.get(type.baseID);\n return !!domain && Array.isArray(domain) && domain.includes(value);\n }\n\n case TypeID.tuple: {\n if (!Array.isArray(value) || value.length !== type.factors.length + 1 || value[0] !== TUPLE_ID) {\n return false;\n }\n for (let i = 0; i < type.factors.length; i++) {\n if (!validateValue(value[i + 1], type.factors[i], basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.collection: {\n if (!isSetValue(value)) {\n return false;\n }\n for (const item of value) {\n if (!validateValue(item, type.base, basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.anyTypification:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Converts value path to type path. */\nexport function convertPathToType(path: ValuePath, type: Typification): TypePath | null {\n const result: number[] = [];\n if (path.length === 0) {\n return result as TypePath;\n }\n\n let curType = type;\n let index = 0;\n while (index < path.length) {\n switch (curType.typeID) {\n case TypeID.collection: {\n result.push(0);\n curType = curType.base;\n index++;\n break;\n }\n case TypeID.tuple: {\n const tupleIdx = path[index];\n if (typeof tupleIdx !== 'number' || tupleIdx < 1 || tupleIdx > curType.factors.length) {\n return null;\n }\n result.push(tupleIdx);\n curType = curType.factors[tupleIdx - 1];\n index++;\n break;\n }\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return null;\n }\n }\n return result as TypePath;\n}\n\n/** Extracts value from a target by path. */\nexport function extractValue(target: Value, path: ValuePath): Value | null {\n let current: Value = target;\n let i = 0;\n while (i < path.length) {\n if (!Array.isArray(current) || current.length <= path[i]) {\n return null;\n }\n current = current[path[i]];\n i++;\n }\n return current;\n}\n\n/** Makes default value for a type. */\nexport function makeDefaultValue(type: Typification): Value {\n switch (type.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return INVALID_ELEMENT;\n case TypeID.collection:\n return [];\n case TypeID.tuple:\n return tuple(type.factors.map(item => makeDefaultValue(item)));\n }\n}\n\n/** Perform immutable deep copy update. */\nexport function setNestedValue(target: Value | null, path: ValuePath, newVal: Value): Value {\n if (path.length === 0) {\n return newVal;\n }\n const [head, ...rest] = path;\n const arr = Array.isArray(target) ? [...target] : [];\n arr[head] = setNestedValue(arr[head], makeValuePath(rest), newVal);\n return arr;\n}\n\n/** Test if value contains invalid elements. */\nexport function testInvalid(value: Value): boolean {\n const stack = [value];\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === INVALID_ELEMENT) {\n return true;\n }\n if (Array.isArray(current)) {\n for (const element of current) {\n stack.push(element);\n }\n }\n }\n return false;\n}\n","/**\n * Module: Structured data for RSLang expression evaluation.\n */\n\nimport { type Branded } from '../../shared';\n\nimport { printValue } from './value-api';\n\n/** Tuple ID for array distinction. */\nexport const TUPLE_ID = -111;\n\n/** Invalid value for structured data. */\nexport const INVALID_ELEMENT = -1;\n\n/** Boolean values: true. */\nexport const VALUE_TRUE = 1;\n\n/** Boolean values: false. */\nexport const VALUE_FALSE = 0;\n\n/** Cardinality threshold for \"infinite\" sets (e.g. Z). */\nexport const SET_INFINITY = 10_000_000;\n\n/** Cardinality threshold for Boolean power set. */\nexport const BOOL_INFINITY = 18;\n\n/** Expression evaluation result: structured data. */\nexport type Value = number | Value[];\n\n/** Values context. */\nexport type ValueContext = Map<string, Value>;\n\n/** Value extraction path. */\nexport type ValuePath = Branded<number[], 'ValuePath'>;\n\n/** Creates value path. */\nexport function makeValuePath(path: number[]): ValuePath {\n return path as ValuePath;\n}\n\n/** Empty set ∅. */\nexport const EmptySetV = [];\n\n/** Thrown when a runtime value operation cannot be applied to the given operands. */\nexport class CalcInvalidDataError extends Error {\n readonly left: string;\n readonly right: string;\n\n constructor(left: string, right: string) {\n super(`Cannot compare different types ${left} and ${right}`);\n this.name = 'CalcInvalidDataError';\n this.left = left;\n this.right = right;\n }\n}\n\n/** Compare two structured data without recursive calls. */\nexport function compare(v1: Value, v2: Value): number {\n const stack1: Value[] = [v1];\n const stack2: Value[] = [v2];\n\n while (stack1.length > 0 && stack2.length > 0) {\n const el1 = stack1.pop();\n const el2 = stack2.pop();\n if (el1 === el2) {\n continue;\n }\n\n const type1 = typeof el1;\n const type2 = typeof el2;\n if (type1 === 'number' && type2 === 'number') {\n const numDiff = (el1 as number) - (el2 as number);\n if (numDiff !== 0) return numDiff;\n continue;\n }\n\n const isArray1 = Array.isArray(el1);\n const isArray2 = Array.isArray(el2);\n if (!isArray1 || !isArray2) {\n throw new CalcInvalidDataError(printValue(el1!), printValue(el2!));\n }\n\n const arr1 = el1;\n const arr2 = el2;\n const len1 = arr1.length;\n const len2 = arr2.length;\n if (len1 !== len2) {\n return len1 - len2;\n }\n\n for (let i = len1 - 1; i >= 0; i--) {\n stack1.push(arr1[i]);\n stack2.push(arr2[i]);\n }\n }\n return 0;\n}\n\n/** Tuple from components. */\nexport function tuple(components: Value[]): Value {\n return [TUPLE_ID, ...components];\n}\n\n/** Set from elements (unique). Value[] - materialized. */\nexport function set(elements: Value[]): Value[] {\n const sorted = [...elements].sort(compare);\n for (let i = 1; i < sorted.length; ) {\n if (compare(sorted[i - 1], sorted[i]) === 0) {\n sorted.splice(i, 1);\n } else {\n i++;\n }\n }\n return sorted;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/domain",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Shared TypeScript domain for RS language, RSForm, RSModel, RSEngine, OSS, and concept-text helpers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "IRBorisov",
|
|
@@ -172,17 +172,17 @@
|
|
|
172
172
|
},
|
|
173
173
|
"devDependencies": {
|
|
174
174
|
"@lezer/generator": "^1.8.0",
|
|
175
|
-
"@types/node": "^26.
|
|
176
|
-
"@typescript-eslint/parser": "^8.
|
|
177
|
-
"eslint": "^9.
|
|
178
|
-
"eslint-plugin-simple-import-sort": "^
|
|
179
|
-
"globals": "^17.
|
|
180
|
-
"prettier": "^3.9.
|
|
181
|
-
"tsdown": "^0.22.
|
|
175
|
+
"@types/node": "^26.4.0",
|
|
176
|
+
"@typescript-eslint/parser": "^8.69.0",
|
|
177
|
+
"eslint": "^10.9.1",
|
|
178
|
+
"eslint-plugin-simple-import-sort": "^14.0.0",
|
|
179
|
+
"globals": "^17.11.0",
|
|
180
|
+
"prettier": "^3.9.6",
|
|
181
|
+
"tsdown": "^0.22.14",
|
|
182
182
|
"typescript": "^6.0.3",
|
|
183
|
-
"typescript-eslint": "^8.
|
|
183
|
+
"typescript-eslint": "^8.69.0",
|
|
184
184
|
"unrun": "^0.3.1",
|
|
185
|
-
"vitest": "^4.1.
|
|
185
|
+
"vitest": "^4.1.11"
|
|
186
186
|
},
|
|
187
187
|
"publishConfig": {
|
|
188
188
|
"access": "public"
|