home *** CD-ROM | disk | FTP | other *** search
- UNIT Parser;
-
-
- INTERFACE
-
- USES Global, ScanCode;
-
- PROCEDURE Programm (ESets: Symbolmenge);
-
-
- IMPLEMENTATION
-
-
- PROCEDURE Programm (ESets: Symbolmenge);
-
- VAR ExtFP: ExtFileP;
-
-
- PROCEDURE Block (ESets: Symbolmenge; ESet: Symbol; PInf: KonstP);
-
- VAR LastSymb: Symbol; Stop: BOOLEAN;
-
-
- (*$I DECLARE.PAS *)
-
-
- PROCEDURE Body (ESets: Symbolmenge);
-
- VAR
- StackTop,TopNew,StkMax: INTEGER;
- templocc :KonstP;
- SaveId: ALPHA;
- KonstPtrIndex: INTEGER;
- KonstPtr: CstPtrArray;
- i,ProcEntryLab,ProcSize: INTEGER;
- MaxLC,SavLocStk1: AddressRange;
- locc: KonstP;
- ActLab: LabPointer;
-
-
- PROCEDURE Statement (ESets: Symbolmenge);
-
- LABEL 1;
-
- VAR locc: KonstP; ActLab: LabPointer;
-
-
- PROCEDURE Expression (ESets: Symbolmenge);
- FORWARD;
-
-
- PROCEDURE Selector (ESets: Symbolmenge;
- BezPtr: KonstP;
- VAR TopNew,StkMax: INTEGER;
- VAR KonstPtr: CstPtrArray;
- VAR KonstPtrIndex: INTEGER;
- VAR PInf: KonstP);
-
- VAR
- LastAttr: Attribut;
- locc: KonstP;
- ActSize,lmin,lmax: INTEGER;
-
- BEGIN
- WITH BezPtr^,Attr DO BEGIN
- TyPtr := BezType; Art := IsVar;
- CASE Klass OF
- VarClass: IF VarKind = Actual THEN BEGIN
- Zugriff := Direkt; VarBSt := VarsBSt;
- OffSet := VarAddr
- END
- ELSE BEGIN
- G2T(54,BSt-VarsBSt,VarAddr,NilPtr,TopNew,StkMax);
- Zugriff := Indirekt; IOffSet := 0
- END;
- FieldClass: WITH DispVec[LastBSt] DO
- IF OccursIn = IsRec THEN BEGIN
- Zugriff := Direkt; VarBSt := KonstBSt;
- OffSet := KonstOffSet+FieldAddress
- END
- ELSE BEGIN
- IF BSt = 1 THEN
- G1T(39,VarOffSet,NilPtr,TopNew,StkMax)
- ELSE
- G2T(54,0,VarOffSet,NilPtr,TopNew,StkMax);
- Zugriff := Indirekt; IOffSet := FieldAddress
- END;
- FuncClass: IF IsDeclDas = Standard THEN BEGIN
- Error(150); TyPtr := NIL
- END
- ELSE BEGIN
- IF IsKind = Formal THEN
- Error(151)
- ELSE IF (ProcBSt+1 <> BSt) OR (PInf <> BezPtr) THEN
- Error(177);
- Zugriff := Direkt; VarBSt := ProcBSt+1;
- OffSet := 0; (* LCAFTERMARKSTACK; REL.ADR. FKTRESULT *)
- END
- END (* CASE *)
- END; (* WITH *)
- IF NOT (Symb IN SelectSys+ESets) THEN BEGIN
- Error(59); Recover(SelectSys+ESets)
- END;
- WHILE Symb IN SelectSys DO BEGIN
- IF Symb = lBrack THEN BEGIN
- REPEAT
- LastAttr := Attr;
- WITH LastAttr DO
- IF TyPtr <> NIL THEN
- IF TyPtr^.Form <> Arrays THEN BEGIN
- Error(138); TyPtr := NIL
- END;
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- GetSymbol;
- Expression(ESets+[CommaSymb,rBrack]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(113)
- ELSE IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- IF LastAttr.TyPtr <> NIL THEN
- WITH LastAttr.TyPtr^ DO BEGIN
- IF IsCompatible(IndexType,Attr.TyPtr) THEN BEGIN
- IF IndexType<>NIL THEN BEGIN
- GetBounds(IndexType,lmin,lmax);
- IF Debug THEN
- G2T(45,lmin,lmax,IntPtr,TopNew,StkMax);
- IF lmin > 0 THEN
- G1T(31,lmin,IntPtr,TopNew,StkMax)
- ELSE IF lmin < 0 THEN
- G1T(34,-lmin,IntPtr,TopNew,StkMax);
- END
- END
- ELSE Error(139);
- WITH Attr DO BEGIN
- TyPtr := ElemType; Art := IsVar;
- Zugriff := Indirekt; IOffSet := 0
- END;
- IF Attr.TyPtr <> NIL THEN BEGIN
- ActSize := Attr.TyPtr^.Size;
- G1(36,ActSize,TopNew,StkMax,KonstPtr)
- END
- END (* WITH *)
- UNTIL Symb <> CommaSymb;
- IF Symb = rBrack THEN GetSymbol ELSE Error(12)
- END (* IF SYMB = LBRACK *)
- ELSE IF Symb = UpTo THEN BEGIN
- WITH Attr DO BEGIN
- IF TyPtr <> NIL THEN
- IF TyPtr^.Form<>Records THEN BEGIN
- Error(140); TyPtr := NIL
- END;
- GetSymbol;
- IF Symb = Bezeich THEN BEGIN
- IF TyPtr <> NIL THEN BEGIN
- FindRecFields(TyPtr^.FirstField,locc);
- IF locc = NIL THEN BEGIN
- Error(152); TyPtr := NIL
- END
- ELSE
- WITH locc^ DO BEGIN
- TyPtr := BezType;
- CASE Zugriff OF
- Direkt : OffSet := OffSet+FieldAddress;
- Indirekt: IOffSet := IOffSet+FieldAddress;
- Indexed : Error(400)
- END
- END
- END; (* IF TYPTR<>NIL *)
- GetSymbol
- END (* IF SYMB = BEZEICH *)
- ELSE Error(2)
- END (* WITH ATTR *)
- END (* ELSE IF SYMB = UPTO *)
- ELSE BEGIN
- IF Attr.TyPtr <> NIL THEN
- WITH Attr,TyPtr^ DO
- IF Form = Pointers THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- TyPtr := ElType;
- IF Debug THEN G2T(45,1,MaxAddr,NilPtr,TopNew,StkMax);
- WITH Attr DO BEGIN
- Art := IsVar; Zugriff := Indirekt; IOffSet := 0
- END
- END
- ELSE IF Form = Files THEN TyPtr := FileType
- ELSE Error(141);
- GetSymbol
- END; (* ELSE *)
- IF NOT (Symb IN ESets+SelectSys) THEN BEGIN
- Error(6); Recover(ESets+SelectSys)
- END
- END; (* WHILE SYMB IN SELECTSYS *)
- END; (* Selector *)
-
-
- (*$I PROCCALL.PAS *)
- (*$I EXPRESS.PAS *)
-
- PROCEDURE Assignment (BezPtr: KonstP);
-
- VAR LastAttr: Attribut;
-
- BEGIN
- Selector(ESets+[AssignTo],BezPtr,TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Symb = AssignTo THEN BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF (Attr.Zugriff <> Direkt) OR (Attr.TyPtr^.Form>Power) THEN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LastAttr := Attr;
- GetSymbol; Expression(ESets);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <= Power THEN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex)
- ELSE
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN BEGIN
- IF IsCompatible(RealPtr,LastAttr.TyPtr) THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(10,TopNew,StkMax); Attr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(71 (*LFT*),TopNew,StkMax); Attr.TyPtr := RealPtr
- END;
- END
- ELSE IF IsCompatible(LongPtr,LastAttr.TyPtr) THEN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax); Attr.TyPtr := LongPtr
- END;
- IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
- CASE LastAttr.TyPtr^.Form OF
- Scalar,
- SubRange:
- BEGIN
- IF Debug THEN CheckBounds(LastAttr.TyPtr,TopNew,StkMax);
- Store(LastAttr,TopNew,StkMax)
- END;
- Pointers:
- BEGIN
- IF Debug THEN G2T(45,0,MaxAddr,NilPtr,TopNew,StkMax);
- Store(LastAttr,TopNew,StkMax)
- END;
- Power:
- Store(LastAttr,TopNew,StkMax);
- Arrays,
- Records:
- G1(40,LastAttr.TyPtr^.Size,TopNew,StkMax,KonstPtr);
- Files:
- Error(146)
- END
- ELSE Error(129)
- END
- END
- ELSE Error(51);
- END; (* Assignment *)
-
-
- PROCEDURE GotoStatement;
-
- VAR
- ActLab: LabPointer;
- Found: BOOLEAN;
- SaveTop, SaveTop1: DispRange;
-
- BEGIN
- IF Symb = IntConst THEN BEGIN
- Found := FALSE;
- SaveTop := DispTop;
- WHILE DispVec[SaveTop].OccursIn <> IsBlock DO SaveTop := SaveTop-1;
- SaveTop1 := SaveTop;
- REPEAT
- ActLab := DispVec[SaveTop].FirstLab;
- WHILE (ActLab <> NIL) AND NOT Found DO
- WITH ACTLAB^ DO
- IF LabValue = LastConstVal.GanzeZahl THEN BEGIN
- Found := TRUE;
- IF SaveTop = SaveTop1 THEN GCase(57,LabName,TopNew,StkMax)
- ELSE Error(399)
- END
- ELSE ActLab := NextLab;
- SaveTop := SaveTop-1
- UNTIL Found OR (SaveTop = 0);
- IF NOT Found THEN Error(167);
- GetSymbol
- END
- ELSE Error(15);
- END; (* GotoStatement *)
-
-
- PROCEDURE CompoundStatement;
-
- BEGIN
- REPEAT
- REPEAT
- Statement(ESets+[Semicolon,EndSymb])
- UNTIL NOT (Symb IN StatStartSymb);
- Stop := Symb <> Semicolon;
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- IF Symb = EndSymb THEN GetSymbol ELSE Error(13);
- END; (* CompoundStatement *)
-
-
- PROCEDURE IfStatement;
-
- VAR JumpLab1,JumpLab2: INTEGER;
-
- BEGIN
- Expression(ESets+[ThenSy]);
- GLab(JumpLab1);
- GJump(JumpLab1,TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF Symb = ThenSy THEN GetSymbol ELSE Error(52);
- Statement(ESets+[ElseSymb]);
- IF Symb = ElseSymb THEN BEGIN
- GLab(JumpLab2); GCase(57,JumpLab2,TopNew,StkMax);
- PushLabel(JumpLab1);
- GetSymbol; Statement(ESets);
- PushLabel(JumpLab2)
- END
- ELSE PushLabel(JumpLab1)
- END; (* IfStatement *)
-
-
- PROCEDURE CaseStatement;
-
- LABEL 1;
-
- TYPE
- CaseTabPtr = ^CaseTable;
- CaseTable = PACKED RECORD
- Next: CaseTabPtr;
- LabStart: INTEGER;
- LabNo: INTEGER
- END;
-
- VAR
- SavSP,SavSP1: StP;
- FirstPointer,CasTab1,CasTab2,CasTab3: CaseTabPtr;
- SavVal: Value;
- ToAddr,JumpLab,JumpLab1,lmin,lmax: INTEGER;
-
- BEGIN
- Expression(ESets+[OfSymb,CommaSymb,ColonSymb]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- GLab(JumpLab);
- SavSP := Attr.TyPtr;
- IF SavSP <> NIL THEN
- IF (SavSP^.Form <> Scalar) OR (SavSP = RealPtr) THEN BEGIN
- Error(144); SavSP := NIL
- END
- ELSE IF NOT IsCompatible(SavSP,IntPtr) THEN
- G0T(58,SavSP,TopNew,StkMax);
- GCase(57,JumpLab,TopNew,StkMax);
- IF Symb = OfSymb THEN GetSymbol ELSE Error(8);
- FirstPointer := NIL; GLab(ToAddr);
- REPEAT
- CasTab3 := NIL; GLab(JumpLab1);
- IF NOT(Symb IN [Semicolon,EndSymb]) THEN BEGIN
- REPEAT
- GConstant(ESets+[CommaSymb,ColonSymb],SavSP1,SavVal);
- IF SavSP <> NIL THEN
- IF IsCompatible(SavSP,SavSP1) THEN BEGIN
- CasTab1 := FirstPointer; CasTab2 := NIL;
- WHILE CasTab1 <> NIL DO
- WITH CasTab1^ DO BEGIN
- IF LabNo <= SavVal.GanzeZahl THEN BEGIN
- IF LabNo = SavVal.GanzeZahl THEN Error(156);
- GOTO 1
- END;
- CasTab2 := CasTab1; CasTab1 := Next
- END;
- 1:
- New(CasTab3);
- WITH CasTab3^ DO BEGIN
- Next := CasTab1; LabNo := SavVal.GanzeZahl;
- LabStart := JumpLab1;
- END;
- IF CasTab2 = NIL THEN FirstPointer := CasTab3
- ELSE CasTab2^.Next := CasTab3
- END
- ELSE Error(147);
- Stop := Symb <> CommaSymb;
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- IF Symb = ColonSymb THEN GetSymbol ELSE Error(5);
- PushLabel(JumpLab1);
- REPEAT
- Statement(ESets+[Semicolon])
- UNTIL NOT (Symb IN StatStartSymb);
- IF CasTab3 <> NIL THEN
- GCase(57,ToAddr,TopNew,StkMax)
- END;
- Stop := Symb <> Semicolon;
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- PushLabel(JumpLab);
- IF FirstPointer <> NIL THEN BEGIN
- lmax := FirstPointer^.LabNo;
- CasTab1 := FirstPointer; FirstPointer := NIL;
- REPEAT
- CasTab2 := CasTab1^.Next; CasTab1^.Next := FirstPointer;
- FirstPointer := CasTab1; CasTab1 := CasTab2
- UNTIL CasTab1 = NIL;
- lmin := FirstPointer^.LabNo;
- IF lmax-lmin < MaxCases THEN BEGIN
- G2T(45,lmin,lmax,IntPtr,TopNew,StkMax);
- G2(51,1,lmin,TopNew,StkMax,KonstPtr);
- G0(21,TopNew,StkMax); GLab(JumpLab);
- GCase(44,JumpLab,TopNew,StkMax);
- PushLabel(JumpLab);
- REPEAT
- WITH FirstPointer^ DO BEGIN
- WHILE LabNo>lmin DO BEGIN
- G0(60,TopNew,StkMax);
- lmin := lmin+1
- END;
- GCase(57,LabStart,TopNew,StkMax);
- FirstPointer := Next; lmin := lmin+1
- END
- UNTIL FirstPointer = NIL;
- PushLabel(ToAddr)
- END
- ELSE Error(157)
- END;
- IF Symb = EndSymb THEN GetSymbol ELSE Error(13)
- END; (* CaseStatement *)
-
-
- PROCEDURE RepeatStatement;
-
- VAR ToAddr: INTEGER;
-
- BEGIN
- GLab(ToAddr); PushLabel(ToAddr);
- REPEAT
- Statement(ESets+[Semicolon,UntilSymb]);
- IF Symb IN StatStartSymb THEN Error(14)
- UNTIL NOT (Symb IN StatStartSymb);
- WHILE Symb = Semicolon DO BEGIN
- GetSymbol;
- REPEAT
- Statement(ESets+[Semicolon,UntilSymb]);
- IF Symb IN StatStartSymb THEN Error(14)
- UNTIL NOT (Symb IN StatStartSymb);
- END;
- IF Symb = UntilSymb THEN BEGIN
- GetSymbol;
- Expression(ESets);
- GJump(ToAddr,TopNew,StkMax,KonstPtr,KonstPtrIndex)
- END
- ELSE Error(53)
- END; (* RepeatStatement *)
-
-
- PROCEDURE WhileStatement;
-
- VAR ToAddr,JumpLab: INTEGER;
-
- BEGIN
- GLab(ToAddr); PushLabel(ToAddr);
- Expression(ESets+[DoSymb]); GLab(JumpLab);
- GJump(JumpLab,TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF Symb = DoSymb THEN GetSymbol ELSE Error(54);
- Statement(ESets); GCase(57,ToAddr,TopNew,StkMax); PushLabel(JumpLab);
- END; (* WhileStatement *)
-
-
- PROCEDURE ForStatement;
-
- VAR
- LastAttr: Attribut;
- SavSP: StP;
- LastSymb: Symbol;
- JumpLab,ToAddr: INTEGER;
- SavLocStk: AddressRange;
-
- BEGIN
- SavLocStk := LocStk;
- WITH LastAttr DO BEGIN
- TyPtr := NIL; Art := IsVar;
- Zugriff := Direkt; VarBSt := Bst; OffSet := 0
- END;
- IF Symb = Bezeich THEN BEGIN
- FindeBez([VarClass],locc);
- WITH locc^,LastAttr DO BEGIN
- TyPtr := BezType; Art := IsVar;
- IF VarKind = Actual THEN BEGIN
- Zugriff := Direkt; VarBSt := VarsBSt; OffSet := VarAddr
- END
- ELSE BEGIN
- Error(155); TyPtr := NIL
- END
- END;
- IF LastAttr.TyPtr <> NIL THEN
- IF (LastAttr.TyPtr^.Form > SubRange) OR
- IsCompatible(RealPtr,LastAttr.TyPtr) OR
- IsCompatible(LongPtr,LastAttr.TyPtr) THEN BEGIN
- Error(143); LastAttr.TyPtr := NIL
- END;
- GetSymbol
- END
- ELSE BEGIN
- Error(2); Recover(ESets+[AssignTo,ToSymb,DownToSymb,DoSymb])
- END;
- IF Symb = AssignTo THEN BEGIN
- GetSymbol; Expression(ESets+[ToSymb,DownToSymb,DoSymb]);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(144)
- ELSE IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- Store(LastAttr,TopNew,StkMax)
- END
- ELSE Error(145)
- END
- ELSE BEGIN
- Error(51); Recover(ESets+[ToSymb,DownToSymb,DoSymb])
- END;
- IF Symb IN [ToSymb,DownToSymb] THEN BEGIN
- LastSymb := Symb; GetSymbol; Expression(ESets+[DoSymb]);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(144)
- ELSE IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF NOT IsCompatible(LastAttr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- G2T(56,0,LocStk,IntPtr,TopNew,StkMax);
- GLab(ToAddr); PushLabel(ToAddr);
- Attr := LastAttr;
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- G2T(54,0,LocStk,IntPtr,TopNew,StkMax);
- LocStk := LocStk+IntSize;
- IF ICount>MaxLC THEN MaxLC := LocStk;
- IF LastSymb = ToSymb THEN
- G2(52,Ord('i'),1,TopNew,StkMax,KonstPtr)
- ELSE
- G2(48,Ord('i'),1,TopNew,StkMax,KonstPtr);
- END
- ELSE Error(145)
- END
- ELSE BEGIN
- Error(55); Recover(ESets+[DoSymb])
- END;
- GLab(JumpLab); GCase(33,JumpLab,TopNew,StkMax);
- IF Symb = DoSymb THEN GetSymbol ELSE Error(54);
- Statement(ESets);
- Attr := LastAttr;
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF LastSymb = ToSymb THEN G1T(34,1,Attr.TyPtr,TopNew,StkMax)
- ELSE G1T(31,1,Attr.TyPtr,TopNew,StkMax);
- Store(LastAttr,TopNew,StkMax);
- GCase(57,ToAddr,TopNew,StkMax);
- PushLabel(JumpLab);
- LocStk := SavLocStk
- END; (* ForStatement *)
-
-
- PROCEDURE WithStatement;
-
- VAR
- locc: KonstP;
- NoOfWithElems: DispRange;
- SavLocStk: AddressRange;
-
- BEGIN
- NoOfWithElems := 0; SavLocStk := LocStk;
- REPEAT
- IF Symb = Bezeich THEN BEGIN
- FindeBez([VarClass,FieldClass],locc); GetSymbol
- END
- ELSE BEGIN
- Error(2); locc := UVarPtr
- END;
- Selector(ESets+[CommaSymb,DoSymb],locc,TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form = Records THEN
- IF DispTop < MaxDispVec THEN BEGIN
- DispTop := DispTop+1; NoOfWithElems := NoOfWithElems+1;
- WITH DispVec[DispTop] DO BEGIN
- FirstDeclID := Attr.TyPtr^.FirstField;
- FirstLab := NIL
- END;
- IF Attr.Zugriff = Direkt THEN
- WITH DispVec[DispTop] DO BEGIN
- OccursIn := IsRec; KonstBst := Attr.VarBSt;
- KonstOffSet := Attr.OffSet
- END
- ELSE BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G2T(56,0,LocStk,NilPtr,TopNew,StkMax);
- WITH DispVec[DispTop] DO BEGIN
- OccursIn := InVariantRec; VarOffSet := LocStk
- END;
- LocStk := LocStk+PtrSize;
- IF LocStk>MaxLC THEN MaxLC := LocStk
- END
- END
- ELSE Error(250)
- ELSE Error(140);
- Stop := Symb <> CommaSymb;
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- IF Symb = DoSymb THEN GetSymbol ELSE Error(54);
- Statement(ESets);
- DispTop := DispTop-NoOfWithElems; LocStk := SavLocStk
- END; (* WithStatement *)
-
-
- BEGIN (* Statement *)
- IF Symb = IntConst THEN BEGIN
- ActLab := DispVec[Bst].FirstLab;
- WHILE ActLab <> NIL DO
- WITH ACTLAB^ DO
- IF LabValue = LastConstVal.GanzeZahl THEN BEGIN
- IF Defined THEN Error(165);
- PushLabel(LabName); Defined := TRUE;
- GOTO 1
- END
- ELSE ActLab := NextLab;
- Error(167);
- 1:
- GetSymbol;
- IF Symb = ColonSymb THEN GetSymbol ELSE Error(5)
- END;
- IF NOT (Symb IN ESets+[Bezeich]) THEN BEGIN
- Error(6); Recover(ESets)
- END;
- IF Symb IN StatStartSymb+[Bezeich] THEN BEGIN
- CASE Symb OF
- Bezeich : BEGIN
- FindeBez([VarClass,FieldClass,FuncClass,ProcClass],
- locc);
- GetSymbol;
- IF locc^.Klass = ProcClass THEN
- CallProcedure(ESets,locc)
- ELSE
- Assignment(locc)
- END;
- BeginSymb : BEGIN GetSymbol; CompoundStatement END;
- GotoSymb : BEGIN GetSymbol; GotoStatement END;
- IfSymb : BEGIN GetSymbol; IfStatement END;
- CaseSymb : BEGIN GetSymbol; CaseStatement END;
- WhileSymb : BEGIN GetSymbol; WhileStatement END;
- RepeatSymb: BEGIN GetSymbol; RepeatStatement END;
- ForSymb : BEGIN GetSymbol; ForStatement END;
- WithSymb : BEGIN GetSymbol; WithStatement END
- END;
- IF NOT (Symb IN [Semicolon,EndSymb,ElseSymb,UntilSymb]) THEN BEGIN
- Error(6); Recover(ESets)
- END
- END;
- END;
-
- BEGIN (* Body *)
- IF PInf <> NIL THEN ProcEntryLab := PINF^.ProcLabel
- ELSE GLab(ProcEntryLab);
- KonstPtrIndex := 0;
- TopNew := VirginLocStk;
- StkMax := VirginLocStk;
- PushLabel(ProcEntryLab);GLab(ProcSize); GLab(StackTop);
- GProcCall(32,1,ProcSize,TopNew,StkMax);
- GProcCall(32,2,StackTop,TopNew,StkMax);
- IF PInf <> NIL THEN BEGIN
- SavLocStk1 := VirginLocStk;
- locc := PINF^.Next;
- WHILE locc <> NIL DO
- WITH locc^ DO BEGIN
- IF Klass = VarClass THEN
- IF BezType <> NIL THEN
- IF BezType^.Form > Power THEN BEGIN
- IF VarKind = Actual THEN BEGIN
- G2(50,0,VarAddr,TopNew,StkMax,KonstPtr);
- G2T(54,0,SavLocStk1,NilPtr,TopNew,StkMax);
- G1(40,BezType^.Size,TopNew,StkMax,KonstPtr)
- END;
- SavLocStk1 := SavLocStk1+PtrSize;
- END
- ELSE SavLocStk1 := SavLocStk1+BezType^.Size;
- locc := locc^.Next;
- END;
- END;
- MaxLC := LocStk;
- REPEAT
- REPEAT
- Statement(ESets+[Semicolon,EndSymb])
- UNTIL NOT (Symb IN StatStartSymb);
- Stop := Symb <> Semicolon;
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- IF Symb = EndSymb THEN GetSymbol ELSE Error(13);
- ActLab := DispVec[DispTop].FirstLab;
- WHILE ActLab <> NIL DO
- WITH ACTLAB^ DO BEGIN
- IF NOT Defined THEN Error(168);
- ActLab := NextLab;
- END;
- IF PInf <> NIL THEN BEGIN
- GenPopDBG;
- IF PINF^.BezType = NIL THEN
- G1(42,Ord('p'),TopNew,StkMax,KonstPtr)
- ELSE
- G0T(42(*RET*),PINF^.BezType,TopNew,StkMax);
- IF IsPrtCode THEN BEGIN
- WriteLn(Dat,'l ',ProcSize:4,' = ',MaxLC);
- WriteLn(Dat,'l ',StackTop:4,' = ',StkMax)
- END
- END
- ELSE BEGIN
- GenPopDBG;
- G1(42(*RET*),Ord('p'),TopNew,StkMax,KonstPtr);
- IF IsPrtCode THEN BEGIN
- WriteLn(Dat,'l ',ProcSize:4,' = ',MaxLC);
- WriteLn(Dat,'l ',StackTop:4,' = ',StkMax);
- WriteLn(Dat,'q')
- END;
- ICount := 0;
- G1(41,0,TopNew,StkMax,KonstPtr);
- GProcCall(46,0,ProcEntryLab,TopNew,StkMax);
- G0(29,TopNew,StkMax);
- IF IsPrtCode THEN WriteLn(Dat,'q');
- SaveId := Bez;
- WHILE FExtFileP <> NIL DO BEGIN
- WITH FExtFileP^ DO
- IF NOT ((FileName = 'INPUT ') OR (FileName = 'OUTPUT '))
- THEN BEGIN
- Bez := FileName;
- FindeBez([VarClass],templocc);
- IF templocc^.BezType <> NIL THEN
- IF templocc^.BezType^.Form <> Files THEN Error(172);
- END;
- FExtFileP := FExtFileP^.NextFile
- END;
- Bez := SaveId;
- END;
- END; (* Body *)
-
-
- BEGIN (* Block *)
- DP := TRUE;
- REPEAT
- IF Symb = LabelSymb THEN BEGIN
- GetSymbol; LabelDeclaration(Stop,ESets)
- END;
- IF Symb = ConstSymb THEN BEGIN
- GetSymbol; ConstDeclaration(ESets)
- END;
- IF Symb = TypeSymb THEN BEGIN
- GetSymbol; TypeDeclaration(Stop,ESets)
- END;
- IF Symb = VarSymb THEN BEGIN
- GetSymbol; VarDeclaration(Stop,ESets)
- END;
- WHILE Symb IN [ProcSymb,FuncSymb] DO BEGIN
- LastSymb := Symb;
- GetSymbol;
- ProcDeclaration(LastSymb,Stop,ESets)
- END;
- IF Symb <> BeginSymb THEN BEGIN
- Error(18); Recover(ESets)
- END
- UNTIL (Symb IN StatStartSymb) OR Eof(Source);
- DP := FALSE;
- IF Symb = BeginSymb THEN GetSymbol ELSE Error(17);
- REPEAT
- Body(ESets+[CaseSymb]);
- IF Symb <> ESet THEN BEGIN
- Error(6); Recover(ESets)
- END
- UNTIL ((Symb = ESet) OR (Symb IN BlockStartSy)) OR Eof(Source);
- END; (* Block *)
-
-
- BEGIN (* Programm *)
- IF Symb = ProgSymb THEN BEGIN
- GetSymbol;
- IF Symb <> Bezeich THEN Error(2);
- GetSymbol;
- IF NOT (Symb IN [lBraces,Semicolon]) THEN Error(14);
- IF Symb = lBraces THEN BEGIN
- REPEAT
- GetSymbol;
- IF Symb = Bezeich THEN BEGIN
- New(ExtFP);
- WITH ExtFP^ DO BEGIN
- FileName := Bez; NextFile := FExtFileP
- END;
- FExtFileP := ExtFP;
- GetSymbol;
- IF NOT (Symb IN [CommaSymb,rBrace]) THEN Error(20)
- END
- ELSE Error(2)
- UNTIL Symb <> CommaSymb;
- IF Symb <> rBrace THEN Error(4);
- GetSymbol
- END;
- IF Symb <> Semicolon THEN Error(14)
- ELSE GetSymbol;
- END;
- REPEAT
- Block(ESets,UpTo,NIL);
- IF Symb <> UpTo THEN Error(21)
- UNTIL (Symb = UpTo) OR Eof(Source);
- IF ErrorIndex <> 0 THEN BEGIN
- ErrorIndex := 0; DoEoLn;
- END;
- END;
-
-
- BEGIN
- END.