/** * Generates description for {@link IConstituenta}. */ import { PARAMETER } from '@/utils/constants'; import { type RO } from '@/utils/meta'; import { prepareTooltip } from '@/utils/utils'; import { type IVersionInfo } from '../library/backend/types'; import { type CurrentVersion } from '../library/models/library'; import { CstType, type IRSErrorDescription, ParsingStatus, RSErrorType, TokenID } from './backend/types'; import { Grammeme, ReferenceType } from './models/language'; import { CstClass, ExpressionStatus, type IConstituenta } from './models/rsform'; import { type IArgumentInfo, type ISyntaxTreeNode } from './models/rslang'; import { CstMatchMode, DependencyMode } from './stores/cst-search'; import { type GraphColoring, type GraphType } from './stores/term-graph'; // --- Records for label/describe functions --- const labelCstTypeRecord: Record = { [CstType.NOMINAL]: 'Номеноид', [CstType.BASE]: 'Базисное множество', [CstType.CONSTANT]: 'Константное множество', [CstType.STRUCTURED]: 'Родовая структура', [CstType.AXIOM]: 'Аксиома', [CstType.TERM]: 'Терм', [CstType.FUNCTION]: 'Терм-функция', [CstType.PREDICATE]: 'Предикат-функция', [CstType.THEOREM]: 'Теорема' }; const labelReferenceTypeRecord: Record = { [ReferenceType.ENTITY]: 'Использование термина', [ReferenceType.SYNTACTIC]: 'Связывание слов' }; const labelCstClassRecord: Record = { [CstClass.NOMINAL]: 'номинальный', [CstClass.BASIC]: 'базовый', [CstClass.DERIVED]: 'производный', [CstClass.STATEMENT]: 'утверждение', [CstClass.TEMPLATE]: 'шаблон' }; const describeCstClassRecord: Record = { [CstClass.NOMINAL]: 'номинальная сущность', [CstClass.BASIC]: 'неопределяемое понятие', [CstClass.DERIVED]: 'определяемое понятие', [CstClass.STATEMENT]: 'логическое утверждение', [CstClass.TEMPLATE]: 'шаблон определения' }; const labelColoringRecord: Record = { none: 'Цвет: Моно', status: 'Цвет: Статус', type: 'Цвет: Класс', schemas: 'Цвет: Схемы' }; const labelGraphTypeRecord: Record = { full: 'Связи: Все', definition: 'Связи: Определения', association: 'Связи: Ассоциации' }; const labelCstMatchModeRecord: Record = { [CstMatchMode.ALL]: 'фильтр', [CstMatchMode.EXPR]: 'выражение', [CstMatchMode.TERM]: 'термин', [CstMatchMode.TEXT]: 'текст', [CstMatchMode.NAME]: 'имя' }; const describeCstMatchModeRecord: Record = { [CstMatchMode.ALL]: 'все атрибуты', [CstMatchMode.EXPR]: 'формальное определение', [CstMatchMode.TERM]: 'термин', [CstMatchMode.TEXT]: 'определение и конвенция', [CstMatchMode.NAME]: 'только имена' }; const labelCstSourceRecord: Record = { [DependencyMode.ALL]: 'граф', [DependencyMode.OUTPUTS]: 'потребители', [DependencyMode.INPUTS]: 'поставщики', [DependencyMode.EXPAND_OUTPUTS]: 'зависимые', [DependencyMode.EXPAND_INPUTS]: 'влияющие' }; const describeCstSourceRecord: Record = { [DependencyMode.ALL]: 'все конституенты', [DependencyMode.OUTPUTS]: 'прямые исходящие', [DependencyMode.INPUTS]: 'прямые входящие', [DependencyMode.EXPAND_OUTPUTS]: 'цепочка исходящих', [DependencyMode.EXPAND_INPUTS]: 'цепочка входящих' }; const labelExpressionStatusRecord: Record = { [ExpressionStatus.VERIFIED]: 'корректно', [ExpressionStatus.INCORRECT]: 'ошибка', [ExpressionStatus.INCALCULABLE]: 'невычислимо', [ExpressionStatus.PROPERTY]: 'неразмерное', [ExpressionStatus.UNKNOWN]: 'не проверено', [ExpressionStatus.UNDEFINED]: 'N/A' }; const describeExpressionStatusRecord: Record = { [ExpressionStatus.VERIFIED]: 'корректно и вычислимо', [ExpressionStatus.INCORRECT]: 'обнаружена ошибка', [ExpressionStatus.INCALCULABLE]: 'интерпретация не вычисляется', [ExpressionStatus.PROPERTY]: 'только проверка принадлежности', [ExpressionStatus.UNKNOWN]: 'требуется проверка', [ExpressionStatus.UNDEFINED]: 'ошибка при проверке' }; const labelGrammemeRecord: Partial> = { [Grammeme.NOUN]: 'ЧР: сущ', [Grammeme.VERB]: 'ЧР: глагол', [Grammeme.INFN]: 'ЧР: глагол инф', [Grammeme.ADJF]: 'ЧР: прил', [Grammeme.PRTF]: 'ЧР: прич', [Grammeme.ADJS]: 'ЧР: кр прил', [Grammeme.PRTS]: 'ЧР: кр прич', [Grammeme.COMP]: 'ЧР: компаратив', [Grammeme.GRND]: 'ЧР: деепричастие', [Grammeme.NUMR]: 'ЧР: число', [Grammeme.ADVB]: 'ЧР: наречие', [Grammeme.NPRO]: 'ЧР: местоимение', [Grammeme.PRED]: 'ЧР: предикатив', [Grammeme.PREP]: 'ЧР: предлог', [Grammeme.CONJ]: 'ЧР: союз', [Grammeme.PRCL]: 'ЧР: частица', [Grammeme.INTJ]: 'ЧР: междометие', [Grammeme.Abbr]: 'ЧР: аббревиатура', [Grammeme.sing]: 'Число: един', [Grammeme.plur]: 'Число: множ', [Grammeme.nomn]: 'Падеж: имен', [Grammeme.gent]: 'Падеж: род', [Grammeme.datv]: 'Падеж: дат', [Grammeme.accs]: 'Падеж: вин', [Grammeme.ablt]: 'Падеж: твор', [Grammeme.loct]: 'Падеж: пред', [Grammeme.masc]: 'Род: муж', [Grammeme.femn]: 'Род: жен', [Grammeme.neut]: 'Род: ср', [Grammeme.perf]: 'Совершенный: да', [Grammeme.impf]: 'Совершенный: нет', [Grammeme.tran]: 'Переходный: да', [Grammeme.intr]: 'Переходный: нет', [Grammeme.pres]: 'Время: настоящее', [Grammeme.past]: 'Время: прошедшее', [Grammeme.futr]: 'Время: будущее', [Grammeme.per1]: 'Лицо: 1', [Grammeme.per2]: 'Лицо: 2', [Grammeme.per3]: 'Лицо: 3', [Grammeme.impr]: 'Повелительный: да', [Grammeme.indc]: 'Повелительный: нет', [Grammeme.incl]: 'Включающий: да', [Grammeme.excl]: 'Включающий: нет', [Grammeme.pssv]: 'Страдательный: да', [Grammeme.actv]: 'Страдательный: нет', [Grammeme.anim]: 'Одушевленный: да', [Grammeme.inan]: 'Одушевленный: нет', [Grammeme.Infr]: 'Стиль: неформальный', [Grammeme.Slng]: 'Стиль: жаргон', [Grammeme.Arch]: 'Стиль: устаревший', [Grammeme.Litr]: 'Стиль: литературный' }; const labelRSExpressionsRecord: Record = { [CstType.NOMINAL]: 'Определяющие конституенты', [CstType.BASE]: 'Формальное определение', [CstType.CONSTANT]: 'Формальное определение', [CstType.STRUCTURED]: 'Область определения', [CstType.TERM]: 'Формальное определение', [CstType.THEOREM]: 'Формальное определение', [CstType.AXIOM]: 'Формальное определение', [CstType.FUNCTION]: 'Определение функции', [CstType.PREDICATE]: 'Определение функции' }; const rsDefinitionPlaceholderRecord: Record = { [CstType.NOMINAL]: 'Например, X1 D1 N1', [CstType.BASE]: 'Не предусмотрено', [CstType.CONSTANT]: 'Не предусмотрено', [CstType.STRUCTURED]: 'Пример: ℬ(X1×D2)', [CstType.TERM]: 'Пример: D{ξ∈S1 | Pr1(ξ)∩Pr2(ξ)=∅}', [CstType.THEOREM]: 'Пример: D11=∅', [CstType.AXIOM]: 'Пример: D11=∅', [CstType.FUNCTION]: 'Пример: [α∈X1, β∈ℬ(X1×X2)] Pr2(Fi1[{α}](β))', [CstType.PREDICATE]: 'Пример: [α∈X1, β∈ℬ(X1)] α∈β & card(β)>1' }; const cstTypeShortcutKeyRecord: Record = { [CstType.BASE]: '1', [CstType.STRUCTURED]: '2', [CstType.TERM]: '3', [CstType.AXIOM]: '4', [CstType.FUNCTION]: 'Q', [CstType.PREDICATE]: 'W', [CstType.CONSTANT]: '5', [CstType.THEOREM]: '6', [CstType.NOMINAL]: '7' }; const labelTokenRecord: Partial> = { [TokenID.BOOLEAN]: 'ℬ()', [TokenID.DECART]: '×', [TokenID.PUNCTUATION_PL]: '( )', [TokenID.PUNCTUATION_SL]: '[ ]', [TokenID.QUANTOR_UNIVERSAL]: '∀', [TokenID.QUANTOR_EXISTS]: '∃', [TokenID.LOGIC_NOT]: '¬', [TokenID.LOGIC_AND]: '&', [TokenID.LOGIC_OR]: '∨', [TokenID.LOGIC_IMPLICATION]: '⇒', [TokenID.LOGIC_EQUIVALENT]: '⇔', [TokenID.LIT_EMPTYSET]: '∅', [TokenID.LIT_WHOLE_NUMBERS]: 'Z', [TokenID.MULTIPLY]: '*', [TokenID.EQUAL]: '=', [TokenID.NOTEQUAL]: '≠', [TokenID.GREATER_OR_EQ]: '≥', [TokenID.LESSER_OR_EQ]: '≤', [TokenID.SET_IN]: '∈', [TokenID.SET_NOT_IN]: '∉', [TokenID.SUBSET_OR_EQ]: '⊆', [TokenID.SUBSET]: '⊂', [TokenID.NOT_SUBSET]: '⊄', [TokenID.SET_INTERSECTION]: '∩', [TokenID.SET_UNION]: '∪', [TokenID.SET_MINUS]: '\\', [TokenID.SET_SYMMETRIC_MINUS]: '∆', [TokenID.NT_DECLARATIVE_EXPR]: 'D{}', [TokenID.NT_IMPERATIVE_EXPR]: 'I{}', [TokenID.NT_RECURSIVE_FULL]: 'R{}', [TokenID.BIGPR]: 'Pr1()', [TokenID.SMALLPR]: 'pr1()', [TokenID.FILTER]: 'Fi1[]()', [TokenID.REDUCE]: 'red()', [TokenID.CARD]: 'card()', [TokenID.BOOL]: 'bool()', [TokenID.DEBOOL]: 'debool()', [TokenID.ASSIGN]: ':=', [TokenID.ITERATE]: ':∈' }; const describeTokenRecord: Partial> = { [TokenID.BOOLEAN]: prepareTooltip('Булеан', 'Alt + E / Shift + B'), [TokenID.DECART]: prepareTooltip('Декартово произведение', 'Alt + Shift + E / Shift + 8'), [TokenID.PUNCTUATION_PL]: prepareTooltip('Скобки () вокруг выражения', 'Alt + Shift + 9'), [TokenID.PUNCTUATION_SL]: prepareTooltip('Скобки [] вокруг выражения', 'Alt + ['), [TokenID.QUANTOR_UNIVERSAL]: prepareTooltip('Квантор всеобщности', '`'), [TokenID.QUANTOR_EXISTS]: prepareTooltip('Квантор существования', 'Shift + `'), [TokenID.LOGIC_NOT]: prepareTooltip('Отрицание', 'Alt + `'), [TokenID.LOGIC_AND]: prepareTooltip('Конъюнкция', 'Alt + 3 ~ Shift + 7'), [TokenID.LOGIC_OR]: prepareTooltip('Дизъюнкция', 'Alt + Shift + 3'), [TokenID.LOGIC_IMPLICATION]: prepareTooltip('Импликация', 'Alt + 4'), [TokenID.LOGIC_EQUIVALENT]: prepareTooltip('Эквивалентность', 'Alt + Shift + 4'), [TokenID.LIT_EMPTYSET]: prepareTooltip('Пустое множество', 'Alt + X'), [TokenID.LIT_WHOLE_NUMBERS]: prepareTooltip('Целые числа', 'Alt + Z'), [TokenID.EQUAL]: prepareTooltip('Равенство'), [TokenID.MULTIPLY]: prepareTooltip('Умножение чисел', 'Alt + 8'), [TokenID.NOTEQUAL]: prepareTooltip('Неравенство', 'Alt + Shift + `'), [TokenID.GREATER_OR_EQ]: prepareTooltip('Больше или равно', 'Alt + Shift + 7'), [TokenID.LESSER_OR_EQ]: prepareTooltip('Меньше или равно', 'Alt + Shift + 8'), [TokenID.SET_IN]: prepareTooltip('Быть элементом (принадлежит)', 'Alt + 1'), [TokenID.SET_NOT_IN]: prepareTooltip('Не принадлежит', 'Alt + Shift + 1'), [TokenID.SUBSET_OR_EQ]: prepareTooltip('Быть частью (нестрогое подмножество)', 'Alt + 2'), [TokenID.SUBSET]: prepareTooltip('Строгое подмножество', 'Alt + 7'), [TokenID.NOT_SUBSET]: prepareTooltip('Не подмножество', 'Alt + Shift + 2'), [TokenID.SET_INTERSECTION]: prepareTooltip('Пересечение', 'Alt + A'), [TokenID.SET_UNION]: prepareTooltip('Объединение', 'Alt + S'), [TokenID.SET_MINUS]: prepareTooltip('Разность множеств', 'Alt + 5'), [TokenID.SET_SYMMETRIC_MINUS]: prepareTooltip('Симметрическая разность', 'Alt + Shift + 5'), [TokenID.NT_DECLARATIVE_EXPR]: prepareTooltip('Декларативное определение', 'Alt + D'), [TokenID.NT_IMPERATIVE_EXPR]: prepareTooltip('Императивное определение', 'Alt + G'), [TokenID.NT_RECURSIVE_FULL]: prepareTooltip('Рекурсивное определение (цикл)', 'Alt + T'), [TokenID.BIGPR]: prepareTooltip('Большая проекция', 'Alt + Q'), [TokenID.SMALLPR]: prepareTooltip('Малая проекция', 'Alt + W'), [TokenID.FILTER]: prepareTooltip('Фильтр', 'Alt + F'), [TokenID.REDUCE]: prepareTooltip('Множество-сумма', 'Alt + R'), [TokenID.CARD]: prepareTooltip('Мощность', 'Alt + C'), [TokenID.BOOL]: prepareTooltip('Синглетон', 'Alt + B'), [TokenID.DEBOOL]: prepareTooltip('Десинглетон', 'Alt + V'), [TokenID.ASSIGN]: prepareTooltip('Присвоение', 'Alt + Shift + 6'), [TokenID.ITERATE]: prepareTooltip('Перебор элементов множества', 'Alt + 6') }; /** * Generates description for {@link IConstituenta}. */ export function describeConstituenta(cst: RO): string { if (cst.cst_type === CstType.STRUCTURED) { return ( cst.term_resolved || cst.term_raw || cst.definition_resolved || cst.definition_raw || cst.convention || cst.definition_formal ); } else { return ( cst.term_resolved || cst.term_raw || cst.definition_resolved || cst.definition_raw || cst.definition_formal || cst.convention ); } } /** * Generates description for term of a given {@link IConstituenta}. */ export function describeConstituentaTerm(cst: RO | null): string { if (!cst) { return '!Конституента отсутствует!'; } if (!cst.term_resolved) { return '!Пустой термин!'; } else { return cst.term_resolved; } } /** * Generates label for {@link IConstituenta}. */ export function labelConstituenta(cst: RO) { return `${cst.alias}: ${describeConstituenta(cst)}`; } /** * Generates label for {@link IVersionInfo} of {@link IRSForm}. */ export function labelVersion(value: CurrentVersion, items: RO) { const version = items.find(ver => ver.id === value); return version ? version.version : 'актуальная'; } /** * Retrieves label for {@link TokenID}. */ export function labelToken(id: TokenID): string { return labelTokenRecord[id] ?? `no label: ${id}`; } /** Return shortcut description for {@link CstType}. */ export function getCstTypeShortcut(type: CstType) { const key = cstTypeShortcutKeyRecord[type]; return key ? `${labelCstType(type)} [Alt + ${key}]` : labelCstType(type); } /** Generates label for RS expression based on {@link CstType}. */ export function labelRSExpression(type: CstType): string { return labelRSExpressionsRecord[type] ?? 'Формальное выражение'; } /** Generates placeholder for RS definition based on {@link CstType}. */ export function getRSDefinitionPlaceholder(type: CstType): string { return rsDefinitionPlaceholderRecord[type] ?? 'Формальное выражение'; } /** * Generates description for {@link TokenID}. */ export function describeToken(id: TokenID): string { return describeTokenRecord[id] ?? `no description: ${id}`; } /** * Retrieves label for {@link CstMatchMode}. */ export function labelCstMatchMode(mode: CstMatchMode): string { return labelCstMatchModeRecord[mode] ?? `UNKNOWN MATCH MODE: ${mode}`; } /** * Retrieves description for {@link CstMatchMode}. */ export function describeCstMatchMode(mode: CstMatchMode): string { return describeCstMatchModeRecord[mode] ?? `UNKNOWN MATCH MODE: ${mode}`; } /** Retrieves label for {@link DependencyMode}. */ export function labelCstSource(mode: DependencyMode): string { return labelCstSourceRecord[mode]; } /** * Retrieves description for {@link DependencyMode}. */ export function describeCstSource(mode: DependencyMode): string { return describeCstSourceRecord[mode] ?? `UNKNOWN DEPENDENCY MODE: ${mode}`; } /** Retrieves label for {@link GraphColoring}. */ export function labelColoring(mode: GraphColoring): string { return labelColoringRecord[mode] ?? `UNKNOWN COLORING: ${mode}`; } /** Retrieves label for {@link GraphType}. */ export function labelGraphType(mode: GraphType): string { return labelGraphTypeRecord[mode] ?? `UNKNOWN GRAPH TYPE: ${mode}`; } /** * Retrieves label for {@link ExpressionStatus}. */ export function labelExpressionStatus(status: ExpressionStatus): string { return labelExpressionStatusRecord[status] ?? `UNKNOWN EXPRESSION STATUS: ${status}`; } /** * Retrieves description for {@link ExpressionStatus}. */ export function describeExpressionStatus(status: ExpressionStatus): string { return describeExpressionStatusRecord[status] ?? `UNKNOWN EXPRESSION STATUS: ${status}`; } /** * Retrieves label for {@link CstType}. */ export function labelCstType(target: CstType): string { return labelCstTypeRecord[target] ?? `UNKNOWN CST TYPE: ${target}`; } /** * Retrieves label for {@link ReferenceType}. */ export function labelReferenceType(target: ReferenceType): string { return labelReferenceTypeRecord[target] ?? `UNKNOWN REFERENCE TYPE: ${target}`; } /** * Retrieves label for {@link CstClass}. */ export function labelCstClass(target: CstClass): string { return labelCstClassRecord[target] ?? `UNKNOWN CST CLASS: ${target}`; } /** * Retrieves description for {@link CstClass}. */ export function describeCstClass(target: CstClass): string { return describeCstClassRecord[target] ?? `UNKNOWN CST CLASS: ${target}`; } /** * Generates label for typification. */ export function labelTypification({ isValid, resultType, args }: { isValid: boolean; resultType: string; args: RO; }): string { if (!isValid) { return 'N/A'; } if (resultType === '' || resultType === PARAMETER.logicLabel) { resultType = 'Logical'; } if (args.length === 0) { return resultType; } const argsText = args.map(arg => arg.typification).join(', '); return `[${argsText}] 🠖 ${resultType}`; } /** * Generates label for {@link IConstituenta} typification. */ export function labelCstTypification(cst: RO): string { if (!cst.parse) { return 'N/A'; } return labelTypification({ isValid: cst.parse.status === ParsingStatus.VERIFIED, resultType: cst.parse.typification, args: cst.parse.args }); } /** * Generates label for grammeme. */ export function labelGrammeme(gram: Grammeme): string { return labelGrammemeRecord[gram] ?? `Неизв: ${gram as string}`; } /** * Generates label for {@link ISyntaxTreeNode}. */ export function labelSyntaxTree(node: RO): string { // prettier-ignore switch (node.typeID) { case TokenID.ID_LOCAL: case TokenID.ID_GLOBAL: case TokenID.ID_FUNCTION: case TokenID.ID_PREDICATE: case TokenID.ID_RADICAL: return node.data.value as string; case TokenID.LIT_INTEGER: return String(node.data.value as number); case TokenID.BIGPR: return 'Pr' + (node.data.value as string[]).toString(); case TokenID.SMALLPR: return 'pr' + (node.data.value as string[]).toString(); case TokenID.FILTER: return 'Fi' + (node.data.value as string[]).toString(); case TokenID.PLUS: return '+'; case TokenID.MINUS: return '-'; case TokenID.MULTIPLY: return '*'; case TokenID.GREATER: return '>'; case TokenID.LESSER: return '<'; case TokenID.NT_TUPLE: return 'TUPLE'; case TokenID.NT_ENUMERATION: return 'ENUM'; case TokenID.NT_ENUM_DECL: return 'ENUM_DECLARE'; case TokenID.NT_TUPLE_DECL: return 'TUPLE_DECLARE'; case TokenID.PUNCTUATION_DEFINE: return 'DEFINITION'; case TokenID.PUNCTUATION_STRUCT: return 'STRUCTURE_DEFINE'; case TokenID.NT_ARG_DECL: return 'ARG'; case TokenID.NT_FUNC_CALL: return 'CALL'; case TokenID.NT_ARGUMENTS: return 'ARGS'; case TokenID.NT_FUNC_DEFINITION: return 'FUNCTION_DEFINE'; case TokenID.NT_RECURSIVE_SHORT: return labelToken(TokenID.NT_RECURSIVE_FULL); case TokenID.BOOLEAN: case TokenID.DECART: case TokenID.QUANTOR_UNIVERSAL: case TokenID.QUANTOR_EXISTS: case TokenID.LOGIC_NOT: case TokenID.LOGIC_AND: case TokenID.LOGIC_OR: case TokenID.LOGIC_IMPLICATION: case TokenID.LOGIC_EQUIVALENT: case TokenID.LIT_EMPTYSET: case TokenID.LIT_WHOLE_NUMBERS: case TokenID.EQUAL: case TokenID.NOTEQUAL: case TokenID.GREATER_OR_EQ: case TokenID.LESSER_OR_EQ: case TokenID.SET_IN: case TokenID.SET_NOT_IN: case TokenID.SUBSET_OR_EQ: case TokenID.SUBSET: case TokenID.NOT_SUBSET: case TokenID.SET_INTERSECTION: case TokenID.SET_UNION: case TokenID.SET_MINUS: case TokenID.SET_SYMMETRIC_MINUS: case TokenID.NT_DECLARATIVE_EXPR: case TokenID.NT_IMPERATIVE_EXPR: case TokenID.NT_RECURSIVE_FULL: case TokenID.REDUCE: case TokenID.CARD: case TokenID.BOOL: case TokenID.DEBOOL: case TokenID.ASSIGN: case TokenID.ITERATE: return labelToken(node.typeID); } if (node.data.value) { return node.data.value as string; } return 'UNKNOWN ' + String(node.typeID); } /** * Generates error description for {@link IRSErrorDescription}. */ export function describeRSError(error: RO): string { // prettier-ignore switch (error.errorType) { case RSErrorType.unknownSymbol: return `Неизвестный символ: ${error.params[0]}`; case RSErrorType.syntax: return 'Неопределенная синтаксическая ошибка'; case RSErrorType.missingParenthesis: return 'Некорректная конструкция языка родов структур, проверьте структуру выражения'; case RSErrorType.missingCurlyBrace: return "Пропущен символ '}'"; case RSErrorType.invalidQuantifier: return 'Некорректная кванторная декларация'; case RSErrorType.invalidImperative: return 'Использование императивного синтаксиса вне императивного блока'; case RSErrorType.expectedArgDeclaration: return 'Ожидалось объявление аргументов терм-функции'; case RSErrorType.expectedLocal: return 'Ожидалось имя локальной переменной'; case RSErrorType.localDoubleDeclare: return `Предупреждение! Повторное объявление локальной переменной ${error.params[0]}`; case RSErrorType.localNotUsed: return `Предупреждение! Переменная объявлена, но не использована: ${error.params[0]}`; case RSErrorType.localUndeclared: return `Использование необъявленной переменной: ${error.params[0]}`; case RSErrorType.localShadowing: return `Повторное объявление переменной: ${error.params[0]}`; case RSErrorType.typesNotEqual: return `Типизация операндов не совпадает! ${error.params[0]} != ${error.params[1]}`; case RSErrorType.globalNotTyped: return `Типизация конституенты не определена: ${error.params[0]}`; case RSErrorType.invalidDecart: return `τ(α×b) = 𝔅(𝔇τ(α)×𝔇τ(b)). Некорректная типизация аргумента: ${error.params[0]}`; case RSErrorType.invalidBoolean: return `τ(ℬ(a)) = 𝔅𝔅𝔇τ(a). Некорректная типизация аргумента: ${error.params[0]}`; case RSErrorType.invalidTypeOperation: return `Типизация операнда теоретико-множественной операции не корректна: ${error.params[0]}`; case RSErrorType.invalidCard: return `Некорректная типизация аргумента операции мощности: ${error.params[0]}`; case RSErrorType.invalidDebool: return `τ(debool(a)) = 𝔇τ(a). Некорректная типизация аргумента: ${error.params[0]}`; case RSErrorType.globalFuncMissing: return `Неизвестное имя функции: ${error.params[0]}`; case RSErrorType.globalFuncWithoutArgs: return `Некорректное использование имени функции без аргументов: ${error.params[0]}`; case RSErrorType.invalidReduce: return `τ(red(a)) = 𝔅𝔇𝔇τ(a). Некорректная типизация аргумента: ${error.params[0]}`; case RSErrorType.invalidProjectionTuple: return `Проекция не определена: ${error.params[0]} -> ${error.params[1]}`; case RSErrorType.invalidProjectionSet: return `τ(Pri(a)) = 𝔅𝒞i𝔇τ(a). Некорректная типизация аргумента: ${error.params[0]} -> ${error.params[1]}`; case RSErrorType.invalidEnumeration: return `Типизация элементов перечисления не совпадает: ${error.params[0]} != ${error.params[1]}`; case RSErrorType.invalidBinding: return `Количество переменных в кортеже не соответствует размерности декартова произведения`; case RSErrorType.localOutOfScope: return `Использование имени переменной вне области действия: ${error.params[0]}`; case RSErrorType.invalidElementPredicate: return `Несоответствие типизаций операндов для оператора: ${error.params[0]}${error.params[1]}${error.params[2]}`; case RSErrorType.invalidEmptySetUsage: return 'Бессмысленное использование пустого множества'; case RSErrorType.invalidArgsArity: return `Неверное число аргументов терм-функции: ${error.params[0]} != ${error.params[1]}`; case RSErrorType.invalidArgumentType: return `Типизация аргумента терм-функции не соответствует объявленной: ${error.params[0]} != ${error.params[1]}`; case RSErrorType.globalStructure: return `Область определения родовой структуры не корректна`; case RSErrorType.radicalUsage: return `Радикалы запрещены вне деклараций терм-функции: ${error.params[0]}`; case RSErrorType.invalidFilterArgumentType: return `Типизация аргумента фильтра не корректна: ${error.params[0]}(${error.params[1]})`; case RSErrorType.invalidFilterArity: return `Количество параметров фильтра не соответствует количеству индексов`; case RSErrorType.arithmeticNotSupported: return `Тип не поддерживает арифметические операторы: ${error.params[0]}`; case RSErrorType.typesNotCompatible: return `Типы не совместимы для выбранной операции: ${error.params[0]} и ${error.params[1]}`; case RSErrorType.orderingNotSupported: return `Тип не поддерживает предикаты порядка: ${error.params[0]}`; case RSErrorType.globalNoValue: return `Используется неинтерпретируемый глобальный идентификатор: ${error.params[0]}`; case RSErrorType.invalidPropertyUsage: return `Использование неитерируемого множества в качестве значения`; case RSErrorType.globalMissingAST: return `Не удалось получить дерево разбора для глобального идентификатора: ${error.params[0]}`; case RSErrorType.globalFuncNoInterpretation: return 'Функция не интерпретируется для данных аргументов'; case RSErrorType.cstNonemptyBase: return 'Непустое выражение базисного/константного множества'; case RSErrorType.cstEmptyDerived: return 'Пустое выражение для сложного понятия или утверждения'; case RSErrorType.cstCallableNoArgs: return 'Отсутствуют аргументы для параметризованной конституенты'; case RSErrorType.cstNonCallableHasArgs: return 'Параметризованное выражение не подходит для данного типа конституенты'; case RSErrorType.cstExpectedLogical: return 'Данный тип конституенты требует логического выражения'; case RSErrorType.cstExpectedTyped: return 'Данный тип конституенты требует теоретико-множественного выражения'; } return 'UNKNOWN ERROR'; }