@artel/ru-artel-compiler 0.6.25208

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.
Files changed (11) hide show
  1. package/package.json +13 -0
  2. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270/./320/260/321/200/321/202/320/265/320/273/321/214//320/232/320/276/320/275/321/204/320/270/320/263/321/203/321/200/320/260/321/206/320/270/321/217.json +7 -0
  3. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/222/320/270/320/264/320/233/320/265/320/272/321/201/320/265/320/274/321/213./320/260/321/200/321/202 +75 -0
  4. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/222/320/270/320/264/320/241/320/273/320/276/320/262/320/260./320/260/321/200/321/202 +64 -0
  5. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/222/320/270/320/264/320/243/320/267/320/273/320/260./320/260/321/200/321/202 +224 -0
  6. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/224/320/265/320/273/320/270/321/202/320/265/320/273/321/214./320/260/321/200/321/202 +995 -0
  7. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/224/320/270/320/260/320/273/320/265/320/272/321/202/320/237/320/260/320/272/320/265/321/202/320/260./320/260/321/200/321/202 +7 -0
  8. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/241/320/273/320/276/320/262/320/260/321/200/321/214/320/241/320/273/320/276/320/262./320/260/321/200/321/202 +398 -0
  9. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/242/320/265/320/272/321/201/321/202/320/235/320/265/321/215/320/272/321/200/320/260/320/275/320/270/321/200/320/276/320/262/320/260/320/275/320/275/321/213/320/271./320/260/321/200/321/202 +223 -0
  10. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/247/320/270/321/202/320/260/321/202/320/265/320/273/321/214/320/247/320/270/321/201/320/273/320/260./320/260/321/200/321/202 +111 -0
  11. package//320/230/321/201/321/205/320/276/320/264/320/275/320/270/320/272/320/270//320/257/320/267/321/213/320/272/320/237/320/260/320/272/320/265/321/202/320/260./320/260/321/200/321/202 +46 -0
@@ -0,0 +1,995 @@
1
+
2
+ тип Нотация = вариант
3
+ {
4
+ артель = 0
5
+ опись = 1
6
+ }
7
+
8
+ тип НастройкиДелителя = объект
9
+ {
10
+ нотация: Нотация?
11
+ пропускать-незначимое: ДаНет?
12
+ позиция-начала: Целое?
13
+ длина: Целое?
14
+ }
15
+
16
+ тип Лексема = простой объект
17
+ {
18
+ конст вид: ВидЛексемы
19
+ конст текст: Текст
20
+ конст позиция-начала: Целое
21
+ конст незавершённая: ДаНет
22
+
23
+ создание(вид`: ВидЛексемы, текст`: Текст, позиция-начала`: Целое, незавершённая`: ДаНет)
24
+ {
25
+ вид = вид`
26
+ текст = текст`
27
+ позиция-начала = позиция-начала`
28
+ незавершённая = незавершённая`
29
+ }
30
+ }
31
+
32
+ тип Делитель = объект
33
+ {
34
+ конст текст: Текст
35
+ чтение лексема: Лексема { лексема`` }
36
+ скрыто
37
+ запись лексема { лексема`` = значение }
38
+
39
+ скрыто нотация: Нотация
40
+ скрыто пропускать-пробелы: ДаНет
41
+ скрыто позиция-конца: Целое
42
+ скрыто текущая-позиция: Целое
43
+ скрыто баланс-фигурных-скобок: Целое
44
+ скрыто стек-баланса-фигурных-скобок: Список<Целое>
45
+ скрыто конст уникальные-тексты-лексем: Словарь<Текст, Текст>
46
+
47
+ создание(текст`: Текст, настройки: НастройкиДелителя? = пусто)
48
+ {
49
+ текст = текст`
50
+ нотация = настройки?.нотация ?? Нотация.артель
51
+ пропускать-пробелы = настройки?.пропускать-незначимое ?? нет
52
+ текущая-позиция = настройки?.позиция-начала ?? 0
53
+ конст длина = настройки?.длина
54
+ позиция-конца = текущая-позиция + длина! когда длина != пусто : текст.длина
55
+
56
+ баланс-фигурных-скобок = 0
57
+ стек-баланса-фигурных-скобок = Список<Целое>()
58
+ уникальные-тексты-лексем = Словарь<Текст, Текст>()
59
+
60
+ лексема = следующая-лексема()
61
+ }
62
+
63
+ функция предпросмотр(анализатор: функция(): ДаНет): ДаНет
64
+ {
65
+ результат = пробный-анализ-или-предпросмотр(анализатор, безусловно-восстановить-состояние = да)
66
+ }
67
+
68
+ функция пробный-анализ(анализатор: функция(): ДаНет): ДаНет
69
+ {
70
+ результат = пробный-анализ-или-предпросмотр(анализатор, безусловно-восстановить-состояние = нет)
71
+ }
72
+
73
+ функция следующая-лексема(): Лексема
74
+ {
75
+ если пропускать-пробелы
76
+ {
77
+ пока текущая-позиция < позиция-конца и
78
+ это-пробел-или-табуляция(текст.символ-по-позиции(текущая-позиция))
79
+ {
80
+ текущая-позиция += 1
81
+ }
82
+ }
83
+ конст позиция-начала = текущая-позиция
84
+ пусть вид-лексемы: ВидЛексемы
85
+ пусть текст-лексемы: Текст
86
+ пусть незавершённая: ДаНет = нет
87
+ если текущая-позиция >= позиция-конца
88
+ {
89
+ вид-лексемы = ВидЛексемы.конец-текста
90
+ текст-лексемы = Текст.пустой
91
+ }
92
+ иначе
93
+ {
94
+ конст символ: Символ = текст.символ-по-позиции(текущая-позиция)
95
+ выбор символ
96
+ либо "\/"
97
+ {
98
+ текущая-позиция += 1
99
+ вид-лексемы = ВидЛексемы.перенос-строки
100
+ }
101
+ либо "\<"
102
+ {
103
+ текущая-позиция += 1
104
+ если текущая-позиция < позиция-конца и текст[текущая-позиция] == "\/"
105
+ {
106
+ текущая-позиция += 1
107
+ }
108
+ вид-лексемы = ВидЛексемы.перенос-строки
109
+ }
110
+ либо " ", "\>"
111
+ {
112
+ прочитать-пробелы-и-табуляции()
113
+ вид-лексемы = ВидЛексемы.незначащий-пробел
114
+ }
115
+ либо "\""
116
+ {
117
+ пусть р = прочитать-символ-или-текст-или-часть-шаблона-текста()
118
+ вид-лексемы = р.вид-лексемы
119
+ незавершённая = р.незавершённая
120
+ }
121
+ либо "!"
122
+ {
123
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
124
+ {
125
+ текущая-позиция += 2
126
+ вид-лексемы = ВидЛексемы.знак-восклицание-равно
127
+ }
128
+ иначе
129
+ {
130
+ текущая-позиция += 1
131
+ вид-лексемы = ВидЛексемы.знак-восклицание
132
+ }
133
+ }
134
+ либо "&"
135
+ {
136
+ если текст.символ-по-позиции(текущая-позиция + 1) == "&"
137
+ {
138
+ текущая-позиция += 2
139
+ вид-лексемы = ВидЛексемы.знак-двойной-амперсанд
140
+ }
141
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "="
142
+ {
143
+ текущая-позиция += 2
144
+ вид-лексемы = ВидЛексемы.знак-амперсанд-равно
145
+ }
146
+ иначе
147
+ {
148
+ текущая-позиция += 1
149
+ вид-лексемы = ВидЛексемы.знак-амперсанд
150
+ }
151
+ }
152
+ либо "("
153
+ {
154
+ текущая-позиция += 1
155
+ вид-лексемы = ВидЛексемы.знак-левая-круглая-скобка
156
+ }
157
+ либо ")"
158
+ {
159
+ текущая-позиция += 1
160
+ вид-лексемы = ВидЛексемы.знак-правая-круглая-скобка
161
+ }
162
+ либо "*"
163
+ {
164
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
165
+ {
166
+ текущая-позиция += 2
167
+ вид-лексемы = ВидЛексемы.знак-звёздочка-равно
168
+ }
169
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "*"
170
+ {
171
+ текущая-позиция += 2
172
+ вид-лексемы = ВидЛексемы.знак-двойная-звёздочка
173
+ }
174
+ иначе
175
+ {
176
+ текущая-позиция += 1
177
+ вид-лексемы = ВидЛексемы.знак-звёздочка
178
+ }
179
+ }
180
+ либо "+"
181
+ {
182
+ если текст.символ-по-позиции(текущая-позиция + 1) == "+"
183
+ {
184
+ текущая-позиция += 2
185
+ вид-лексемы = ВидЛексемы.знак-двойной-плюс
186
+ }
187
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "="
188
+ {
189
+ текущая-позиция += 2
190
+ вид-лексемы = ВидЛексемы.знак-плюс-равно
191
+ }
192
+ иначе
193
+ {
194
+ текущая-позиция += 1
195
+ вид-лексемы = ВидЛексемы.знак-плюс
196
+ }
197
+ }
198
+ либо "-"
199
+ {
200
+ если текст.символ-по-позиции(текущая-позиция + 1) == "-"
201
+ {
202
+ текущая-позиция += 2
203
+ вид-лексемы = ВидЛексемы.знак-двойной-минус
204
+ }
205
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "="
206
+ {
207
+ текущая-позиция += 2
208
+ вид-лексемы = ВидЛексемы.знак-минус-равно
209
+ }
210
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == ">"
211
+ {
212
+ текущая-позиция += 2
213
+ вид-лексемы = ВидЛексемы.знак-минус-правый-угол
214
+ }
215
+ иначе
216
+ {
217
+ текущая-позиция += 1
218
+ вид-лексемы = ВидЛексемы.знак-минус
219
+ }
220
+ }
221
+ либо ","
222
+ {
223
+ текущая-позиция += 1
224
+ вид-лексемы = ВидЛексемы.знак-запятая
225
+ }
226
+ либо "."
227
+ {
228
+ если это-цифра(текст.символ-по-позиции(текущая-позиция + 1))
229
+ {
230
+ пусть р = прочитать-число()
231
+ вид-лексемы = р.вид-лексемы
232
+ незавершённая = р.незавершённая
233
+ }
234
+ иначе
235
+ {
236
+ текущая-позиция += 1
237
+ вид-лексемы = ВидЛексемы.знак-точка
238
+ }
239
+ }
240
+ либо "`"
241
+ {
242
+ если нотация == Нотация.опись
243
+ {
244
+ текущая-позиция += 1
245
+ прочитать-однострочный-комментарий()
246
+ вид-лексемы = ВидЛексемы.комментарий-однострочный
247
+ }
248
+ иначе
249
+ {
250
+ текущая-позиция += 1
251
+ вид-лексемы = ВидЛексемы.знак-обратная-кавычка
252
+ }
253
+ }
254
+ либо "/"
255
+ {
256
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
257
+ {
258
+ текущая-позиция += 2
259
+ вид-лексемы = ВидЛексемы.знак-косая-черта-равно
260
+ }
261
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "/"
262
+ {
263
+ текущая-позиция += 2
264
+ прочитать-однострочный-комментарий()
265
+ вид-лексемы = ВидЛексемы.комментарий-однострочный
266
+ }
267
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "*"
268
+ {
269
+ текущая-позиция += 2
270
+ пока текущая-позиция < позиция-конца
271
+ {
272
+ конст символ = текст.символ-по-позиции(текущая-позиция)
273
+ если символ == "*" и текст.символ-по-позиции(текущая-позиция + 1) == "/"
274
+ {
275
+ текущая-позиция += 2
276
+ прервать цикл
277
+ }
278
+ текущая-позиция += 1
279
+ }
280
+ вид-лексемы = ВидЛексемы.комментарий-многострочный
281
+ }
282
+ иначе
283
+ {
284
+ текущая-позиция += 1
285
+ вид-лексемы = ВидЛексемы.знак-косая-черта
286
+ }
287
+ }
288
+ либо "%"
289
+ {
290
+ если текст.символ-по-позиции(текущая-позиция + 1) == "%"
291
+ {
292
+ текущая-позиция += 2
293
+ вид-лексемы = ВидЛексемы.знак-двойной-процент
294
+ }
295
+ иначе
296
+ {
297
+ текущая-позиция += 1
298
+ вид-лексемы = ВидЛексемы.знак-процент
299
+ }
300
+ }
301
+ либо "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
302
+ {
303
+ пусть р = прочитать-число()
304
+ вид-лексемы = р.вид-лексемы
305
+ незавершённая = р.незавершённая
306
+ }
307
+ либо ":"
308
+ {
309
+ текущая-позиция += 1
310
+ вид-лексемы = ВидЛексемы.знак-двоеточие
311
+ }
312
+ либо ";"
313
+ {
314
+ текущая-позиция += 1
315
+ вид-лексемы = ВидЛексемы.знак-точка-с-запятой
316
+ }
317
+ либо "<"
318
+ {
319
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
320
+ {
321
+ текущая-позиция += 2
322
+ вид-лексемы = ВидЛексемы.знак-левый-угол-равно
323
+ }
324
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "-"
325
+ {
326
+ текущая-позиция += 2
327
+ вид-лексемы = ВидЛексемы.знак-левый-угол-минус
328
+ }
329
+ иначе
330
+ {
331
+ текущая-позиция += 1
332
+ вид-лексемы = ВидЛексемы.знак-левый-угол
333
+ }
334
+ }
335
+ либо "="
336
+ {
337
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
338
+ {
339
+ текущая-позиция += 2
340
+ вид-лексемы = ВидЛексемы.знак-двойное-равно
341
+ }
342
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == ">"
343
+ {
344
+ текущая-позиция += 2
345
+ вид-лексемы = ВидЛексемы.знак-равно-правый-угол
346
+ }
347
+ иначе
348
+ {
349
+ текущая-позиция += 1
350
+ вид-лексемы = ВидЛексемы.знак-равно
351
+ }
352
+ }
353
+ либо ">"
354
+ {
355
+ если текст.символ-по-позиции(текущая-позиция + 1) == "="
356
+ {
357
+ текущая-позиция += 2
358
+ вид-лексемы = ВидЛексемы.знак-правый-угол-равно
359
+ }
360
+ иначе
361
+ {
362
+ текущая-позиция += 1
363
+ вид-лексемы = ВидЛексемы.знак-правый-угол
364
+ }
365
+ }
366
+ либо "?"
367
+ {
368
+ если текст.символ-по-позиции(текущая-позиция + 1) == "?"
369
+ {
370
+ текущая-позиция += 2
371
+ вид-лексемы = ВидЛексемы.знак-двойной-вопрос
372
+ }
373
+ иначе
374
+ {
375
+ текущая-позиция += 1
376
+ вид-лексемы = ВидЛексемы.знак-вопрос
377
+ }
378
+ }
379
+ либо "|"
380
+ {
381
+ если текст.символ-по-позиции(текущая-позиция + 1) == "|"
382
+ {
383
+ текущая-позиция += 2
384
+ вид-лексемы = ВидЛексемы.знак-двойная-вертикальная-черта
385
+ }
386
+ иначе
387
+ {
388
+ текущая-позиция += 1
389
+ вид-лексемы = ВидЛексемы.знак-вертикальная-черта
390
+ }
391
+ }
392
+ либо "\{"
393
+ {
394
+ баланс-фигурных-скобок += 1
395
+ текущая-позиция += 1
396
+ вид-лексемы = ВидЛексемы.знак-левая-фигурная-скобка
397
+ }
398
+ либо "\}"
399
+ {
400
+ если фигурная-скобка-оканчивает-шаблон-текста()
401
+ {
402
+ пусть р = прочитать-символ-или-текст-или-часть-шаблона-текста()
403
+ вид-лексемы = р.вид-лексемы
404
+ незавершённая = р.незавершённая
405
+ }
406
+ иначе
407
+ {
408
+ баланс-фигурных-скобок -= 1
409
+ текущая-позиция += 1
410
+ вид-лексемы = ВидЛексемы.знак-правая-фигурная-скобка
411
+ }
412
+ }
413
+ либо "["
414
+ {
415
+ текущая-позиция += 1
416
+ вид-лексемы = ВидЛексемы.знак-левая-квадратная-скобка
417
+ }
418
+ либо "]"
419
+ {
420
+ текущая-позиция += 1
421
+ вид-лексемы = ВидЛексемы.знак-правая-квадратная-скобка
422
+ }
423
+ либо "~"
424
+ {
425
+ если текст.символ-по-позиции(текущая-позиция + 1) == "~"
426
+ {
427
+ текущая-позиция += 2
428
+ вид-лексемы = ВидЛексемы.знак-двойная-тильда
429
+ }
430
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "\""
431
+ {
432
+ текущая-позиция += 1
433
+ пусть р = прочитать-символ-или-текст-или-часть-шаблона-текста(локализуемый = да)
434
+ вид-лексемы = р.вид-лексемы
435
+ незавершённая = р.незавершённая
436
+ }
437
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "'"
438
+ {
439
+ пусть р = прочитать-имя-в-кавычках()
440
+ вид-лексемы = ВидЛексемы.имя-в-кавычках
441
+ незавершённая = не(р)
442
+ }
443
+ иначе если это-начало-имени(текст.символ-по-позиции(текущая-позиция + 1))
444
+ {
445
+ прочитать-имя()
446
+ вид-лексемы = ВидЛексемы.имя
447
+ }
448
+ иначе
449
+ {
450
+ текущая-позиция += 1
451
+ вид-лексемы = ВидЛексемы.знак-тильда
452
+ }
453
+ }
454
+ либо "@"
455
+ {
456
+ текущая-позиция += 1
457
+ вид-лексемы = ВидЛексемы.знак-коммерческое-эт
458
+ }
459
+ либо "#"
460
+ {
461
+ текущая-позиция += 1
462
+ вид-лексемы = ВидЛексемы.знак-решётка
463
+ }
464
+ либо "^"
465
+ {
466
+ текущая-позиция += 1
467
+ вид-лексемы = ВидЛексемы.знак-вставка
468
+ }
469
+ либо "\\"
470
+ {
471
+ если текст.символ-по-позиции(текущая-позиция + 1) == "\\"
472
+ {
473
+ текущая-позиция += 2
474
+ вид-лексемы = ВидЛексемы.знак-двойная-обратная-косая-черта
475
+ }
476
+ иначе если текст.символ-по-позиции(текущая-позиция + 1) == "="
477
+ {
478
+ текущая-позиция += 2
479
+ вид-лексемы = ВидЛексемы.знак-обратная-косая-черта-равно
480
+ }
481
+ иначе
482
+ {
483
+ текущая-позиция += 1
484
+ вид-лексемы = ВидЛексемы.знак-обратная-косая-черта
485
+ }
486
+ }
487
+ либо "'"
488
+ {
489
+ пусть р = прочитать-имя-в-кавычках()
490
+ вид-лексемы = ВидЛексемы.имя-в-кавычках
491
+ незавершённая = не(р)
492
+ }
493
+ либо *
494
+ {
495
+ если это-начало-имени(текст.символ-по-позиции(текущая-позиция))
496
+ {
497
+ прочитать-имя()
498
+ вид-лексемы = ВидЛексемы.имя
499
+ }
500
+ иначе
501
+ {
502
+ // Синтаксическая ошибка
503
+ текущая-позиция += 1
504
+ вид-лексемы = ВидЛексемы.неизвестная-лексема
505
+ }
506
+ }
507
+ текст-лексемы = текст.скопировать(позиция-начала, текущая-позиция - позиция-начала)
508
+ пусть существующий = уникальные-тексты-лексем.получить(текст-лексемы)
509
+ если существующий == пусто
510
+ {
511
+ уникальные-тексты-лексем.добавить(текст-лексемы, текст-лексемы)
512
+ }
513
+ иначе
514
+ {
515
+ текст-лексемы = существующий!
516
+ }
517
+ }
518
+ лексема = Лексема(вид-лексемы, текст-лексемы, позиция-начала, незавершённая)
519
+ результат = лексема
520
+ }
521
+
522
+ скрытая функция пробный-анализ-или-предпросмотр(анализатор: функция(): ДаНет,
523
+ безусловно-восстановить-состояние: ДаНет): ДаНет
524
+ {
525
+ конст сохран-лексема = лексема
526
+ конст сохран-текущая-позиция = текущая-позиция
527
+ конст сохран-баланс-фигурных-скобок = баланс-фигурных-скобок
528
+ пусть сохран-стек-баланса-фигурных-скобок: Список<Целое>? = пусто
529
+ если стек-баланса-фигурных-скобок.количество > 0
530
+ {
531
+ сохран-стек-баланса-фигурных-скобок = Список<Целое>(стек-баланса-фигурных-скобок)
532
+ }
533
+
534
+ результат = анализатор()
535
+
536
+ если безусловно-восстановить-состояние или результат == нет
537
+ {
538
+ лексема = сохран-лексема
539
+ текущая-позиция = сохран-текущая-позиция
540
+ баланс-фигурных-скобок = сохран-баланс-фигурных-скобок
541
+ если сохран-стек-баланса-фигурных-скобок != пусто
542
+ {
543
+ стек-баланса-фигурных-скобок = сохран-стек-баланса-фигурных-скобок!
544
+ }
545
+ иначе
546
+ {
547
+ стек-баланса-фигурных-скобок.очистить()
548
+ }
549
+ }
550
+ }
551
+
552
+ скрытая функция фигурная-скобка-оканчивает-шаблон-текста(): ДаНет {
553
+ результат = стек-баланса-фигурных-скобок.количество > 0 и баланс-фигурных-скобок == 1
554
+ }
555
+
556
+ скрытая функция прочитать-символ-или-текст-или-часть-шаблона-текста(локализуемый: ДаНет = нет):
557
+ объект { вид-лексемы: ВидЛексемы; незавершённая: ДаНет }
558
+ {
559
+ конст кавычка = текст.символ-по-позиции(текущая-позиция)
560
+ текущая-позиция += 1
561
+ конст начало = текущая-позиция
562
+ пусть конец = текущая-позиция
563
+ пусть вид-лексемы: ВидЛексемы
564
+ пусть незавершённая: ДаНет = нет
565
+ пока да
566
+ {
567
+ конст текущий-символ = текст.символ-по-позиции(текущая-позиция)
568
+ если текущий-символ == "\""
569
+ {
570
+ конец = текущая-позиция
571
+ текущая-позиция += 1
572
+ если кавычка == "\""
573
+ {
574
+ вид-лексемы =
575
+ ВидЛексемы.буквально-текст-локализуемый когда локализуемый :
576
+ ВидЛексемы.буквально-текст
577
+ }
578
+ иначе
579
+ {
580
+ вид-лексемы = ВидЛексемы.буквально-окончание-шаблона-текста
581
+ }
582
+ прервать цикл
583
+ }
584
+ иначе если текущий-символ == "\{"
585
+ {
586
+ конец = текущая-позиция
587
+ текущая-позиция += 1
588
+ если кавычка == "\""
589
+ {
590
+ вид-лексемы =
591
+ ВидЛексемы.буквально-начало-шаблона-текста-локализуемого когда локализуемый :
592
+ ВидЛексемы.буквально-начало-шаблона-текста
593
+ }
594
+ иначе
595
+ {
596
+ вид-лексемы = ВидЛексемы.буквально-часть-шаблона-текста
597
+ }
598
+ прервать цикл
599
+ }
600
+ иначе если текущий-символ == "\\"
601
+ {
602
+ текущая-позиция += 1
603
+ }
604
+ если текущая-позиция >= позиция-конца
605
+ {
606
+ конец = текущая-позиция
607
+ вид-лексемы = ВидЛексемы.буквально-текст когда кавычка == "\"" :
608
+ ВидЛексемы.буквально-окончание-шаблона-текста
609
+ если кавычка == "\""
610
+ {
611
+ вид-лексемы =
612
+ ВидЛексемы.буквально-текст-локализуемый когда локализуемый :
613
+ ВидЛексемы.буквально-текст
614
+ }
615
+ иначе
616
+ {
617
+ вид-лексемы = ВидЛексемы.буквально-окончание-шаблона-текста
618
+ }
619
+ // Ошибка: незавершённая текст или шаблон текста
620
+ незавершённая = да
621
+ прервать цикл
622
+ }
623
+ текущая-позиция += 1
624
+ }
625
+ выбор вид-лексемы
626
+ либо ВидЛексемы.буквально-начало-шаблона-текста, ВидЛексемы.буквально-начало-шаблона-текста-локализуемого
627
+ {
628
+ стек-баланса-фигурных-скобок.добавить(баланс-фигурных-скобок)
629
+ баланс-фигурных-скобок = 1
630
+ }
631
+ либо ВидЛексемы.буквально-часть-шаблона-текста
632
+ {
633
+ баланс-фигурных-скобок = 1
634
+ }
635
+ либо ВидЛексемы.буквально-окончание-шаблона-текста
636
+ {
637
+ баланс-фигурных-скобок = стек-баланса-фигурных-скобок.извлечь-последний()
638
+ }
639
+ либо ВидЛексемы.буквально-текст
640
+ {
641
+ если состоит-из-одного-символа(начало, конец)
642
+ {
643
+ вид-лексемы = ВидЛексемы.буквально-символ
644
+ }
645
+ }
646
+ результат = автотип(вид-лексемы = вид-лексемы, незавершённая = незавершённая)
647
+ }
648
+
649
+ скрытая функция состоит-из-одного-символа(начало: Целое, конец: Целое): ДаНет
650
+ {
651
+ результат = нет
652
+ конст длина = конец - начало
653
+ если длина == 1
654
+ {
655
+ результат = текст[начало + 0] != "\\"
656
+ }
657
+ иначе если длина == 2
658
+ {
659
+ конст с0 = текст[начало + 0]
660
+ конст с1 = текст[начало + 1]
661
+ результат = с0 == "\\" и с1 != "u" и с1 != "ю"
662
+ }
663
+ иначе если длина == 6
664
+ {
665
+ конст с0 = текст[начало + 0]
666
+ конст с1 = текст[начало + 1]
667
+ результат = с0 == "\\" и (с1 == "u" или с1 == "ю")
668
+ если результат
669
+ {
670
+ конст является-16р-цифрой: функция(символ: Символ): ДаНет =
671
+ это-16ичная-цифра-латиницы когда с1 == "u" :
672
+ это-16ичная-цифра-кириллицы // когда с1 == "ю"
673
+ пусть н = начало + 2
674
+ пока н < конец
675
+ {
676
+ если не(является-16р-цифрой(текст[н]))
677
+ {
678
+ результат = нет
679
+ прервать цикл
680
+ }
681
+ н += 1
682
+ }
683
+ }
684
+ }
685
+ }
686
+
687
+ скрытая функция прочитать-пробелы-и-табуляции()
688
+ {
689
+ пусть символ: Символ
690
+ цикл
691
+ {
692
+ текущая-позиция += 1
693
+ символ = текст.символ-по-позиции(текущая-позиция)
694
+ }
695
+ повтор пока символ == " " или символ == "\>"
696
+ }
697
+
698
+ скрытая функция прочитать-число():
699
+ объект { вид-лексемы: ВидЛексемы; незавершённая: ДаНет }
700
+ {
701
+ пусть вид-лексемы = ВидЛексемы.буквально-целое
702
+ пусть незавершённая: ДаНет = нет
703
+ конст первая-цифра-0 = текст.символ-по-позиции(текущая-позиция) == "0"
704
+ конст следующий-символ = текст.символ-по-позиции(текущая-позиция + 1)
705
+ если первая-цифра-0 и следующий-символ == "x"
706
+ {
707
+ текущая-позиция += 2
708
+ прочитать-16р-цифры-латиницы()
709
+ }
710
+ иначе если первая-цифра-0 и следующий-символ == "ш"
711
+ {
712
+ текущая-позиция += 2
713
+ прочитать-16р-цифры-кириллицы()
714
+ }
715
+ иначе если первая-цифра-0 и (следующий-символ == "b" или следующий-символ == "д")
716
+ {
717
+ текущая-позиция += 2
718
+ прочитать-2р-цифры()
719
+ }
720
+ иначе
721
+ {
722
+ прочитать-цифры()
723
+ если текст.символ-по-позиции(текущая-позиция) == "."
724
+ {
725
+ текущая-позиция += 1
726
+ прочитать-цифры()
727
+ вид-лексемы = ВидЛексемы.буквально-число
728
+ }
729
+ если текст.символ-по-позиции(текущая-позиция) == "e" или
730
+ текст.символ-по-позиции(текущая-позиция) == "E"
731
+ {
732
+ текущая-позиция += 1
733
+ если текст.символ-по-позиции(текущая-позиция) == "+" или
734
+ текст.символ-по-позиции(текущая-позиция) == "-"
735
+ {
736
+ текущая-позиция += 1
737
+ }
738
+ если не(прочитать-цифры())
739
+ {
740
+ // Ошибка: ожидается цифра
741
+ незавершённая = да
742
+ }
743
+ вид-лексемы = ВидЛексемы.буквально-число
744
+ }
745
+ если прочитать-единицы-числоед()
746
+ {
747
+ вид-лексемы = ВидЛексемы.буквально-числоед
748
+ }
749
+ }
750
+ результат = автотип(вид-лексемы = вид-лексемы, незавершённая = незавершённая)
751
+ }
752
+
753
+ скрытая функция прочитать-цифры(): ДаНет
754
+ {
755
+ результат = это-цифра(текст.символ-по-позиции(текущая-позиция))
756
+ если результат
757
+ {
758
+ цикл
759
+ {
760
+ текущая-позиция += 1
761
+ }
762
+ повтор пока текущая-позиция < позиция-конца и
763
+ это-цифра-или-разделитель-цифр(текст.символ-по-позиции(текущая-позиция))
764
+ }
765
+ }
766
+
767
+ скрытая функция прочитать-16р-цифры-латиницы(): ДаНет
768
+ {
769
+ результат = это-16ичная-цифра-латиницы(текст.символ-по-позиции(текущая-позиция))
770
+ если результат
771
+ {
772
+ цикл
773
+ {
774
+ текущая-позиция += 1
775
+ }
776
+ повтор пока текущая-позиция < позиция-конца и
777
+ это-16ичная-цифра-латиницы(текст.символ-по-позиции(текущая-позиция))
778
+ }
779
+ }
780
+
781
+ скрытая функция прочитать-16р-цифры-кириллицы(): ДаНет
782
+ {
783
+ результат = это-16ичная-цифра-кириллицы(текст.символ-по-позиции(текущая-позиция))
784
+ если результат
785
+ {
786
+ цикл
787
+ {
788
+ текущая-позиция += 1
789
+ }
790
+ повтор пока текущая-позиция < позиция-конца и
791
+ это-16ичная-цифра-кириллицы(текст.символ-по-позиции(текущая-позиция))
792
+ }
793
+ }
794
+
795
+ скрытая функция прочитать-2р-цифры(): ДаНет
796
+ {
797
+ результат = это-2ичная-цифра(текст.символ-по-позиции(текущая-позиция))
798
+ если результат
799
+ {
800
+ цикл
801
+ {
802
+ текущая-позиция += 1
803
+ }
804
+ повтор пока текущая-позиция < позиция-конца и
805
+ это-2ичная-цифра(текст.символ-по-позиции(текущая-позиция))
806
+ }
807
+ }
808
+
809
+ скрытая функция прочитать-единицы-числоед(): ДаНет
810
+ {
811
+ результат = это-единицы-числоед(текст.символ-по-позиции(текущая-позиция))
812
+ если результат
813
+ {
814
+ цикл
815
+ {
816
+ текущая-позиция += 1
817
+ }
818
+ повтор пока текущая-позиция < позиция-конца и
819
+ это-единицы-числоед(текст.символ-по-позиции(текущая-позиция))
820
+ }
821
+ }
822
+
823
+ скрытая функция прочитать-однострочный-комментарий()
824
+ {
825
+ пока текущая-позиция < позиция-конца и
826
+ не(это-разделитель-строк(текст.символ-по-позиции(текущая-позиция)))
827
+ {
828
+ текущая-позиция += 1
829
+ }
830
+ }
831
+
832
+ скрытая функция прочитать-имя()
833
+ {
834
+ если текст.символ-по-позиции(текущая-позиция) == "~"
835
+ {
836
+ текущая-позиция += 1
837
+ }
838
+
839
+ пусть позиция-минуса = текущая-позиция
840
+ пока текущая-позиция < позиция-конца и
841
+ это-часть-имени(текст.символ-по-позиции(текущая-позиция))
842
+ {
843
+ если (текст.символ-по-позиции(текущая-позиция) == "-")
844
+ {
845
+ позиция-минуса = текущая-позиция
846
+ пока текущая-позиция < позиция-конца и
847
+ текст.символ-по-позиции(текущая-позиция) == "-"
848
+ {
849
+ текущая-позиция += 1
850
+ }
851
+ если не(это-часть-имени(текст.символ-по-позиции(текущая-позиция)))
852
+ {
853
+ текущая-позиция = позиция-минуса
854
+ прервать цикл
855
+ }
856
+ }
857
+ текущая-позиция += 1
858
+ }
859
+
860
+ пока текущая-позиция < позиция-конца и текст.символ-по-позиции(текущая-позиция) == "`"
861
+ {
862
+ текущая-позиция += 1
863
+ }
864
+ }
865
+
866
+ скрытая функция прочитать-имя-в-кавычках(): ДаНет
867
+ {
868
+ если текст.символ-по-позиции(текущая-позиция) == "~"
869
+ {
870
+ текущая-позиция += 1
871
+ }
872
+
873
+ текущая-позиция += 1
874
+ пока текущая-позиция < позиция-конца
875
+ {
876
+ конст текущий-символ = текст.символ-по-позиции(текущая-позиция)
877
+ выбор текущий-символ
878
+ либо "'"
879
+ {
880
+ текущая-позиция += 1
881
+ прервать цикл
882
+ }
883
+ либо "\\"
884
+ {
885
+ текущая-позиция += 1
886
+ }
887
+ либо "\<", "\/"
888
+ {
889
+ // Ошибка: отсутствует парная кавычка
890
+ вернуть нет
891
+ }
892
+ текущая-позиция += 1
893
+ }
894
+
895
+ пока текущая-позиция < позиция-конца и текст.символ-по-позиции(текущая-позиция) == "`"
896
+ {
897
+ текущая-позиция += 1
898
+ }
899
+ вернуть да
900
+ }
901
+
902
+ всеобщая функция это-пробел-или-табуляция(символ: Символ): ДаНет
903
+ {
904
+ результат = символ == " " или символ == "\>"
905
+ }
906
+
907
+ всеобщая функция это-разделитель-строк(символ: Символ): ДаНет
908
+ {
909
+ результат = символ == "\/" или символ == "\<"
910
+ }
911
+
912
+ всеобщая функция это-буква(символ: Символ): ДаНет
913
+ {
914
+ результат = символ >= "A" и символ <= "Z" или
915
+ символ >= "a" и символ <= "z" или
916
+ символ >= "А" и символ <= "Я" или
917
+ символ >= "а" и символ <= "я" или
918
+ символ == "Ё" или
919
+ символ == "ё"
920
+ }
921
+
922
+ всеобщая функция это-цифра(символ: Символ): ДаНет
923
+ {
924
+ результат = символ >= "0" и символ <= "9"
925
+ }
926
+
927
+ всеобщая функция это-16ичная-цифра-латиницы(символ: Символ): ДаНет
928
+ {
929
+ результат = символ >= "0" и символ <= "9" или
930
+ символ >= "A" и символ <= "F" или
931
+ символ >= "a" и символ <= "f"
932
+ }
933
+
934
+ всеобщая функция это-16ичная-цифра-кириллицы(символ: Символ): ДаНет
935
+ {
936
+ результат = символ >= "0" и символ <= "9" или
937
+ символ >= "А" и символ <= "Е" или
938
+ символ >= "а" и символ <= "е"
939
+ }
940
+
941
+ всеобщая функция это-2ичная-цифра(символ: Символ): ДаНет
942
+ {
943
+ результат = символ == "0" или символ == "1"
944
+ }
945
+
946
+ всеобщая функция это-цифра-или-разделитель-цифр(символ: Символ): ДаНет
947
+ {
948
+ результат = это-цифра(символ) или символ == "_"
949
+ }
950
+
951
+ всеобщая функция это-начало-имени(символ: Символ): ДаНет
952
+ {
953
+ результат = это-буква(символ) или символ == "_"
954
+ }
955
+
956
+ всеобщая функция это-часть-имени(символ: Символ): ДаНет
957
+ {
958
+ результат = это-начало-имени(символ) или это-цифра(символ) или символ == "-"
959
+ }
960
+
961
+ всеобщая функция это-единицы-числоед(символ: Символ): ДаНет
962
+ {
963
+ результат = это-буква(символ)
964
+ }
965
+
966
+ всеобщая функция это-простое-имя(текст-без-кавычек: Текст): ДаНет
967
+ {
968
+ пусть индекс = 0
969
+ конст длина = текст-без-кавычек.длина
970
+ если индекс >= длина или это-начало-имени(текст.символ-по-позиции(индекс))
971
+ {
972
+ вернуть нет
973
+ }
974
+ индекс += 1
975
+ пока индекс < длина
976
+ {
977
+ если не (это-часть-имени(текст.символ-по-позиции(индекс)))
978
+ {
979
+ вернуть нет
980
+ }
981
+ индекс += 1
982
+ }
983
+ если индекс == длина и текст.символ-по-позиции(индекс) == "-"
984
+ {
985
+ вернуть нет
986
+ }
987
+ вернуть да
988
+ }
989
+ }
990
+
991
+ тип ПозицияТекста = простой объект
992
+ {
993
+ строка: Целое
994
+ столбец: Целое
995
+ }