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; |