Files
kolibrios/programs/develop/oberon07/Source/ERRORS.ob07
T
Anton Krotov b6bb3d2c62 Oberon07: some extensions
git-svn-id: svn://kolibrios.org@7107 a494cfbc-eb01-0410-851d-a64ba20cac60
2017-11-02 16:36:50 +00:00

285 lines
10 KiB
Plaintext

(*
Copyright 2016, 2017 Anton Krotov
This file is part of Compiler.
Compiler is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Compiler is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Compiler. If not, see <http://www.gnu.org/licenses/>.
*)
MODULE ERRORS;
IMPORT H := HOST;
TYPE
STRING = ARRAY 1024 OF CHAR;
CP = ARRAY 256 OF INTEGER;
VAR
cp: CP;
PROCEDURE utf8(code: INTEGER; VAR uchar: STRING);
BEGIN
uchar[0] := 0X;
IF code < 80H THEN
uchar[0] := CHR(code);
uchar[1] := 0X
ELSIF code < 800H THEN
uchar[1] := CHR(ROR(LSL(code, 26), 26) + 80H);
uchar[0] := CHR(ASR(code, 6) + 0C0H);
uchar[2] := 0X
ELSIF code < 10000H THEN
uchar[2] := CHR(ROR(LSL(code, 26), 26) + 80H);
code := ASR(code, 6);
uchar[1] := CHR(ROR(LSL(code, 26), 26) + 80H);
uchar[0] := CHR(ASR(code, 6) + 0E0H);
uchar[3] := 0X
(*
ELSIF code < 200000H THEN
ELSIF code < 4000000H THEN
ELSE *)
END
END utf8;
PROCEDURE InitCP(VAR cp: CP);
VAR i: INTEGER;
BEGIN
FOR i := 0H TO 7FH DO
cp[i] := i
END
END InitCP;
PROCEDURE Init8(VAR cp: CP; VAR n: INTEGER; a, b, c, d, e, f, g, h: INTEGER);
BEGIN
cp[n] := a; INC(n);
cp[n] := b; INC(n);
cp[n] := c; INC(n);
cp[n] := d; INC(n);
cp[n] := e; INC(n);
cp[n] := f; INC(n);
cp[n] := g; INC(n);
cp[n] := h; INC(n);
END Init8;
PROCEDURE InitCP866(VAR cp: CP);
VAR n, i: INTEGER;
BEGIN
FOR i := 0410H TO 043FH DO
cp[i - 0410H + 80H] := i
END;
FOR i := 0440H TO 044FH DO
cp[i - 0440H + 0E0H] := i
END;
n := 0B0H;
Init8(cp, n, 2591H, 2592H, 2593H, 2502H, 2524H, 2561H, 2562H, 2556H);
Init8(cp, n, 2555H, 2563H, 2551H, 2557H, 255DH, 255CH, 255BH, 2510H);
Init8(cp, n, 2514H, 2534H, 252CH, 251CH, 2500H, 253CH, 255EH, 255FH);
Init8(cp, n, 255AH, 2554H, 2569H, 2566H, 2560H, 2550H, 256CH, 2567H);
Init8(cp, n, 2568H, 2564H, 2565H, 2559H, 2558H, 2552H, 2553H, 256BH);
Init8(cp, n, 256AH, 2518H, 250CH, 2588H, 2584H, 258CH, 2590H, 2580H);
n := 0F0H;
Init8(cp, n, 0401H, 0451H, 0404H, 0454H, 0407H, 0457H, 040EH, 045EH);
Init8(cp, n, 00B0H, 2219H, 00B7H, 221AH, 2116H, 00A4H, 25A0H, 00A0H);
InitCP(cp)
END InitCP866;
PROCEDURE concat(VAR L: STRING; R: STRING);
VAR i, n, pos: INTEGER;
BEGIN
n := LENGTH(R);
i := 0;
pos := LENGTH(L);
WHILE (i <= n) & (pos < LEN(L)) DO
L[pos] := R[i];
INC(pos);
INC(i)
END
END concat;
PROCEDURE Utf8(VAR str: STRING);
VAR i: INTEGER; in, out, u: STRING;
BEGIN
in := str;
out := "";
FOR i := 0 TO LENGTH(in) - 1 DO
utf8(cp[ORD(in[i])], u);
concat(out, u)
END;
str := out
END Utf8;
PROCEDURE ErrorMsg*(code: INTEGER; VAR msg: ARRAY OF CHAR);
VAR str: STRING;
BEGIN
CASE code OF
| 1: str := "ожидалась 'H' или 'X'"
| 2: str := "ожидалась цифра"
| 3: str := "строка не содержит закрывающей кавычки"
| 4: str := "недопустимый символ"
| 5: str := "целочисленное переполнение"
| 6: str := "слишком большое значение символьной константы"
| 7: str := "вещественное переполнение"
| 8: str := "переполнение порядка вещественного числа"
| 9: str := "вещественное антипереполнение"
| 10: str := "слишком длинный идентификатор"
| 11: str := "слишком длинная строковая константа"
| 21: str := "ожидалось 'MODULE'"
| 22: str := "ожидался идентификатор"
| 23: str := "ожидалась ';'"
| 24: str := "ожидалось 'END'"
| 25: str := "ожидалась '.'"
| 26: str := "идентификатор не совпадает с именем модуля"
| 27: str := "неожиданный конец файла"
| 28: str := "ожидалась ',', ';' или ':='"
| 29: str := "ожидалась ',' или ';'"
| 30: str := "идентификатор переопределен"
| 31: str := "циклический импорт"
| 32: str := "модуль не найден или ошибка доступа"
| 33: str := "имя модуля не совпадает с именем файла модуля"
| 34: str := "неправильный формат строки машинных кодов"
| 35: str := "ожидалось '='"
| 36: str := "синтаксическая ошибка в выражении"
| 37: str := "операция не применима"
| 38: str := "ожидалась ')'"
| 39: str := "ожидалoсь 'ARRAY', 'RECORD', 'POINTER' или 'PROCEDURE'"
| 40: str := "ожидалoсь 'TO'"
| 41: str := "ожидалoсь 'OF'"
| 42: str := "неопределенный идентификатор"
| 43: str := "требуется переменная, процедура или строковая константа"
| 44: str := "ожидалoсь 'cdecl', 'stdcall' или 'winapi'"
| 45: str := "флаг вызова недопускается для локальных процедур"
| 46: str := "деление на нуль"
| 47: str := "требуется идентификатор типа-записи или типа-указателя"
| 48: str := "целочисленное деление на нуль"
| 49: str := "значение левого операнда вне диапазона 0..31"
| 50: str := "флаг [winapi] доступен только для платформы Windows"
| 51: str := "ожидалась '}'"
| 52: str := "требуется выражение типа INTEGER"
| 53: str := "значение выражения вне диапазона 0..31"
| 54: str := "левая граница диапазона больше правой"
| 55: str := "требуется константа типа CHAR"
| 56: str := "ожидалась '('"
| 57: str := "требуется выражение числового типа"
| 59: str := "недостаточно параметров"
| 60: str := "недопустимый параметр"
| 61: str := "ожидалась ','"
| 62: str := "требуется константное выражение"
| 63: str := "требуется переменная"
| 64: str := "файл не найден или ошибка доступа"
| 65: str := "модуль RTL не найден"
| 66: str := "требуется выражение типа REAL или LONGREAL"
| 67: str := "невозможно создать файл, возможно файл открыт или диск защищен от записи"
| 68: str := "требуется выражение типа CHAR, SET или BOOLEAN"
| 69: str := "невозможно записать файл"
| 70: str := "требуется выражение типа LONGREAL"
| 71: str := "требуется выражение типа REAL"
| 72: str := "недостаточно памяти для завершения компиляции"
| 73: str := "процедура не возвращающая результат недопустима в выражениях"
| 74: str := "значение выражения вне целочисленного диапазона"
| 75: str := "рекурсивное определение константы"
| 76: str := "значение выражения вне диапазона 0..255"
| 77: str := "ожидался идентификатор типа"
| 78: str := "длина типа-массива должна быть больше нуля"
| 79: str := "ожидалось 'OF' или ','"
| 80: str := "ожидался идентификатор типа-записи или типа-указателя"
| 81: str := "базовый тип типа-указателя должен быть записью"
| 82: str := "тип результата процедуры не может быть записью или массивом"
| 83: str := "размер типа слишком велик"
| 84: str := "ожидался идентификатор или 'VAR'"
| 85: str := "ожидалась ',' или ':'"
| 86: str := "ожидалось 'END' или ';'"
| 87: str := "идентификатор не совпадает с именем процедуры"
| 89: str := "экспорт локального идентификатора недопустим"
| 90: str := "тип ARRAY или RECORD недопустим"
| 91: str := "требуется идентификатор вещественного типа"
| 93: str := "размер данных слишком велик"
| 94: str := "строка длины, отличной от 1 недопустима"
| 95: str := "значение выражения должно быть в диапазоне 0..127"
| 96: str := "недопустимое рекурсивное определение типа"
| 97: str := "недостаточно вещественных регистров, упростите выражение"
| 98: str := "ожидалось 'THEN'"
| 99: str := "поле записи не найдено"
|100: str := "метка дублирована"
|101: str := "идентификатор типа недопустим в выражениях"
|102: str := "требуется массив"
|103: str := "ожидалoсь 'union' или 'noalign'"
|104: str := "требуется указатель"
|105: str := "требуется запись"
|106: str := "требуется идентификатор типа-записи"
|107: str := "требуется идентификатор типа-указателя"
|108: str := "недопустимая охрана типа"
|109: str := "ожидалась ']'"
|110: str := "размерность открытого массива слишком велика"
|111: str := "системные флаги требуют импорта модуля SYSTEM"
|112: str := "расширение записи не может быть [noalign] или [union]"
|113: str := "базовый тип записи не может быть [noalign] или [union]"
|114: str := "несовместимый параметр"
|115: str := "переменная доступна только для чтения"
|116: str := "нельзя использовать локальную процедуру"
|117: str := "требуется выражение типа BOOLEAN"
|118: str := "ожидалось 'DO'"
|119: str := "ожидалось 'UNTIL'"
|120: str := "ожидалось ':='"
|121: str := "расширение имени файла главного модуля должно быть 'ob07'"
|122: str := "значение выражения не может быть равным нулю"
|123: str := "'RETURN' недопустим в процедуре, не возвращающей результат"
|124: str := "ожидалось 'RETURN'"
|125: str := "тип выражения не соответствует типу результата процедуры"
|126: str := "требуется идентификатор переменной"
|127: str := "счетчик цикла FOR не должен быть параметром"
|128: str := "тип переменной должен быть INTEGER"
|129: str := "переменная должна быть локальной"
|130: str := "нельзя использовать константу"
|131: str := "несовместимость по присваиванию"
|132: str := "вызов процедуры-функции допускается только в составе выражения"
|133: str := "идентификаторы 'lib_init' и 'version' зарезервированы"
|138: str := "тип переменной должен быть SET"
|141: str := "требуется строка или символьный массив"
|143: str := "требуется символьный массив"
|145: str := "тип переменной должен быть POINTER"
|149: str := "тип переменной должен быть REAL или LONGREAL"
|150: str := "требуется строковая константа"
|155: str := "ожидалась '(' или ':='"
|156: str := "требуется выражение типа INTEGER или CHAR"
|157: str := "ожидалась ':'"
|158: str := "не найдена процедура в модуле RTL"
|159: str := "нарушение границ массива"
|160: str := "ожидался идентификатор константы"
|161: str := "требуется константа типа INTEGER"
END;
IF H.OS = "LNX" THEN
Utf8(str)
END;
COPY(str, msg)
END ErrorMsg;
BEGIN
InitCP866(cp)
END ERRORS.