Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6613 leency 1
(*
7107 akron1 2
    Copyright 2016, 2017 Anton Krotov
6613 leency 3
 
4
    This file is part of Compiler.
5
 
6
    Compiler is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    Compiler is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with Compiler. If not, see .
18
*)
19
 
20
MODULE ERRORS;
21
 
22
IMPORT H := HOST;
23
 
24
TYPE
25
 
26
  STRING = ARRAY 1024 OF CHAR;
27
 
28
  CP = ARRAY 256 OF INTEGER;
29
 
30
VAR
31
 
32
  cp: CP;
33
 
34
 
35
PROCEDURE utf8(code: INTEGER; VAR uchar: STRING);
36
BEGIN
37
  uchar[0] := 0X;
38
  IF code < 80H THEN
39
    uchar[0] := CHR(code);
40
    uchar[1] := 0X
41
  ELSIF code < 800H THEN
42
    uchar[1] := CHR(ROR(LSL(code, 26), 26) + 80H);
43
    uchar[0] := CHR(ASR(code, 6) + 0C0H);
44
    uchar[2] := 0X
45
  ELSIF code < 10000H THEN
46
    uchar[2] := CHR(ROR(LSL(code, 26), 26) + 80H);
47
    code := ASR(code, 6);
48
    uchar[1] := CHR(ROR(LSL(code, 26), 26) + 80H);
49
    uchar[0] := CHR(ASR(code, 6) + 0E0H);
50
    uchar[3] := 0X
51
(*
52
  ELSIF code < 200000H THEN
53
  ELSIF code < 4000000H THEN
54
  ELSE	*)
55
  END
56
END utf8;
57
 
58
PROCEDURE InitCP(VAR cp: CP);
59
VAR i: INTEGER;
60
BEGIN
61
   FOR i := 0H TO 7FH DO
62
     cp[i] := i
63
   END
64
END InitCP;
65
 
66
PROCEDURE Init8(VAR cp: CP; VAR n: INTEGER; a, b, c, d, e, f, g, h: INTEGER);
67
BEGIN
68
  cp[n] := a; INC(n);
69
  cp[n] := b; INC(n);
70
  cp[n] := c; INC(n);
71
  cp[n] := d; INC(n);
72
  cp[n] := e; INC(n);
73
  cp[n] := f; INC(n);
74
  cp[n] := g; INC(n);
75
  cp[n] := h; INC(n);
76
END Init8;
77
 
78
PROCEDURE InitCP866(VAR cp: CP);
79
VAR n, i: INTEGER;
80
BEGIN
81
   FOR i := 0410H TO 043FH DO
82
     cp[i - 0410H + 80H] := i
83
   END;
84
   FOR i := 0440H TO 044FH DO
85
     cp[i - 0440H + 0E0H] := i
86
   END;
87
 
88
   n := 0B0H;
89
   Init8(cp, n, 2591H, 2592H, 2593H, 2502H, 2524H, 2561H, 2562H, 2556H);
90
   Init8(cp, n, 2555H, 2563H, 2551H, 2557H, 255DH, 255CH, 255BH, 2510H);
91
   Init8(cp, n, 2514H, 2534H, 252CH, 251CH, 2500H, 253CH, 255EH, 255FH);
92
   Init8(cp, n, 255AH, 2554H, 2569H, 2566H, 2560H, 2550H, 256CH, 2567H);
93
   Init8(cp, n, 2568H, 2564H, 2565H, 2559H, 2558H, 2552H, 2553H, 256BH);
94
   Init8(cp, n, 256AH, 2518H, 250CH, 2588H, 2584H, 258CH, 2590H, 2580H);
95
 
96
   n := 0F0H;
97
   Init8(cp, n, 0401H, 0451H, 0404H, 0454H, 0407H, 0457H, 040EH, 045EH);
98
   Init8(cp, n, 00B0H, 2219H, 00B7H, 221AH, 2116H, 00A4H, 25A0H, 00A0H);
99
 
100
   InitCP(cp)
101
END InitCP866;
102
 
103
PROCEDURE concat(VAR L: STRING; R: STRING);
104
VAR i, n, pos: INTEGER;
105
BEGIN
106
  n := LENGTH(R);
107
  i := 0;
108
  pos := LENGTH(L);
109
  WHILE (i <= n) & (pos < LEN(L)) DO
110
    L[pos] := R[i];
111
    INC(pos);
112
    INC(i)
113
  END
114
END concat;
115
 
116
PROCEDURE Utf8(VAR str: STRING);
117
VAR i: INTEGER; in, out, u: STRING;
118
BEGIN
119
  in := str;
120
  out := "";
121
  FOR i := 0 TO LENGTH(in) - 1 DO
122
    utf8(cp[ORD(in[i])], u);
123
    concat(out, u)
124
  END;
125
  str := out
126
END Utf8;
127
 
128
PROCEDURE ErrorMsg*(code: INTEGER; VAR msg: ARRAY OF CHAR);
129
VAR str: STRING;
130
BEGIN
131
  CASE code OF
132
  |  1: str := "ожидалась 'H' или 'X'"
133
  |  2: str := "ожидалась цифра"
134
  |  3: str := "строка не содержит закрывающей кавычки"
135
  |  4: str := "недопустимый символ"
136
  |  5: str := "целочисленное переполнение"
137
  |  6: str := "слишком большое значение символьной константы"
138
  |  7: str := "вещественное переполнение"
139
  |  8: str := "переполнение порядка вещественного числа"
140
  |  9: str := "вещественное антипереполнение"
141
  | 10: str := "слишком длинный идентификатор"
142
  | 11: str := "слишком длинная строковая константа"
143
 
144
  | 21: str := "ожидалось 'MODULE'"
145
  | 22: str := "ожидался идентификатор"
146
  | 23: str := "ожидалась ';'"
147
  | 24: str := "ожидалось 'END'"
148
  | 25: str := "ожидалась '.'"
149
  | 26: str := "идентификатор не совпадает с именем модуля"
150
  | 27: str := "неожиданный конец файла"
151
  | 28: str := "ожидалась ',', ';' или ':='"
152
  | 29: str := "ожидалась ',' или ';'"
153
  | 30: str := "идентификатор переопределен"
154
  | 31: str := "циклический импорт"
155
  | 32: str := "модуль не найден или ошибка доступа"
156
  | 33: str := "имя модуля не совпадает с именем файла модуля"
157
  | 34: str := "неправильный формат строки машинных кодов"
158
  | 35: str := "ожидалось '='"
159
  | 36: str := "синтаксическая ошибка в выражении"
160
  | 37: str := "операция не применима"
161
  | 38: str := "ожидалась ')'"
162
  | 39: str := "ожидалoсь 'ARRAY', 'RECORD', 'POINTER' или 'PROCEDURE'"
163
  | 40: str := "ожидалoсь 'TO'"
164
  | 41: str := "ожидалoсь 'OF'"
165
  | 42: str := "неопределенный идентификатор"
166
  | 43: str := "требуется переменная, процедура или строковая константа"
167
  | 44: str := "ожидалoсь 'cdecl', 'stdcall' или 'winapi'"
168
  | 45: str := "флаг вызова недопускается для локальных процедур"
169
  | 46: str := "деление на нуль"
170
  | 47: str := "требуется идентификатор типа-записи или типа-указателя"
171
  | 48: str := "целочисленное деление на нуль"
172
  | 49: str := "значение левого операнда вне диапазона 0..31"
173
  | 50: str := "флаг [winapi] доступен только для платформы Windows"
174
  | 51: str := "ожидалась '}'"
175
  | 52: str := "требуется выражение типа INTEGER"
176
  | 53: str := "значение выражения вне диапазона 0..31"
177
  | 54: str := "левая граница диапазона больше правой"
178
  | 55: str := "требуется константа типа CHAR"
179
  | 56: str := "ожидалась '('"
180
  | 57: str := "требуется выражение числового типа"
181
 
182
  | 59: str := "недостаточно параметров"
183
  | 60: str := "недопустимый параметр"
184
  | 61: str := "ожидалась ','"
185
  | 62: str := "требуется константное выражение"
186
  | 63: str := "требуется переменная"
187
  | 64: str := "файл не найден или ошибка доступа"
188
  | 65: str := "модуль RTL не найден"
189
  | 66: str := "требуется выражение типа REAL или LONGREAL"
190
  | 67: str := "невозможно создать файл, возможно файл открыт или диск защищен от записи"
191
  | 68: str := "требуется выражение типа CHAR, SET или BOOLEAN"
192
  | 69: str := "невозможно записать файл"
193
  | 70: str := "требуется выражение типа LONGREAL"
194
  | 71: str := "требуется выражение типа REAL"
195
  | 72: str := "недостаточно памяти для завершения компиляции"
196
  | 73: str := "процедура не возвращающая результат недопустима в выражениях"
197
  | 74: str := "значение выражения вне целочисленного диапазона"
198
  | 75: str := "рекурсивное определение константы"
199
  | 76: str := "значение выражения вне диапазона 0..255"
200
  | 77: str := "ожидался идентификатор типа"
201
  | 78: str := "длина типа-массива должна быть больше нуля"
202
  | 79: str := "ожидалось 'OF' или ','"
7107 akron1 203
  | 80: str := "ожидался идентификатор типа-записи или типа-указателя"
6613 leency 204
  | 81: str := "базовый тип типа-указателя должен быть записью"
205
  | 82: str := "тип результата процедуры не может быть записью или массивом"
206
  | 83: str := "размер типа слишком велик"
207
  | 84: str := "ожидался идентификатор или 'VAR'"
208
  | 85: str := "ожидалась ',' или ':'"
209
  | 86: str := "ожидалось 'END' или ';'"
210
  | 87: str := "идентификатор не совпадает с именем процедуры"
211
 
212
  | 89: str := "экспорт локального идентификатора недопустим"
213
  | 90: str := "тип ARRAY или RECORD недопустим"
214
  | 91: str := "требуется идентификатор вещественного типа"
215
 
216
  | 93: str := "размер данных слишком велик"
217
  | 94: str := "строка длины, отличной от 1 недопустима"
218
  | 95: str := "значение выражения должно быть в диапазоне 0..127"
219
  | 96: str := "недопустимое рекурсивное определение типа"
220
  | 97: str := "недостаточно вещественных регистров, упростите выражение"
221
  | 98: str := "ожидалось 'THEN'"
222
  | 99: str := "поле записи не найдено"
223
  |100: str := "метка дублирована"
224
  |101: str := "идентификатор типа недопустим в выражениях"
225
  |102: str := "требуется массив"
226
  |103: str := "ожидалoсь 'union' или 'noalign'"
227
  |104: str := "требуется указатель"
228
  |105: str := "требуется запись"
229
  |106: str := "требуется идентификатор типа-записи"
230
  |107: str := "требуется идентификатор типа-указателя"
231
  |108: str := "недопустимая охрана типа"
232
  |109: str := "ожидалась ']'"
233
  |110: str := "размерность открытого массива слишком велика"
234
  |111: str := "системные флаги требуют импорта модуля SYSTEM"
235
  |112: str := "расширение записи не может быть [noalign] или [union]"
236
  |113: str := "базовый тип записи не может быть [noalign] или [union]"
237
  |114: str := "несовместимый параметр"
238
  |115: str := "переменная доступна только для чтения"
239
  |116: str := "нельзя использовать локальную процедуру"
240
  |117: str := "требуется выражение типа BOOLEAN"
241
  |118: str := "ожидалось 'DO'"
242
  |119: str := "ожидалось 'UNTIL'"
243
  |120: str := "ожидалось ':='"
244
  |121: str := "расширение имени файла главного модуля должно быть 'ob07'"
245
  |122: str := "значение выражения не может быть равным нулю"
246
  |123: str := "'RETURN' недопустим в процедуре, не возвращающей результат"
247
  |124: str := "ожидалось 'RETURN'"
248
  |125: str := "тип выражения не соответствует типу результата процедуры"
249
  |126: str := "требуется идентификатор переменной"
250
  |127: str := "счетчик цикла FOR не должен быть параметром"
251
  |128: str := "тип переменной должен быть INTEGER"
252
  |129: str := "переменная должна быть локальной"
253
  |130: str := "нельзя использовать константу"
254
  |131: str := "несовместимость по присваиванию"
255
  |132: str := "вызов процедуры-функции допускается только в составе выражения"
256
  |133: str := "идентификаторы 'lib_init' и 'version' зарезервированы"
257
 
258
  |138: str := "тип переменной должен быть SET"
259
 
260
  |141: str := "требуется строка или символьный массив"
261
 
262
  |143: str := "требуется символьный массив"
263
 
264
  |145: str := "тип переменной должен быть POINTER"
265
 
266
  |149: str := "тип переменной должен быть REAL или LONGREAL"
267
  |150: str := "требуется строковая константа"
268
 
269
  |155: str := "ожидалась '(' или ':='"
270
  |156: str := "требуется выражение типа INTEGER или CHAR"
271
  |157: str := "ожидалась ':'"
272
  |158: str := "не найдена процедура в модуле RTL"
273
  |159: str := "нарушение границ массива"
274
  |160: str := "ожидался идентификатор константы"
275
  |161: str := "требуется константа типа INTEGER"
276
  END;
277
  IF H.OS = "LNX" THEN
278
    Utf8(str)
279
  END;
280
  COPY(str, msg)
281
END ErrorMsg;
282
 
283
BEGIN
284
  InitCP866(cp)
285
END ERRORS.