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