home *** CD-ROM | disk | FTP | other *** search
- PROCEDURE CallProcedure (ESets: Symbolmenge; BezPtr: KonstP);
-
- VAR StdProcIndex: 1..17; Umfang: INTEGER;
-
-
- PROCEDURE Variable (ESets: Symbolmenge;
- VAR TopNew,StkMax: INTEGER;
- VAR KonstPtr: CstPtrArray;
- VAR KonstPtrIndex: INTEGER;
- VAR PInf: KonstP);
-
- VAR locc: KonstP;
-
- BEGIN
- IF Symb = Bezeich THEN BEGIN
- FindeBez([VarClass,FieldClass],locc); GetSymbol
- END
- ELSE BEGIN
- Error(2); locc := UVarPtr
- END;
- Selector(ESets,locc,TopNew,StkMax,KonstPtr,KonstPtrIndex,PInf);
- END;
-
-
- FUNCTION FileOperation: BOOLEAN;
-
- VAR ok: BOOLEAN;
-
- BEGIN
- ok := FALSE;
- Variable(ESets+[rBrace],TopNew,StkMax,KonstPtr,KonstPtrIndex,PInf);
- WITH Attr DO
- IF TyPtr = NIL THEN Error(2)
- ELSE IF TyPtr^.Form <> Files THEN Error(116)
- ELSE BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex); (* FIBADRESSE *)
- G2(51,(*LDC*)1(*I*),TyPtr^.Size-1,TopNew,StkMax,KonstPtr);
- (* LAENGE DES FILEPUFFERS *)
- ok := TRUE;
- END;
- FileOperation := ok
- END;
-
-
- PROCEDURE GetPut;
-
- BEGIN
- IF FileOperation THEN G1(30,StdProcIndex,TopNew,StkMax,KonstPtr)
- END;
-
-
- PROCEDURE Close;
-
- BEGIN
- Variable(ESets+[rBrace],TopNew,StkMax,KonstPtr,KonstPtrIndex,PInf);
- WITH Attr DO
- IF TyPtr <> NIL THEN
- IF TyPtr^.Form <> Files THEN Error(116)
- ELSE BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G2(51,(*LDC*)1,TyPtr^.Size-1,TopNew,StkMax,KonstPtr);
- (* FILEPUFFERLAENGE*)
- G1(30,33(*CLS*),TopNew,StkMax,KonstPtr)
- END
- END;
-
-
- FUNCTION OpenFile: BOOLEAN;
-
- VAR IsTextFile, ok: BOOLEAN;
-
- BEGIN
- ok := FALSE;
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- WITH Attr DO
- IF TyPtr <> NIL THEN
- IF TyPtr^.Form <> Files THEN Error(116)
- ELSE BEGIN
- IsTextFile := TyPtr^.FileType = CharPtr;
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- (* LAENGE FILEPUFFER *)
- G2(51(*LDC*),1,TyPtr^.Size-1,TopNew,StkMax,KonstPtr);
- END;
- IF Symb <> CommaSymb THEN Error(20)
- ELSE BEGIN
- GetSymbol; Expression(ESets+[rBrace]);
- IF Attr.TyPtr = NIL THEN Error(116)
- ELSE PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G2(51,1,Attr.TyPtr^.Size,TopNew,StkMax,KonstPtr);
- ok := TRUE;
- END;
- G2(51,1,Ord(IsTextFile),TopNew,StkMax,KonstPtr);
- OpenFile := ok;
- END;
-
-
- PROCEDURE ReWrite;
-
- BEGIN
- IF OpenFile THEN G1(30,31(*RWR*),TopNew,StkMax,KonstPtr);
- END;
-
-
- PROCEDURE ReSet;
-
- BEGIN
- IF OpenFile THEN G1(30,32(*RES*),TopNew,StkMax,KonstPtr)
- END;
-
-
- PROCEDURE Read;
-
- VAR
- locc: KonstP;
- ActBSt: BStRange;
- ToAddr: AddressRange;
- SavSP:StP;
-
- BEGIN
- ActBSt := 1; ToAddr := VirginLocStk;
- IF Symb = lBraces THEN BEGIN
- GetSymbol;
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- SavSP := Attr.TyPtr; Stop := FALSE;
- IF SavSP <> NIL THEN
- IF SavSP^.Form = Files THEN
- WITH Attr,SavSP^ DO BEGIN
- IF FileType = CharPtr THEN BEGIN
- ActBSt := VarBSt; ToAddr := OffSet
- END
- ELSE Error(399);
- IF Symb = rBrace THEN BEGIN
- IF StdProcIndex = 5 THEN Error(116);
- Stop := TRUE
- END
- ELSE IF Symb <> CommaSymb THEN BEGIN
- Error(116);
- Recover(ESets+[CommaSymb,rBrace])
- END;
- IF Symb = CommaSymb THEN BEGIN
- GetSymbol;
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- END
- ELSE Stop := TRUE
- END; (* WITH *)
- IF NOT Stop THEN
- REPEAT
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <= SubRange THEN
- IF IsCompatible(IntPtr,Attr.TyPtr) THEN
- G1(30,3,TopNew,StkMax,KonstPtr)
- ELSE IF IsCompatible(RealPtr,Attr.TyPtr) THEN
- G1(30,4,TopNew,StkMax,KonstPtr)
- ELSE IF IsCompatible(CharPtr,Attr.TyPtr) THEN
- G1(30,5,TopNew,StkMax,KonstPtr)
- ELSE IF IsCompatible(LongPtr,Attr.TyPtr) THEN
- G1(30,29(*RDL*),TopNew,StkMax,KonstPtr)
- ELSE Error(399)
- ELSE Error(116);
- Stop := Symb<>CommaSymb;
- IF NOT Stop THEN BEGIN
- GetSymbol;
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf)
- END
- UNTIL Stop;
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END (* IF SYMB = LBRACES *)
- ELSE IF StdProcIndex = 5 THEN Error(116);
- IF StdProcIndex = 11 THEN BEGIN
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,21,TopNew,StkMax,KonstPtr)
- END;
- END;
-
-
- PROCEDURE Write;
-
- VAR
- SavSP: StP;
- Default: BOOLEAN;
- IsStdProc: 1..17;
- locc: KonstP;
- ActBSt: BStRange;
- ToAddr,SLaenge: AddressRange;
-
- BEGIN
- IsStdProc := StdProcIndex; ActBSt := 1; ToAddr := VirginLocStk+2;
- IF Symb = lBraces THEN BEGIN
- GetSymbol;
- Expression(ESets+[CommaSymb,ColonSymb,rBrace]);
- SavSP := Attr.TyPtr; Stop := FALSE;
- IF SavSP <> NIL THEN
- IF SavSP^.Form = Files THEN
- WITH Attr,SavSP^ DO BEGIN
- IF FileType = CharPtr THEN BEGIN
- ActBSt := VarBSt;
- ToAddr := OffSet (* +FIBSIZE+ORD(ODD(DPLMT)) *)
- END
- ELSE Error(125);
- IF Symb = rBrace THEN BEGIN
- IF IsStdProc = 6 THEN Error(116);
- Stop := TRUE
- END
- ELSE IF Symb <> CommaSymb THEN BEGIN
- Error(116);
- Recover(ESets+[CommaSymb,rBrace])
- END;
- IF Symb = CommaSymb THEN BEGIN
- GetSymbol;
- Expression(ESets+[CommaSymb,ColonSymb,rBrace]);
- END
- ELSE Stop := TRUE
- END (* WITH *)
- ELSE ;
- IF NOT Stop THEN
- REPEAT
- SavSP := Attr.TyPtr;
- IF SavSP <> NIL THEN
- IF SavSP^.Form <= SubRange THEN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex)
- ELSE
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- (* IF LSP=REALPTR THEN GEN2(51,7,0); *)
- IF Symb = ColonSymb THEN BEGIN
- GetSymbol;
- Expression(ESets+[CommaSymb,ColonSymb,rBrace]);
- IF Attr.TyPtr <> NIL THEN
- IF (Attr.TyPtr <> IntPtr) AND (Attr.TyPtr <> LongPtr) THEN
- Error(166);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- Default := FALSE
- END
- ELSE Default := TRUE;
- IF Symb = ColonSymb THEN BEGIN
- GetSymbol;
- Expression(ESets+[CommaSymb,rBrace]);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> IntPtr THEN Error(116);
- IF SavSP <> RealPtr THEN Error(124);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- (* DEF1 := FALSE; *)
- END
- ELSE (* DEF1 := TRUE; *)
- IF SavSP = IntPtr THEN BEGIN
- IF Default THEN
- G2(51,1,1,TopNew,StkMax,KonstPtr);
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,6,TopNew,StkMax,KonstPtr)
- END
- ELSE IF SavSP = RealPtr THEN BEGIN
- IF Default THEN
- G2(51,1,10,TopNew,StkMax,KonstPtr);
- (* IF DEF1 THEN GEN2(51,1,4); *)
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,8,TopNew,StkMax,KonstPtr)
- END
- ELSE IF SavSP = CharPtr THEN BEGIN
- IF Default THEN
- G2(51,1,1,TopNew,StkMax,KonstPtr);
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,9,TopNew,StkMax,KonstPtr)
- END
- ELSE IF SavSP = LongPtr THEN BEGIN
- IF Default THEN
- G2(51,1,1,TopNew,StkMax,KonstPtr);
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,30(*WRL*),TopNew,StkMax,KonstPtr);
- END
- ELSE IF SavSP <> NIL THEN BEGIN
- IF SavSP^.Form = Scalar THEN Error(399)
- ELSE IF Strng(SavSP) THEN BEGIN
- SLaenge := SavSP^.Size DIV CharMax;
- IF Default THEN
- G2(51,1,SLaenge,TopNew,StkMax,KonstPtr);
- G2(51,1,SLaenge,TopNew,StkMax,KonstPtr);
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,10,TopNew,StkMax,KonstPtr)
- END
- ELSE Error(116)
- END;
- Stop := Symb <> CommaSymb;
- IF NOT Stop THEN BEGIN
- GetSymbol; (*GEN2(51,7,0); *)
- Expression(ESets+[CommaSymb,ColonSymb,rBrace])
- END
- UNTIL Stop;
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END (* IF SYMB = LBRACES *)
- ELSE IF StdProcIndex = 6 THEN Error(116);
- IF IsStdProc = 12 THEN BEGIN
- G2(50,Bst-ActBSt,ToAddr,TopNew,StkMax,KonstPtr);
- G1(30,22,TopNew,StkMax,KonstPtr)
- END;
- END;
-
-
- PROCEDURE Pack;
-
- VAR
- SavSP,SavSP1: StP;
- LastAttr: Attribut;
- Moved: INTEGER;
-
- BEGIN
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- SavSP := NIL; SavSP1 := NIL;
- IF Attr.TyPtr <> NIL THEN
- WITH Attr.TyPtr^ DO
- IF Form = Arrays THEN BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LastAttr := Attr; SavSP := IndexType; SavSP1 := ElemType;
- END
- ELSE Error(116);
- IF Symb = CommaSymb THEN GetSymbol ELSE Error(20);
- Expression(ESets+[CommaSymb,rBrace]);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(116)
- ELSE IF NOT IsCompatible(SavSP,Attr.TyPtr) THEN Error(116)
- ELSE BEGIN (* ALLES OK *)
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- (* STARTINDEX AUF STACK *)
- WITH LastAttr.TyPtr^ DO BEGIN
- G2(51,1,INDEXTYPE^.Min.GanzeZahl,TopNew,StkMax,KonstPtr);
- (* LOWBOUND AUF STACK *)
- G0(21(* SBI *),TopNew,StkMax);
- G2(51,(* LDC *)1,ELEMTYPE^.Size,TopNew,StkMax,KonstPtr);
- (* SIZE(TYP(QUELLE)) AUF STACK *)
- G0(15(* MPI *),TopNew,StkMax);
- G0(2(* ADI *),TopNew,StkMax);
- END;
- END;
- IF Symb = CommaSymb THEN GetSymbol ELSE Error(20);
- Variable(ESets+[rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- WITH Attr.TyPtr^ DO
- IF Form = Arrays THEN BEGIN
- IF NOT IsCompatible(ElemType,SavSP1)
- OR NOT IsCompatible(IndexType,SavSP) THEN
- Error(116)
- ELSE (* OK *) BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- WITH Attr.TyPtr^ DO BEGIN
- Moved := (INDEXTYPE^.Max.GanzeZahl-INDEXTYPE^.Min.GanzeZahl+1)
- * ELEMTYPE^.Size;
- G1(40,(* MOV *)Moved,TopNew,StkMax,KonstPtr);
- END
- END
- END
- ELSE Error(116);
- END;
-
-
- PROCEDURE UnPack;
-
- VAR SavSP,SavSP1: StP;
-
- BEGIN
- Error(399);
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- SavSP := NIL; SavSP1 := NIL;
- IF Attr.TyPtr <> NIL THEN
- WITH Attr.TyPtr^ DO
- IF Form = Arrays THEN BEGIN
- SavSP := IndexType; SavSP1 := ElemType
- END
- ELSE Error(116);
- IF Symb = CommaSymb THEN GetSymbol ELSE Error(20);
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- WITH Attr.TyPtr^ DO
- IF Form = Arrays THEN BEGIN
- IF NOT IsCompatible(ElemType,SavSP1)
- OR NOT IsCompatible(IndexType,SavSP) THEN
- Error(116)
- END
- ELSE Error(116);
- IF Symb = CommaSymb THEN GetSymbol ELSE Error(20);
- Expression(ESets+[rBrace]);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(116)
- ELSE IF NOT IsCompatible(SavSP,Attr.TyPtr) THEN Error(116);
- END;
-
-
- PROCEDURE New;
-
- LABEL 1;
-
- VAR
- SavSP,SavSP1: StP;
- NoOfVariants,lmin,lmax: INTEGER;
- ActSize,lsz: AddressRange;
- SavVal: Value;
-
- BEGIN
- Variable(ESets+[CommaSymb,rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- SavSP := NIL; NoOfVariants := 0; ActSize := 0;
- IF Attr.TyPtr <> NIL THEN
- WITH Attr.TyPtr^ DO
- IF Form = Pointers THEN BEGIN
- IF ElType <> NIL THEN BEGIN
- ActSize := ElType^.Size;
- IF ElType^.Form = Records THEN SavSP := ElType^.RecVar
- END
- END
- ELSE Error(116);
- WHILE Symb = CommaSymb DO BEGIN
- GetSymbol;
- GConstant(ESets+[CommaSymb,rBrace],SavSP1,SavVal);
- NoOfVariants := NoOfVariants+1;
- IF SavSP = NIL THEN Error(158)
- ELSE IF SavSP^.Form <> TagFld THEN Error(162)
- ELSE IF SavSP^.TagFieldP <> NIL THEN
- IF Strng(SavSP1) OR (SavSP1 = RealPtr) THEN Error(159)
- ELSE IF IsCompatible(SavSP^.TAGFIELDP^.BezType,SavSP1) THEN BEGIN
- SavSP1 := SavSP^.FirstVar;
- WHILE SavSP1 <> NIL DO
- WITH SavSP1^ DO
- IF VarWert.GanzeZahl = SavVal.GanzeZahl THEN BEGIN
- ActSize := Size; SavSP := VarTVar;
- GOTO 1
- END
- ELSE SavSP1 := NxtVar;
- ActSize := SavSP^.Size; SavSP := NIL;
- END
- ELSE Error(116);
- 1:
- END;
- G2(51,1,ActSize,TopNew,StkMax,KonstPtr);
- G1(30,12,TopNew,StkMax,KonstPtr);
- END;
-
-
- (* DISPOSE NEU EINGEFUEGT. P-CODE : "DSP" *)
- PROCEDURE Dispos;
-
- BEGIN
- Variable(ESets+[rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form = Pointers THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G1(30,28(*DSP*),TopNew,StkMax,KonstPtr)
- END
- ELSE Error(116)
- END;
-
-
- PROCEDURE Mark;
-
- BEGIN
- Variable(ESets+[rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form = Pointers THEN BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G1(30,23,TopNew,StkMax,KonstPtr)
- END
- ELSE Error(116);
- END;
-
-
- PROCEDURE Release;
-
- BEGIN
- Variable(ESets+[rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form = Pointers THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G1(30,13,TopNew,StkMax,KonstPtr) END
- ELSE Error(116);
- END;
-
-
- PROCEDURE Abs;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr = IntPtr THEN G0(0,TopNew,StkMax)
- ELSE IF Attr.TyPtr = RealPtr THEN G0(1,TopNew,StkMax)
- ELSE BEGIN Error(125); Attr.TyPtr := IntPtr END;
- END;
-
-
- PROCEDURE Sqr;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr = IntPtr THEN G0(24,TopNew,StkMax)
- ELSE IF Attr.TyPtr = RealPtr THEN G0(25,TopNew,StkMax)
- ELSE BEGIN Error(125); Attr.TyPtr := IntPtr END
- END;
-
-
- PROCEDURE Trunc;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> RealPtr THEN Error(125);
- G0(27,TopNew,StkMax);
- Attr.TyPtr := IntPtr
- END;
-
-
- PROCEDURE Round;
-
- BEGIN
- IF Symb = lBraces THEN BEGIN
- GetSymbol; Expression(ESets+[rBrace]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- END
- ELSE Error(9);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> RealPtr THEN Error(125);
- G1(30,34(*RND*),TopNew,StkMax,KonstPtr);
- Attr.TyPtr := IntPtr;
- IF Symb = rBrace THEN GetSymbol ELSE Error(4);
- END;
-
-
- PROCEDURE Odd;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> IntPtr THEN Error(125);
- G0(20,TopNew,StkMax);
- Attr.TyPtr := BooleanPtr
- END;
-
-
- PROCEDURE Ord;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form >= Power THEN Error(125);
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- Attr.TyPtr := IntPtr
- END;
-
-
- PROCEDURE Chr;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> IntPtr THEN Error(125);
- G0(59,TopNew,StkMax);
- Attr.TyPtr := CharPtr
- END;
-
-
- PROCEDURE PredSucc;
-
- BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN Error(125);
- IF StdProcIndex = 7 THEN G1T(31,1,Attr.TyPtr,TopNew,StkMax)
- ELSE G1T(34,1,Attr.TyPtr,TopNew,StkMax)
- END;
-
-
- PROCEDURE EoFEoLn;
-
- CONST InputOffset = 182;
-
- BEGIN
- IF Symb = lBraces THEN BEGIN
- GetSymbol;
- Variable(ESets+[rBrace],TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END
- ELSE
- WITH Attr DO BEGIN
- TyPtr := TextPtr; Art := IsVar; Zugriff := Direkt;
- VarBSt := 1; OffSet := InputOffset;
- END;
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G2(51,(*LDC*)1,Attr.TyPtr^.Size-1,TopNew,StkMax,KonstPtr);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Files THEN Error(125);
- IF StdProcIndex = 9 THEN G0(8,TopNew,StkMax)
- ELSE G1(30,14,TopNew,StkMax,KonstPtr);
- Attr.TyPtr := BooleanPtr
- END;
-
-
- PROCEDURE ExtendedCall;
-
- VAR
- Nxt,locc: KonstP;
- SavSP: StP;
- LBezArt: BezArt;
- PassFuncProc: BOOLEAN;
- LocParSize,SavLocStk: AddressRange;
-
- BEGIN
- LocParSize := 0;
- WITH BezPtr^ DO BEGIN
- Nxt := Next; LBezArt := IsKind;
- IF NOT Extern THEN G1(41,Bst-ProcBSt,TopNew,StkMax,KonstPtr)
- END;
- IF Symb = lBraces THEN BEGIN
- SavLocStk := LocStk;
- REPEAT
- PassFuncProc := FALSE;
- IF LBezArt = Actual THEN BEGIN
- IF Nxt = NIL THEN Error(126)
- ELSE PassFuncProc := Nxt^.Klass IN [ProcClass,FuncClass]
- END
- ELSE Error(399);
- GetSymbol;
- IF PassFuncProc THEN BEGIN
- Error(399);
- IF Symb <> Bezeich THEN BEGIN
- Error(2); Recover(ESets+[CommaSymb,rBrace])
- END
- ELSE BEGIN
- IF Nxt^.Klass = ProcClass THEN FindeBez([ProcClass],locc)
- ELSE BEGIN
- FindeBez([FuncClass],locc);
- IF NOT IsCompatible(locc^.BezType,Nxt^.BezType) THEN
- Error(128)
- END;
- GetSymbol;
- IF NOT (Symb IN ESets + [CommaSymb,rBrace]) THEN BEGIN
- Error(6); Recover(ESets+[CommaSymb,rBrace])
- END
- END
- END
- ELSE BEGIN
- Expression(ESets+[CommaSymb,rBrace]);
- IF Attr.TyPtr <> NIL THEN
- IF LBezArt = Actual THEN BEGIN
- IF Nxt <> NIL THEN BEGIN
- SavSP := Nxt^.BezType;
- IF SavSP <> NIL THEN BEGIN
- IF (Nxt^.VarKind = Actual) THEN
- IF SavSP^.Form <= Power THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF Debug THEN CheckBounds(SavSP,TopNew,StkMax);
- IF IsCompatible(RealPtr,SavSP) 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,SavSP)
- AND (Attr.TyPtr = IntPtr) THEN BEGIN
- G0(67(*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END;
- LocParSize := LocParSize+SavSP^.Size;
- END
- ELSE BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LocParSize := LocParSize+PtrSize;
- END
- ELSE IF Attr.Art = IsVar THEN BEGIN
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LocParSize := LocParSize+PtrSize;
- END
- ELSE Error(154);
- IF NOT IsCompatible(SavSP,Attr.TyPtr) THEN Error(142)
- END
- END
- END
- ELSE BEGIN
- END
- END;
- IF (LBezArt = Actual) AND (Nxt <> NIL) THEN Nxt := Nxt^.Next
- UNTIL Symb <> CommaSymb;
- LocStk := SavLocStk;
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END;
- IF LBezArt = Actual THEN BEGIN
- IF Nxt <> NIL THEN Error(126);
- WITH BezPtr^ DO BEGIN
- IF Extern THEN
- IF ProcLabel >= 24 THEN BEGIN
- G2(51,1,Zahl,TopNew,StkMax,KonstPtr);
- G1(30,ProcLabel,TopNew,StkMax,KonstPtr);
- END
- ELSE G1(30,ProcLabel,TopNew,StkMax,KonstPtr)
- ELSE BEGIN
- GenDBG(Name);
- GProcCall(46,LocParSize,ProcLabel,TopNew,StkMax)
- END
- END
- END;
- Attr.TyPtr := BezPtr^.BezType;
- END;
-
-
- BEGIN (* CALL *)
- IF BezPtr^.IsDeclDas = Standard THEN BEGIN
- StdProcIndex := BezPtr^.Key;
- IF BezPtr^.Klass = ProcClass THEN BEGIN
- IF NOT(StdProcIndex IN [5,6,11,12]) THEN
- IF Symb = lBraces THEN GetSymbol ELSE Error(9);
- CASE StdProcIndex OF
- 1,2: GetPut;
- 17: Close;
- 3: ReSet;
- 4: ReWrite;
- 5,11: Read;
- 6,12: Write;
- 7: Pack;
- 8: UnPack;
- 9: New;
- 16: Dispos;
- 10: Release;
- 13: Mark
- END;
- IF NOT (StdProcIndex IN [5,6,11,12]) THEN
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END
- ELSE BEGIN
- IF StdProcIndex <= 8 THEN BEGIN
- IF Symb = lBraces THEN GetSymbol ELSE Error(9);
- Expression(ESets+[rBrace]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- END;
- CASE StdProcIndex OF
- 1: ABS;
- 2: Sqr;
- 3: Trunc;
- 4: Odd;
- 5: Ord;
- 6: Chr;
- 7,8: PredSucc;
- 9,10: EoFEoLn;
- 11: Round;
- END;
- IF StdProcIndex <= 8 THEN
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END;
- END
- ELSE ExtendedCall;
- END;
-
-