2023-07-26 23:11:00 +03:00
|
|
|
|
//! RS language token types enumeration
|
|
|
|
|
export enum TokenID {
|
|
|
|
|
// Global, local IDs and literals
|
|
|
|
|
ID_LOCAL = 258,
|
|
|
|
|
ID_GLOBAL,
|
|
|
|
|
ID_FUNCTION,
|
|
|
|
|
ID_PREDICATE,
|
|
|
|
|
ID_RADICAL,
|
|
|
|
|
LIT_INTEGER,
|
|
|
|
|
LIT_INTSET,
|
|
|
|
|
LIT_EMPTYSET,
|
|
|
|
|
|
|
|
|
|
// Aithmetic
|
|
|
|
|
PLUS,
|
|
|
|
|
MINUS,
|
|
|
|
|
MULTIPLY,
|
|
|
|
|
|
|
|
|
|
// Integer predicate symbols
|
|
|
|
|
GREATER,
|
|
|
|
|
LESSER,
|
|
|
|
|
GREATER_OR_EQ,
|
|
|
|
|
LESSER_OR_EQ,
|
|
|
|
|
|
|
|
|
|
// Equality comparison
|
|
|
|
|
EQUAL,
|
|
|
|
|
NOTEQUAL,
|
|
|
|
|
|
|
|
|
|
// Logic predicate symbols
|
|
|
|
|
FORALL,
|
|
|
|
|
EXISTS,
|
|
|
|
|
NOT,
|
|
|
|
|
EQUIVALENT,
|
|
|
|
|
IMPLICATION,
|
|
|
|
|
OR,
|
|
|
|
|
AND,
|
|
|
|
|
|
|
|
|
|
// Set theory predicate symbols
|
|
|
|
|
IN,
|
|
|
|
|
NOTIN,
|
|
|
|
|
SUBSET,
|
|
|
|
|
SUBSET_OR_EQ,
|
|
|
|
|
NOTSUBSET,
|
|
|
|
|
|
|
|
|
|
// Set theory operators
|
|
|
|
|
DECART,
|
|
|
|
|
UNION,
|
|
|
|
|
INTERSECTION,
|
|
|
|
|
SET_MINUS,
|
|
|
|
|
SYMMINUS,
|
|
|
|
|
BOOLEAN,
|
|
|
|
|
|
|
|
|
|
// Structure operations
|
|
|
|
|
BIGPR,
|
|
|
|
|
SMALLPR,
|
|
|
|
|
FILTER,
|
|
|
|
|
CARD,
|
|
|
|
|
BOOL,
|
|
|
|
|
DEBOOL,
|
|
|
|
|
REDUCE,
|
|
|
|
|
|
|
|
|
|
// Term constructions prefixes
|
|
|
|
|
DECLARATIVE,
|
|
|
|
|
RECURSIVE,
|
|
|
|
|
IMPERATIVE,
|
|
|
|
|
|
|
|
|
|
// Punctuation
|
|
|
|
|
PUNC_DEFINE,
|
|
|
|
|
PUNC_STRUCT,
|
|
|
|
|
PUNC_ASSIGN,
|
|
|
|
|
PUNC_ITERATE,
|
|
|
|
|
PUNC_PL,
|
|
|
|
|
PUNC_PR,
|
|
|
|
|
PUNC_CL,
|
|
|
|
|
PUNC_CR,
|
|
|
|
|
PUNC_SL,
|
|
|
|
|
PUNC_SR,
|
|
|
|
|
PUNC_BAR,
|
|
|
|
|
PUNC_COMMA,
|
|
|
|
|
PUNC_SEMICOLON,
|
|
|
|
|
|
|
|
|
|
// ======= Non-terminal tokens =========
|
|
|
|
|
NT_ENUM_DECL, // Перечисление переменных в кванторной декларации
|
|
|
|
|
NT_TUPLE, // Кортеж (a,b,c), типизация B(T(a)xT(b)xT(c))
|
|
|
|
|
NT_ENUMERATION, // Задание множества перечислением
|
|
|
|
|
NT_TUPLE_DECL, // Декларация переменных с помощью кортежа
|
|
|
|
|
NT_ARG_DECL, // Объявление аргумента
|
|
|
|
|
|
|
|
|
|
NT_FUNC_DEFINITION, // Определение функции
|
|
|
|
|
NT_ARGUMENTS, // Задание аргументов функции
|
|
|
|
|
NT_FUNC_CALL, // Вызов функции
|
|
|
|
|
|
|
|
|
|
NT_DECLARATIVE_EXPR, // Задание множества с помощью выражения D{x из H | A(x) }
|
|
|
|
|
NT_IMPERATIVE_EXPR, // Императивное определение
|
|
|
|
|
NT_RECURSIVE_FULL, // Полная рекурсия
|
|
|
|
|
NT_RECURSIVE_SHORT, // Сокращенная рекурсия
|
|
|
|
|
|
|
|
|
|
NT_IMP_DECLARE, // Блок декларации
|
|
|
|
|
NT_IMP_ASSIGN, // Блок присвоения
|
|
|
|
|
NT_IMP_LOGIC, // Блок проверки
|
|
|
|
|
|
|
|
|
|
// ======= Helper tokens ========
|
|
|
|
|
INTERRUPT,
|
|
|
|
|
END,
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-29 03:31:21 +03:00
|
|
|
|
export enum RSErrorClass {
|
|
|
|
|
LEXER,
|
|
|
|
|
PARSER,
|
|
|
|
|
SEMANTIC,
|
|
|
|
|
UNKNOWN
|
|
|
|
|
}
|
2023-07-26 23:11:00 +03:00
|
|
|
|
|
2023-07-29 03:31:21 +03:00
|
|
|
|
export enum RSErrorType {
|
|
|
|
|
syntax = 0x8400, // Неизвестная синтаксическая ошибка
|
|
|
|
|
missingParanthesis = 0x8406, // Пропущена скобка ')'
|
|
|
|
|
missingCurlyBrace = 0x8407, // Пропущена скобка '}'
|
|
|
|
|
invalidQuantifier = 0x8408, // Некорректная кванторная декларация
|
|
|
|
|
expectedArgDeclaration = 0x8414, // Ожидалось объявление аргументов
|
|
|
|
|
expectedLocal = 0x8415, // Ожидалось имя локальной переменной
|
|
|
|
|
localDoubleDeclare = 0x2801, // Повторное использование одного и того же имени переменной
|
|
|
|
|
localNotUsed = 0x2802, // Переменная объявлена но не использована
|
|
|
|
|
|
|
|
|
|
localUndeclared = 0x8801, // Использование необъявленной переменной
|
|
|
|
|
localShadowing = 0x8802, // Повторное объявление переменной
|
|
|
|
|
|
|
|
|
|
typesNotEqual = 0x8803, // Некорректное использование операций
|
|
|
|
|
globalNotTyped = 0x8804, // Не определена типизация глобальной конституенты
|
|
|
|
|
invalidDecart = 0x8805, // Одна из проекций не является множеством
|
|
|
|
|
invalidBoolean = 0x8806, // Попытка взять булеан от элемента, не имеющего характер множества
|
|
|
|
|
invalidTypeOperation = 0x8807, // Применение ТМО к операндам, не имеющим характер множества
|
|
|
|
|
invalidCard = 0x8808, // Мощность множества не определена для элемента
|
|
|
|
|
invalidDebool = 0x8809, // Дебулеан берется от немножества
|
|
|
|
|
globalFuncMissing = 0x880A, // Неизвестное имя функции
|
|
|
|
|
globalFuncWithoutArgs = 0x880B, // Некорректное использование имени функции без аргументов
|
|
|
|
|
invalidReduce = 0x8810, // Red можно брать только от двойного булеана
|
|
|
|
|
invalidProjectionTuple = 0x8811, // Не определена проекция
|
|
|
|
|
invalidProjectionSet = 0x8812, // Большая проекция определена только для множеств!
|
|
|
|
|
invalidEnumeration = 0x8813, // Типизация аргументов перечисления не совпадает
|
|
|
|
|
ivalidBinding = 0x8814, // Количество переменных в кортеже не соответствует размерности декартова произведения
|
|
|
|
|
localOutOfScope = 0x8815, // Использование имени вне области видимости
|
|
|
|
|
invalidElementPredicat = 0x8816, // Несоответствие типов для проверки принадлежности
|
|
|
|
|
invalidArgsArtity = 0x8818, // Некорректное количество аргументов терм-функции
|
|
|
|
|
invalidArgumentType = 0x8819, // Типизация аргумента не совпадает с объявленной
|
|
|
|
|
invalidEqualsEmpty = 0x881A, // Сравнение с пустым множеством не множества
|
|
|
|
|
globalStructure = 0x881C, // Родовая структура должна быть ступенью
|
|
|
|
|
globalExpectedFunction = 0x881F, // Ожидалось выражение объявления функции
|
|
|
|
|
emptySetUsage = 0x8820, // Некорректное использование пустого множества как типизированного выражения
|
|
|
|
|
radicalUsage = 0x8821, // Радикалы запрещены вне деклараций терм-функций
|
|
|
|
|
invalidFilterArgumentType = 0x8822, // Типизация аргумента фильтра не корректна
|
|
|
|
|
invalidFilterArity = 0x8823, // Количество параметров фильра не соответствует количеству индексов
|
|
|
|
|
arithmeticNotSupported = 0x8824, // Для данного типа не поддерживается арифметика
|
|
|
|
|
typesNotCompatible = 0x8825, // Типы не совместимы в данном контексте
|
|
|
|
|
orderingNotSupported = 0x8826, // Для данного типа не поддерживается порядок элементов
|
|
|
|
|
|
2023-08-22 22:38:27 +03:00
|
|
|
|
// !!!! Добавлены по сравнению с ConceptCore !!!!!
|
|
|
|
|
globalNonemptyBase = 0x8827, // Непустое выражение базисного/константного множества
|
|
|
|
|
globalUnexpectedType = 0x8828, // Типизация выражения не соответствует типу конституенты
|
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
2023-07-29 03:31:21 +03:00
|
|
|
|
globalNoValue = 0x8840, // Используется неинтерпретируемый глобальный идентификатор
|
|
|
|
|
invalidPropertyUsage = 0x8841, // Использование свойства в качестве значения
|
|
|
|
|
globalMissingAST = 0x8842, // Не удалось получить дерево разбора для глобального идентификатора
|
|
|
|
|
globalFuncNoInterpretation = 0x8843, // Функция не интерпретируется для данных аргументов
|
2023-07-26 23:11:00 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-29 03:31:21 +03:00
|
|
|
|
const ERRCODE_LEXER_MASK = 0x0200;
|
|
|
|
|
const ERRCODE_PARSER_MASK = 0x0400;
|
|
|
|
|
const ERRCODE_TYPE_MASK = 0x0800;
|
|
|
|
|
export function resolveErrorClass(error: RSErrorType): RSErrorClass {
|
2023-08-22 20:29:07 +03:00
|
|
|
|
if ((error & ERRCODE_LEXER_MASK) !== 0) {
|
2023-07-29 03:31:21 +03:00
|
|
|
|
return RSErrorClass.LEXER;
|
2023-08-22 20:29:07 +03:00
|
|
|
|
} else if ((error & ERRCODE_PARSER_MASK) !== 0) {
|
2023-07-29 03:31:21 +03:00
|
|
|
|
return RSErrorClass.PARSER;
|
2023-08-22 20:29:07 +03:00
|
|
|
|
} else if ((error & ERRCODE_TYPE_MASK) !== 0) {
|
2023-07-29 03:31:21 +03:00
|
|
|
|
return RSErrorClass.SEMANTIC;
|
|
|
|
|
} else {
|
|
|
|
|
return RSErrorClass.UNKNOWN;
|
|
|
|
|
}
|
|
|
|
|
}
|