Subversion Repositories Kolibri OS

Rev

Rev 6613 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6613 Rev 7107
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016 Anton Krotov
2
    Copyright 2016, 2017 Anton Krotov
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
    This file is part of Compiler.
4
    This file is part of Compiler.
5
 
5
 
Line 41... Line 41...
41
  IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9;
41
  IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9;
Line 42... Line 42...
42
 
42
 
43
  stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8;
43
  stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8;
44
  stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15;
44
  stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15;
45
  stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22;
45
  stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22;
Line 46... Line 46...
46
  stBITS = 23; stLSR = 24; stLENGTH = 25;
46
  stBITS = 23; stLSR = 24; stLENGTH = 25; stMIN = 26; stMAX = 27;
47
 
47
 
Line 48... Line 48...
48
  sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105;
48
  sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105;
49
  sysCODE = 106; sysTYPEID = 107; sysMOVE = 108;
49
  sysCODE = 106; sysTYPEID = 107; sysMOVE = 108; sysCOPY = 109;
Line 50... Line 50...
50
 
50
 
Line 259... Line 259...
259
PROCEDURE Check*(key: INTEGER);
259
PROCEDURE Check*(key: INTEGER);
260
VAR code: INTEGER;
260
VAR code: INTEGER;
261
BEGIN
261
BEGIN
262
  IF SCAN.tLex # key THEN
262
  IF SCAN.tLex # key THEN
263
    CASE key OF
263
    CASE key OF
264
    |lxMODULE:	code := 21
264
    |lxMODULE:  code := 21
265
    |lxIDENT:	code := 22
265
    |lxIDENT:   code := 22
266
    |lxSemi:	code := 23
266
    |lxSemi:    code := 23
267
    |lxEND:	code := 24
267
    |lxEND:     code := 24
268
    |lxDot:	code := 25
268
    |lxDot:     code := 25
269
    |lxEQ:	code := 35
269
    |lxEQ:      code := 35
270
    |lxRRound:	code := 38
270
    |lxRRound:  code := 38
271
    |lxTO:	code := 40
271
    |lxTO:      code := 40
272
    |lxOF:	code := 41
272
    |lxOF:      code := 41
273
    |lxRCurly:	code := 51
273
    |lxRCurly:  code := 51
274
    |lxLRound:	code := 56
274
    |lxLRound:  code := 56
275
    |lxComma:	code := 61
275
    |lxComma:   code := 61
276
    |lxTHEN:	code := 98
276
    |lxTHEN:    code := 98
277
    |lxRSquare: code := 109
277
    |lxRSquare: code := 109
278
    |lxDO:	code := 118
278
    |lxDO:      code := 118
279
    |lxUNTIL:	code := 119
279
    |lxUNTIL:   code := 119
280
    |lxAssign:	code := 120
280
    |lxAssign:  code := 120
281
    |lxRETURN:	code := 124
281
    |lxRETURN:  code := 124
282
    |lxColon:	code := 157
282
    |lxColon:   code := 157
283
    ELSE
283
    ELSE
284
    END;
284
    END;
285
    Assert2(FALSE, code)
285
    Assert2(FALSE, code)
286
  END
286
  END
287
END Check;
287
END Check;
Line 384... Line 384...
384
END PushSysType;
384
END PushSysType;
Line 385... Line 385...
385
 
385
 
386
PROCEDURE StIdent;
386
PROCEDURE StIdent;
387
BEGIN
387
BEGIN
388
  Guard;
388
  Guard;
389
  PushStProc("ABS",	 stABS);
389
  PushStProc("ABS",      stABS);
390
  PushStProc("ASR",	 stASR);
390
  PushStProc("ASR",      stASR);
391
  PushStProc("ASSERT",	 stASSERT);
391
  PushStProc("ASSERT",   stASSERT);
392
  PushStType("BOOLEAN",  TBOOLEAN);
392
  PushStType("BOOLEAN",  TBOOLEAN);
393
  PushStType("CHAR",	 TCHAR);
393
  PushStType("CHAR",     TCHAR);
394
  PushStProc("CHR",	 stCHR);
394
  PushStProc("CHR",      stCHR);
395
  PushStProc("COPY",	 stCOPY);
395
  PushStProc("COPY",     stCOPY);
396
  PushStProc("DEC",	 stDEC);
396
  PushStProc("DEC",      stDEC);
397
  PushStProc("DISPOSE",  stDISPOSE);
397
  PushStProc("DISPOSE",  stDISPOSE);
398
  PushStProc("EXCL",	 stEXCL);
398
  PushStProc("EXCL",     stEXCL);
399
  PushStProc("FLOOR",	 stFLOOR);
399
  PushStProc("FLOOR",    stFLOOR);
400
  PushStProc("FLT",	 stFLT);
400
  PushStProc("FLT",      stFLT);
401
  PushStProc("INC",	 stINC);
401
  PushStProc("INC",      stINC);
402
  PushStProc("INCL",	 stINCL);
402
  PushStProc("INCL",     stINCL);
403
  PushStType("INTEGER",  TINTEGER);
403
  PushStType("INTEGER",  TINTEGER);
404
  PushStProc("LEN",	 stLEN);
404
  PushStProc("LEN",      stLEN);
405
  PushStProc("LSL",	 stLSL);
405
  PushStProc("LSL",      stLSL);
406
  PushStProc("LONG",	 stLONG);
406
  PushStProc("LONG",     stLONG);
407
  PushStType("LONGREAL", TLONGREAL);
407
  PushStType("LONGREAL", TLONGREAL);
408
  PushStProc("NEW",	 stNEW);
408
  PushStProc("NEW",      stNEW);
409
  PushStProc("ODD",	 stODD);
409
  PushStProc("ODD",      stODD);
410
  PushStProc("ORD",	 stORD);
410
  PushStProc("ORD",      stORD);
411
  PushStProc("PACK",	 stPACK);
411
  PushStProc("PACK",     stPACK);
412
  PushStType("REAL",	 TREAL);
412
  PushStType("REAL",     TREAL);
413
  PushStProc("ROR",	 stROR);
413
  PushStProc("ROR",      stROR);
414
  PushStType("SET",	 TSET);
414
  PushStType("SET",      TSET);
415
  PushStProc("SHORT",	 stSHORT);
415
  PushStProc("SHORT",    stSHORT);
416
  PushStProc("UNPK",	 stUNPK);
416
  PushStProc("UNPK",     stUNPK);
417
  PushStProc("BITS",	 stBITS);
417
  PushStProc("BITS",     stBITS);
418
  PushStProc("LSR",	 stLSR);
418
  PushStProc("LSR",      stLSR);
-
 
419
  PushStProc("LENGTH",   stLENGTH);
-
 
420
  PushStProc("MIN",      stMIN);
419
  PushStProc("LENGTH",	 stLENGTH);
421
  PushStProc("MAX",      stMAX);
420
  Guard
422
  Guard
Line 421... Line 423...
421
END StIdent;
423
END StIdent;
422
 
424
 
Line 426... Line 428...
426
  res := NIL;
428
  res := NIL;
427
  cur := Unit.IdentBegin.Next(IDENT);
429
  cur := Unit.IdentBegin.Next(IDENT);
428
  WHILE (cur # NIL) & (cur.iType # IDGUARD) DO
430
  WHILE (cur # NIL) & (cur.iType # IDGUARD) DO
429
    IF cur.Name = Name THEN
431
    IF cur.Name = Name THEN
430
      IF (Unit # unit) & ~cur.Export THEN
432
      IF (Unit # unit) & ~cur.Export THEN
431
	res := NIL
433
        res := NIL
432
      ELSE
434
      ELSE
433
	res := cur
435
        res := cur
434
      END;
436
      END;
435
      cur := NIL
437
      cur := NIL
436
    ELSE
438
    ELSE
437
      cur := cur.Next(IDENT)
439
      cur := cur.Next(IDENT)
438
    END
440
    END
Line 531... Line 533...
531
    Assert(~((Op = lxSlash) & (Ta.tType = TINTEGER)), coord, 37);
533
    Assert(~((Op = lxSlash) & (Ta.tType = TINTEGER)), coord, 37);
532
    IF Ta.tType IN TNUM THEN
534
    IF Ta.tType IN TNUM THEN
533
      Res := Arith(a, b, Ta, Op, coord)
535
      Res := Arith(a, b, Ta, Op, coord)
534
    ELSIF Ta.tType = TSET THEN
536
    ELSIF Ta.tType = TSET THEN
535
      CASE Op OF
537
      CASE Op OF
536
      |lxPlus:	Res := LONG(FLT(ORD(BITS(ai) + BITS(bi))))
538
      |lxPlus:  Res := LONG(FLT(ORD(BITS(ai) + BITS(bi))))
537
      |lxMinus: Res := LONG(FLT(ORD(BITS(ai) - BITS(bi))))
539
      |lxMinus: Res := LONG(FLT(ORD(BITS(ai) - BITS(bi))))
538
      |lxMult:	Res := LONG(FLT(ORD(BITS(ai) * BITS(bi))))
540
      |lxMult:  Res := LONG(FLT(ORD(BITS(ai) * BITS(bi))))
539
      |lxSlash: Res := LONG(FLT(ORD(BITS(ai) / BITS(bi))))
541
      |lxSlash: Res := LONG(FLT(ORD(BITS(ai) / BITS(bi))))
540
      ELSE
542
      ELSE
541
      END
543
      END
542
    ELSE
544
    ELSE
543
      Assert(FALSE, coord, 37)
545
      Assert(FALSE, coord, 37)
Line 634... Line 636...
634
      NextCheck(lxIDENT);
636
      NextCheck(lxIDENT);
635
      Name := SCAN.id;
637
      Name := SCAN.id;
636
      NamePtrBase := Name;
638
      NamePtrBase := Name;
637
      id := GetQIdent(Unit, Name);
639
      id := GetQIdent(Unit, Name);
638
      IF Unit # unit THEN
640
      IF Unit # unit THEN
639
	Assert2(id # NIL, 42);
641
        Assert2(id # NIL, 42);
640
	Assert2(id.iType = IDTYPE, 77);
642
        Assert2(id.iType = IDTYPE, 77);
641
	Coord(coord);
643
        Coord(coord);
642
	Next;
644
        Next;
643
	Res := id.T
645
        Res := id.T
644
      ELSE
646
      ELSE
645
	IF id = NIL THEN
647
        IF id = NIL THEN
646
	  Assert2((unit.Level = 3) & unit.typedecl, 42);
648
          Assert2((unit.Level = 3) & unit.typedecl, 42);
647
	  Coord(coord);
649
          Coord(coord);
648
	  Next;
650
          Next;
649
	  Res := NIL
651
          Res := NIL
650
	ELSE
652
        ELSE
651
	  Assert2(id.iType = IDTYPE, 77);
653
          Assert2(id.iType = IDTYPE, 77);
652
	  Coord(coord);
654
          Coord(coord);
653
	  Next;
655
          Next;
654
	  Res := id.T
656
          Res := id.T
655
	END
657
        END
656
      END
658
      END
657
    ELSE
659
    ELSE
658
      Assert2(FALSE, 77)
660
      Assert2(FALSE, 77)
659
    END
661
    END
660
  END
662
  END
Line 687... Line 689...
687
  END;
689
  END;
688
  WHILE cur # NIL DO
690
  WHILE cur # NIL DO
689
    cur.T := Tf;
691
    cur.T := Tf;
690
    IF Rec THEN
692
    IF Rec THEN
691
      IF Tf.Align > Tr.Align THEN
693
      IF Tf.Align > Tr.Align THEN
692
	Tr.Align := Tf.Align
694
        Tr.Align := Tf.Align
693
      END;
695
      END;
694
      IF Tr.Rec = record THEN
696
      IF Tr.Rec = record THEN
695
	cur.Offset := FieldOffset(Tf.Align, Tr.Size);
697
        cur.Offset := FieldOffset(Tf.Align, Tr.Size);
696
	Assert2(cur.Offset <= SCAN.maxINT - Tf.Size, 83);
698
        Assert2(cur.Offset <= SCAN.maxINT - Tf.Size, 83);
697
	Tr.Size := cur.Offset + Tf.Size
699
        Tr.Size := cur.Offset + Tf.Size
698
      ELSIF Tr.Rec = noalign THEN
700
      ELSIF Tr.Rec = noalign THEN
699
	cur.Offset := FieldOffset(1, Tr.Size);
701
        cur.Offset := FieldOffset(1, Tr.Size);
700
	Assert2(cur.Offset <= SCAN.maxINT - Tf.Size, 83);
702
        Assert2(cur.Offset <= SCAN.maxINT - Tf.Size, 83);
701
	Tr.Size := cur.Offset + Tf.Size
703
        Tr.Size := cur.Offset + Tf.Size
702
      ELSIF Tr.Rec = union THEN
704
      ELSIF Tr.Rec = union THEN
703
	IF Tf.Size > Tr.Size THEN
705
        IF Tf.Size > Tr.Size THEN
704
	  Tr.Size := Tf.Size
706
          Tr.Size := Tf.Size
705
	END;
707
        END;
706
	cur.Offset := 0
708
        cur.Offset := 0
707
      END
709
      END
708
    ELSE
710
    ELSE
709
      Tr.Len := Tr.Len + 4 * (ORD((Tf.tType = TRECORD) & cur.ByRef) + Dim(Tf) + ORD((Tf.tType = TLONGREAL) & ~cur.ByRef) + 1)
711
      Tr.Len := Tr.Len + 4 * (ORD((Tf.tType = TRECORD) & cur.ByRef) + Dim(Tf) + ORD((Tf.tType = TLONGREAL) & ~cur.ByRef) + 1)
710
    END;
712
    END;
711
    cur := cur.Next(FIELD)
713
    cur := cur.Next(FIELD)
Line 732... Line 734...
732
  res := TRUE;
734
  res := TRUE;
733
  WHILE (T # NIL) & res DO
735
  WHILE (T # NIL) & res DO
734
    field := GetField(T, Name);
736
    field := GetField(T, Name);
735
    IF field # NIL THEN
737
    IF field # NIL THEN
736
      IF (field.Unit = unit) OR field.Export THEN
738
      IF (field.Unit = unit) OR field.Export THEN
737
	res := FALSE
739
        res := FALSE
738
      END
740
      END
739
    END;
741
    END;
740
    T := T.Base
742
    T := T.Base
741
  END
743
  END
742
  RETURN res
744
  RETURN res
743
END Unique;
745
END Unique;
Line 744... Line 746...
744
 
746
 
745
PROCEDURE notrecurs(id: BOOLEAN; T: pTYPE): BOOLEAN;
747
PROCEDURE notrecurs(id: BOOLEAN; T: pTYPE): BOOLEAN;
746
  RETURN ~(id & (unit.Idents.Last(IDENT).iType = IDTYPE) & (unit.Idents.Last(IDENT).T = T) &
748
  RETURN ~(id & (unit.Idents.Last(IDENT).iType = IDTYPE) & (unit.Idents.Last(IDENT).T = T) &
747
	  (T.tType IN TSTRUCT))
749
          (T.tType IN TSTRUCT))
Line 748... Line 750...
748
END notrecurs;
750
END notrecurs;
749
 
751
 
750
PROCEDURE ReadFields(T: pTYPE);
752
PROCEDURE ReadFields(T: pTYPE);
Line 774... Line 776...
774
      Tf:= pParseType(coord);
776
      Tf:= pParseType(coord);
775
      Assert(Tf # NIL, coord, 42);
777
      Assert(Tf # NIL, coord, 42);
776
      Assert(notrecurs(id_T, Tf), coord, 96);
778
      Assert(notrecurs(id_T, Tf), coord, 96);
777
      SetFields(T, Tf, TRUE);
779
      SetFields(T, Tf, TRUE);
778
      IF SCAN.tLex = lxSemi THEN
780
      IF SCAN.tLex = lxSemi THEN
779
	NextCheck(lxIDENT)
781
        NextCheck(lxIDENT)
780
      ELSE
782
      ELSE
781
	Assert2(SCAN.tLex = lxEND, 86)
783
        Assert2(SCAN.tLex = lxEND, 86)
782
      END
784
      END
783
    ELSE
785
    ELSE
784
      Assert2(FALSE, 85)
786
      Assert2(FALSE, 85)
785
    END
787
    END
786
  END
788
  END
Line 817... Line 819...
817
      ProgSize := ProgSize + n;
819
      ProgSize := ProgSize + n;
818
      Assert2(ProgSize <= SCAN.maxINT - UTILS.Align(ProgSize), 93);
820
      Assert2(ProgSize <= SCAN.maxINT - UTILS.Align(ProgSize), 93);
819
      ProgSize := ProgSize + UTILS.Align(ProgSize)
821
      ProgSize := ProgSize + UTILS.Align(ProgSize)
820
    ELSE
822
    ELSE
821
      IF cur.VarKind = 0 THEN
823
      IF cur.VarKind = 0 THEN
822
	cur.Offset := curBlock.ParamSize - curBlock.VarSize - n
824
        cur.Offset := curBlock.ParamSize - curBlock.VarSize - n
823
      ELSE
825
      ELSE
824
	cur.Offset := curBlock.VarSize - 8 + 4 * (cur.Level + ORD((cur.VarKind = paramvar) & (T.tType = TRECORD)))
826
        cur.Offset := curBlock.VarSize - 8 + 4 * (cur.Level + ORD((cur.VarKind = paramvar) & (T.tType = TRECORD)))
825
      END
827
      END
826
    END;
828
    END;
827
    Assert2(curBlock.VarSize <= SCAN.maxINT - n, 93);
829
    Assert2(curBlock.VarSize <= SCAN.maxINT - n, 93);
828
    curBlock.VarSize := curBlock.VarSize + n;
830
    curBlock.VarSize := curBlock.VarSize + n;
829
    Assert2(curBlock.VarSize <= SCAN.maxINT - UTILS.Align(curBlock.VarSize), 93);
831
    Assert2(curBlock.VarSize <= SCAN.maxINT - UTILS.Align(curBlock.VarSize), 93);
Line 899... Line 901...
899
    IF proc THEN
901
    IF proc THEN
900
      PushIdent(Name, coord, IDVAR, NIL, NIL, FALSE, 0);
902
      PushIdent(Name, coord, IDVAR, NIL, NIL, FALSE, 0);
901
      INC(curBlock.ParamCount);
903
      INC(curBlock.ParamCount);
902
      fp := unit.Idents.Last(IDENT);
904
      fp := unit.Idents.Last(IDENT);
903
      IF ByRef THEN
905
      IF ByRef THEN
904
	fp.VarKind := paramvar
906
        fp.VarKind := paramvar
905
      ELSE
907
      ELSE
906
	fp.VarKind := param
908
        fp.VarKind := param
907
      END
909
      END
908
    END;
910
    END;
909
    Next;
911
    Next;
910
    IF SCAN.tLex = lxComma THEN
912
    IF SCAN.tLex = lxComma THEN
911
      NextCheck(lxIDENT)
913
      NextCheck(lxIDENT)
Line 913... Line 915...
913
      Next;
915
      Next;
914
      Tf := FormalType(coord);
916
      Tf := FormalType(coord);
915
      Assert(Dim(Tf) <= X86.ADIM, coord, 110);
917
      Assert(Dim(Tf) <= X86.ADIM, coord, 110);
916
      SetFields(T, Tf, FALSE);
918
      SetFields(T, Tf, FALSE);
917
      IF proc THEN
919
      IF proc THEN
918
	SetVars(Tf)
920
        SetVars(Tf)
919
      END;
921
      END;
920
      cont := FALSE
922
      cont := FALSE
921
    ELSE
923
    ELSE
922
      Assert2(FALSE, 85)
924
      Assert2(FALSE, 85)
923
    END
925
    END
Line 930... Line 932...
930
  IF (SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxVAR) THEN
932
  IF (SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxVAR) THEN
931
    break := FALSE;
933
    break := FALSE;
932
    REPEAT
934
    REPEAT
933
      Section(T);
935
      Section(T);
934
      IF SCAN.tLex = lxSemi THEN
936
      IF SCAN.tLex = lxSemi THEN
935
	Next
937
        Next
936
      ELSE
938
      ELSE
937
	break := TRUE
939
        break := TRUE
938
      END
940
      END
939
    UNTIL break
941
    UNTIL break
940
  END
942
  END
941
END ParamType;
943
END ParamType;
Line 1052... Line 1054...
1052
    IF SCAN.tLex = lxLRound THEN
1054
    IF SCAN.tLex = lxLRound THEN
1053
      NextCoord(coord2);
1055
      NextCoord(coord2);
1054
      Check(lxIDENT);
1056
      Check(lxIDENT);
1055
      nov.Base := IdType(coord);
1057
      nov.Base := IdType(coord);
1056
      Assert(nov.Base # NIL, coord, 42);
1058
      Assert(nov.Base # NIL, coord, 42);
-
 
1059
      IF (nov.Base.tType = TPOINTER) & (nov.Base.Base.tType = TRECORD) THEN
-
 
1060
          nov.Base := nov.Base.Base
-
 
1061
      END;
1057
      Assert(nov.Base.tType = TRECORD, coord, 80);
1062
      Assert(nov.Base.tType = TRECORD, coord, 80);
1058
      Assert(notrecurs(TRUE, nov.Base), coord, 96);
1063
      Assert(notrecurs(TRUE, nov.Base), coord, 96);
1059
      nov.Size := nov.Base.Size;
1064
      nov.Size := nov.Base.Size;
1060
      nov.Align := nov.Base.Align;
1065
      nov.Align := nov.Base.Align;
1061
      Check(lxRRound);
1066
      Check(lxRRound);
Line 1192... Line 1197...
1192
      IdentDef;
1197
      IdentDef;
1193
      PushIdent(Name, coord, IDTYPE, NIL, NIL, Export, 0);
1198
      PushIdent(Name, coord, IDTYPE, NIL, NIL, Export, 0);
1194
      last := unit.Idents.Last(IDENT);
1199
      last := unit.Idents.Last(IDENT);
1195
      Check(lxEQ);
1200
      Check(lxEQ);
1196
      Next;
1201
      Next;
-
 
1202
 
-
 
1203
      IF SCAN.tLex = lxIDENT THEN
-
 
1204
        last.T := ParseType(coord)
-
 
1205
      ELSE
1197
      NEW(NewType);
1206
        NEW(NewType);
1198
      MemErr(NewType = NIL);
1207
        MemErr(NewType = NIL);
1199
      last.T := NewType;
1208
        last.T := NewType;
1200
      T := StructType(FALSE, NewType);
1209
        T := StructType(FALSE, NewType)
-
 
1210
      END;
-
 
1211
 
1201
      Check(lxSemi);
1212
      Check(lxSemi);
1202
      Next
1213
      Next
1203
    END
1214
    END
1204
  END;
1215
  END;
1205
  LinkPtr;
1216
  LinkPtr;
Line 1208... Line 1219...
1208
    Next;
1219
    Next;
1209
    WHILE SCAN.tLex = lxIDENT DO
1220
    WHILE SCAN.tLex = lxIDENT DO
1210
      IdentDef;
1221
      IdentDef;
1211
      PushIdent(Name, coord, IDVAR, NIL, NIL, Export, 0);
1222
      PushIdent(Name, coord, IDVAR, NIL, NIL, Export, 0);
1212
      IF SCAN.tLex = lxComma THEN
1223
      IF SCAN.tLex = lxComma THEN
1213
	NextCheck(lxIDENT)
1224
        NextCheck(lxIDENT)
1214
      ELSIF SCAN.tLex = lxColon THEN
1225
      ELSIF SCAN.tLex = lxColon THEN
1215
	NextCoord(coord);
1226
        NextCoord(coord);
1216
	T := ParseType(coord);
1227
        T := ParseType(coord);
1217
	Assert(T # NIL, coord, 42);
1228
        Assert(T # NIL, coord, 42);
1218
	SetVars(T);
1229
        SetVars(T);
1219
	Check(lxSemi);
1230
        Check(lxSemi);
1220
	Next
1231
        Next
1221
      ELSE
1232
      ELSE
1222
	Assert2(FALSE, 85)
1233
        Assert2(FALSE, 85)
1223
      END
1234
      END
1224
    END
1235
    END
1225
  END;
1236
  END;
1226
  WHILE SCAN.tLex = lxPROCEDURE DO
1237
  WHILE SCAN.tLex = lxPROCEDURE DO
1227
    NextCoord(coord);
1238
    NextCoord(coord);
Line 1235... Line 1246...
1235
    id := unit.Idents.Last(IDENT);
1246
    id := unit.Idents.Last(IDENT);
1236
    addproc;
1247
    addproc;
1237
    id.Proc := curproc;
1248
    id.Proc := curproc;
1238
    IF id.Export & main THEN
1249
    IF id.Export & main THEN
1239
      IF Platform IN {1, 6} THEN
1250
      IF Platform IN {1, 6} THEN
1240
	curproc.used := TRUE;
1251
        curproc.used := TRUE;
1241
	Assert((Name # SCAN._START) & (Name # SCAN._version), coord, 133)
1252
        Assert((Name # SCAN._START) & (Name # SCAN._version), coord, 133)
1242
      END;
1253
      END;
1243
      X86.ProcExport(id.Number, Name, X86.NewLabel())
1254
      X86.ProcExport(id.Number, Name, X86.NewLabel())
1244
    END;
1255
    END;
1245
    id.Parent := curBlock;
1256
    id.Parent := curBlock;
1246
    curBlock := id;
1257
    curBlock := id;
Line 1264... Line 1275...
1264
      UTILS.UnitLine(UnitNumber, SCAN.coord.line);
1275
      UTILS.UnitLine(UnitNumber, SCAN.coord.line);
1265
      NextCoord(coord);
1276
      NextCoord(coord);
1266
      Expr(e);
1277
      Expr(e);
1267
      Assert(AssComp(e, curBlock.T.Base, FALSE), coord, 125);
1278
      Assert(AssComp(e, curBlock.T.Base, FALSE), coord, 125);
1268
      IF e.eType = eVAR THEN
1279
      IF e.eType = eVAR THEN
1269
	X86.Load(e.T.tType)
1280
        X86.Load(e.T.tType)
1270
      END
1281
      END
1271
    ELSE
1282
    ELSE
1272
      Assert2(SCAN.tLex # lxRETURN, 123)
1283
      Assert2(SCAN.tLex # lxRETURN, 123)
1273
    END;
1284
    END;
1274
    Check(lxEND);
1285
    Check(lxEND);
Line 1333... Line 1344...
1333
    IF u = NIL THEN
1344
    IF u = NIL THEN
1334
      self := unit;
1345
      self := unit;
1335
      SCAN.Backup(unit.scanner);
1346
      SCAN.Backup(unit.scanner);
1336
      COPY(name.Name, FName);
1347
      COPY(name.Name, FName);
1337
      IF ~((~self.Std & pReadModule(Path, FName, UTILS.Ext)) OR pReadModule(Std, FName, UTILS.Ext)) THEN
1348
      IF ~((~self.Std & pReadModule(Path, FName, UTILS.Ext)) OR pReadModule(Std, FName, UTILS.Ext)) THEN
1338
	IF FName = "SYSTEM" THEN
1349
        IF FName = "SYSTEM" THEN
1339
	  unit := sys;
1350
          unit := sys;
1340
	  self.sys := TRUE
1351
          self.sys := TRUE
1341
	ELSE
1352
        ELSE
1342
	  Assert(FALSE, namecoord, 32)
1353
          Assert(FALSE, namecoord, 32)
1343
	END
1354
        END
1344
      END;
1355
      END;
1345
      SCAN.Recover(self.scanner);
1356
      SCAN.Recover(self.scanner);
1346
      u := unit;
1357
      u := unit;
1347
      unit := self;
1358
      unit := self;
1348
      UTILS.SetFile(unit.File)
1359
      UTILS.SetFile(unit.File)
Line 1361... Line 1372...
1361
  cond := 0;
1372
  cond := 0;
1362
  WHILE cond # 4 DO
1373
  WHILE cond # 4 DO
1363
    Next;
1374
    Next;
1364
    CASE cond OF
1375
    CASE cond OF
1365
    |0: Check(lxIDENT);
1376
    |0: Check(lxIDENT);
1366
	name := SCAN.id;
1377
        name := SCAN.id;
1367
	Coord(coord);
1378
        Coord(coord);
1368
	Coord(namecoord);
1379
        Coord(namecoord);
1369
	alias := name;
1380
        alias := name;
1370
	cond := 1
1381
        cond := 1
1371
    |1: CASE SCAN.tLex OF
1382
    |1: CASE SCAN.tLex OF
1372
	|lxComma:  AddUnit(0)
1383
        |lxComma:  AddUnit(0)
1373
	|lxSemi:   AddUnit(4); Next
1384
        |lxSemi:   AddUnit(4); Next
1374
	|lxAssign: cond := 2
1385
        |lxAssign: cond := 2
1375
	ELSE
1386
        ELSE
1376
	  Assert2(FALSE, 28)
1387
          Assert2(FALSE, 28)
1377
	END
1388
        END
1378
    |2: Check(lxIDENT);
1389
    |2: Check(lxIDENT);
1379
	name := SCAN.id;
1390
        name := SCAN.id;
1380
	Coord(namecoord);
1391
        Coord(namecoord);
1381
	cond := 3
1392
        cond := 3
1382
    |3: CASE SCAN.tLex OF
1393
    |3: CASE SCAN.tLex OF
1383
	|lxComma: AddUnit(0)
1394
        |lxComma: AddUnit(0)
1384
	|lxSemi:  AddUnit(4); Next
1395
        |lxSemi:  AddUnit(4); Next
1385
	ELSE
1396
        ELSE
1386
	  Assert2(FALSE, 29)
1397
          Assert2(FALSE, 29)
1387
	END
1398
        END
1388
    ELSE
1399
    ELSE
1389
    END
1400
    END
1390
  END
1401
  END
1391
END ImportList;
1402
END ImportList;
Line 1407... Line 1418...
1407
PROCEDURE Pseudo;
1418
PROCEDURE Pseudo;
1408
VAR temp: UNIT;
1419
VAR temp: UNIT;
1409
BEGIN
1420
BEGIN
1410
  temp := unit;
1421
  temp := unit;
1411
  Header(SCAN.AddNode("SYSTEM"));
1422
  Header(SCAN.AddNode("SYSTEM"));
1412
  PushSysProc("ADR",	 sysADR);
1423
  PushSysProc("ADR",     sysADR);
1413
  PushSysProc("SIZE",	 sysSIZE);
1424
  PushSysProc("SIZE",    sysSIZE);
1414
  PushSysProc("TYPEID",  sysTYPEID);
1425
  PushSysProc("TYPEID",  sysTYPEID);
1415
  PushSysProc("GET",	 sysGET);
1426
  PushSysProc("GET",     sysGET);
1416
  PushSysProc("PUT",	 sysPUT);
1427
  PushSysProc("PUT",     sysPUT);
1417
  PushSysProc("CODE",	 sysCODE);
1428
  PushSysProc("CODE",    sysCODE);
1418
  PushSysProc("MOVE",	 sysMOVE);
1429
  PushSysProc("MOVE",    sysMOVE);
-
 
1430
  PushSysProc("COPY",    sysCOPY);
1419
  PushSysProc("INF",	 sysINF);
1431
  PushSysProc("INF",     sysINF);
1420
  PushSysType("CARD16",  TCARD16);
1432
  PushSysType("CARD16",  TCARD16);
1421
  sys := unit;
1433
  sys := unit;
1422
  unit := temp
1434
  unit := temp
1423
END Pseudo;
1435
END Pseudo;
Line 1529... Line 1541...
1529
    proc.used := TRUE;
1541
    proc.used := TRUE;
1530
    cur := proc.Procs.First(IDENT);
1542
    cur := proc.Procs.First(IDENT);
1531
    WHILE cur # NIL DO
1543
    WHILE cur # NIL DO
1532
      p := cur.Proc(Proc);
1544
      p := cur.Proc(Proc);
1533
      IF ~p.used THEN
1545
      IF ~p.used THEN
1534
	ProcHandling(p)
1546
        ProcHandling(p)
1535
      END;
1547
      END;
1536
      cur := cur.Next(IDENT)
1548
      cur := cur.Next(IDENT)
1537
    END;
1549
    END;
1538
  END ProcHandling;
1550
  END ProcHandling;