home *** CD-ROM | disk | FTP | other *** search
- PROCEDURE Expression;
-
- VAR
- LastAttr: Attribut;
- LastOp: Operator;
- TypIndex: CHAR;
- ActSize: AddressRange;
-
-
- PROCEDURE SimpleExpression (ESets: Symbolmenge);
-
- VAR
- LastAttr: Attribut;
- LastOp: Operator;
- HasSign: BOOLEAN;
-
-
- PROCEDURE Term (ESets: Symbolmenge);
-
- VAR
- LastAttr: Attribut;
- LastOp: Operator;
-
-
- PROCEDURE Factor (ESets: Symbolmenge);
-
- VAR
- locc: KonstP;
- SavKonstPtr: KonstPointer;
- VarPart: BOOLEAN;
- SetConstants: SET OF SetMin..SetMax;
- SavSP: StP;
-
-
- PROCEDURE SetSubRange;
-
- VAR LAttr1,LAttr2: Attribut;
-
- BEGIN
- GetSymbol;
- LAttr1 := Attr;
- Expression(ESets+[CommaSymb,rBrack]);
- IF (LAttr1.Art = IsKonst) AND (Attr.Art = IsKonst) THEN
- IF (LAttr1.KonstVal.GanzeZahl < SetMin) OR
- (LAttr1.KonstVal.GanzeZahl > SetMax) OR
- (Attr.KonstVal.GanzeZahl < SetMin) OR
- (Attr.KonstVal.GanzeZahl > SetMax) OR
- (Attr.KonstVal.GanzeZahl < LAttr1.KonstVal.GanzeZahl) THEN
- Error(304)
- ELSE
- SetConstants :=
- SetConstants +
- [LAttr1.KonstVal.GanzeZahl..Attr.KonstVal.GanzeZahl]
- ELSE BEGIN
- IF LAttr1.Art = IsKonst THEN
- G2(51,1,LAttr1.KonstVal.GanzeZahl,TopNew,StkMax,KonstPtr)
- ELSE BEGIN
- LAttr2 := Attr; Attr := LAttr1;
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF NOT IsCompatible(LAttr1.TyPtr,IntPtr) THEN
- G0T(58,LAttr1.TyPtr,TopNew,StkMax);
- Attr := LAttr2;
- END;
- IF Attr.Art = IsKonst THEN BEGIN
- G2(51,1,Attr.KonstVal.GanzeZahl,TopNew,StkMax,KonstPtr);
- Attr := LAttr1;
- END
- ELSE BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- END;
- G0(61(*SGM*),TopNew,StkMax);
- IF VarPart THEN G0(28,TopNew,StkMax) ELSE VarPart := TRUE
- END;
- SavSP^.ElemSet := Attr.TyPtr;
- Attr.TyPtr := SavSP;
- END;
-
-
- BEGIN (* Factor *)
- IF NOT (Symb IN FactorStartSymb) THEN BEGIN
- Error(58); Recover(ESets+FactorStartSymb);
- Attr.TyPtr := NIL
- END;
- WHILE Symb IN FactorStartSymb DO BEGIN
- CASE Symb OF
- Bezeich:
- BEGIN
- FindeBez([KonstKlasse,VarClass,FieldClass,FuncClass],
- locc);
- GetSymbol;
- IF locc^.Klass = FuncClass THEN BEGIN
- CallProcedure(ESets,locc);
- WITH Attr DO BEGIN
- Art := IsExpr;
- IF TyPtr <> NIL THEN
- IF TyPtr^.Form = SubRange THEN
- TyPtr := TyPtr^.RangeType
- END
- END
- ELSE IF locc^.Klass = KonstKlasse THEN
- WITH Attr,locc^ DO BEGIN
- TyPtr := BezType; Art := IsKonst;
- KonstVal := Values
- END
- ELSE BEGIN
- Selector(ESets,locc,TopNew,StkMax,
- KonstPtr,KonstPtrIndex,PInf);
- IF Attr.TyPtr <> NIL THEN
- WITH Attr,TyPtr^ DO
- IF Form = SubRange THEN
- TyPtr := RangeType
- END
- END;
- LongConst:
- BEGIN
- WITH Attr DO BEGIN
- TyPtr := LongPtr; Art := IsKonst;
- KonstVal := LastConstVal;
- END;
- GetSymbol;
- END;
- IntConst:
- BEGIN
- WITH Attr DO BEGIN
- TyPtr := IntPtr; Art := IsKonst;
- KonstVal := LastConstVal;
- END;
- GetSymbol;
- END;
- RealConst:
- BEGIN
- WITH Attr DO BEGIN
- TyPtr := RealPtr; Art := IsKonst;
- KonstVal := LastConstVal
- END;
- GetSymbol
- END;
- StringConst:
- BEGIN
- WITH Attr DO BEGIN
- IF Lgth = 1 THEN TyPtr := CharPtr
- ELSE BEGIN
- New(SavSP);
- WITH SavSP^ DO BEGIN
- ElemType := CharPtr; Form := Arrays;
- IndexType := NIL; Size := Lgth*CharSize
- END;
- TyPtr := SavSP
- END;
- Art := IsKonst; KonstVal := LastConstVal
- END;
- GetSymbol
- END;
- lBraces:
- BEGIN
- GetSymbol; Expression(ESets+[rBrace]);
- IF Symb = rBrace THEN GetSymbol ELSE Error(4)
- END;
- NotSymb:
- BEGIN
- GetSymbol; Factor(ESets);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- G0(19,TopNew,StkMax);
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr <> BooleanPtr THEN BEGIN
- Error(135); Attr.TyPtr := NIL
- END
- END;
- lBrack:
- BEGIN
- GetSymbol; SetConstants := []; VarPart := FALSE;
- New(SavSP);
- WITH SavSP^ DO BEGIN
- ElemSet := NIL; Size := SetSize; Form := Power
- END;
- IF Symb = rBrack THEN BEGIN
- WITH Attr DO BEGIN
- TyPtr := SavSP; Art := IsKonst
- END;
- GetSymbol
- END
- ELSE BEGIN
- REPEAT
- Expression(ESets+[ColonSymb,CommaSymb,rBrack]);
- IF Symb = ColonSymb THEN SetSubRange
- ELSE BEGIN (* 1 *)
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <> Scalar THEN BEGIN
- Error(136); Attr.TyPtr := NIL
- END
- ELSE IF IsCompatible(SavSP^.ElemSet,Attr.TyPtr)
- THEN BEGIN
- IF Attr.Art = IsKonst THEN
- IF (Attr.KonstVal.GanzeZahl<SetMin) OR
- (Attr.KonstVal.GanzeZahl>SetMax) THEN
- Error(304)
- ELSE
- SetConstants := SetConstants+
- [Attr.KonstVal.GanzeZahl]
- ELSE BEGIN
- PushContents(TopNew,StkMax,
- KonstPtr,KonstPtrIndex);
- IF NOT IsCompatible (Attr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- G0(23,TopNew,StkMax);
- IF VarPart THEN G0(28,TopNew,StkMax)
- ELSE VarPart := TRUE
- END;
- SavSP^.ElemSet := Attr.TyPtr;
- Attr.TyPtr := SavSP
- END
- ELSE Error(137);
- END; (* ELSE 1 *)
- IF Ord(Symb) = 12 THEN Stop := FALSE
- ELSE Stop := TRUE;
- (* TEST := (SY <> COMMA); *)
- IF Symb = UpTo THEN
- WriteLn('Unterbereiche von Mengen ',
- 'noch nicht implementiert');
- IF NOT Stop THEN GetSymbol
- UNTIL Stop;
- IF Symb = rBrack THEN GetSymbol ELSE Error(12)
- END;
- IF VarPart THEN BEGIN
- IF SetConstants <> [] THEN BEGIN
- New(SavKonstPtr);
- SavKonstPtr^.Menge := SetConstants;
- SavKonstPtr^.KonstArt := SetKonst;
- IF KonstPtrIndex = MaxKonstants THEN Error(254)
- ELSE BEGIN
- KonstPtrIndex := KonstPtrIndex+1;
- KonstPtr[KonstPtrIndex] := SavKonstPtr;
- G2(51,5,KonstPtrIndex,TopNew,StkMax,KonstPtr);
- G0(28,TopNew,StkMax);
- Attr.Art := IsExpr
- END
- END
- END
- ELSE BEGIN
- New(SavKonstPtr);
- SavKonstPtr^.Menge := SetConstants;
- SavKonstPtr^.KonstArt := SetKonst;
- Attr.KonstVal.ValuePointer := SavKonstPtr
- END
- END
- END; (* CASE *)
- IF NOT (Symb IN ESets) THEN BEGIN
- Error(6); Recover(ESets+FactorStartSymb)
- END
- END; (* WHILE *)
- END; (* FACTOR *)
-
-
- BEGIN (* Term *)
- Factor(ESets+[MultOpr]);
- WHILE Symb = MultOpr DO BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LastAttr := Attr; LastOp := Oper;
- GetSymbol;
- Factor(ESets+[MultOpr]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN
- CASE LastOp OF
- Mult:
- IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
- G0(15,TopNew,StkMax)
- ELSE BEGIN
- IF LastAttr.TyPtr = IntPtr THEN BEGIN
- IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(9 (*FLO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := LongPtr
- END
- END
- ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END
- ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(70 (*LFO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- END
- ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(10 (*FLT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(71 (*LFT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- END;
- IF (LastAttr.TyPtr = RealPtr) AND
- (Attr.TyPtr = RealPtr) THEN
- G0(16,TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = LongPtr) THEN
- G0(68 (*MPL*),TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr^.Form = Power) AND
- IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
- G0(12,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END;
- RDiv:
- BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(10,TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END;
- IF LastAttr.TyPtr = IntPtr THEN BEGIN
- G0(9,TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END;
- IF (LastAttr.TyPtr = RealPtr) AND
- (Attr.TyPtr = RealPtr) THEN
- G0(7,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END;
- IDiv:
- BEGIN
- IF (LastAttr.TyPtr = IntPtr) AND
- (Attr.TyPtr = LongPtr) THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := LongPtr
- END
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = IntPtr) THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END;
- IF (LastAttr.TyPtr = IntPtr) AND
- (Attr.TyPtr = IntPtr) THEN
- G0(6,TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = LongPtr) THEN
- G0(64 (*DVL*),TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END;
- END;
- IMod:
- BEGIN
- IF (LastAttr.TyPtr = IntPtr) AND
- (Attr.TyPtr = LongPtr) THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := LongPtr
- END
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = IntPtr) THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END;
- IF (LastAttr.TyPtr = IntPtr) AND
- (Attr.TyPtr = IntPtr) THEN
- G0(14,TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = LongPtr) THEN
- G0(65 (*MDL*),TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END;
- END;
- AndOp:
- IF (LastAttr.TyPtr = BooleanPtr) AND
- (Attr.TyPtr = BooleanPtr) THEN
- G0(4,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END (* CASE *)
- ELSE Attr.TyPtr := NIL
- END; (* WHILE *)
- END; (* Term *)
-
-
- BEGIN (* SimpleExpression *)
- HasSign := FALSE;
- IF (Symb = AddOpr) AND (Oper IN [Plus,Minus]) THEN BEGIN
- HasSign := Oper = Minus; GetSymbol
- END;
- Term(ESets+[AddOpr]);
- IF HasSign THEN BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF Attr.TyPtr = IntPtr THEN
- G0(17,TopNew,StkMax)
- ELSE IF Attr.TyPtr = RealPtr THEN
- G0(18,TopNew,StkMax)
- ELSE IF Attr.TyPtr = LongPtr THEN
- G0(69 (* NGL*),TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END;
- WHILE Symb = AddOpr DO BEGIN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LastAttr := Attr; LastOp := Oper;
- GetSymbol; Term(ESets+[AddOpr]);
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN
- CASE LastOp OF
- Plus:
- IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
- G0(2,TopNew,StkMax)
- ELSE BEGIN
- IF LastAttr.TyPtr = IntPtr THEN BEGIN
- IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(9 (*FLO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := LongPtr
- END
- END
- ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END
- ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(70(*LFO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- END
- ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(10 (*FLT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(71 (*LFT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- END;
- IF (LastAttr.TyPtr = RealPtr) AND
- (Attr.TyPtr = RealPtr) THEN
- G0(3,TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = LongPtr) THEN
- G0(62 (*ADL*),TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr^.Form = Power) AND
- IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
- G0(28,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END;
- Minus:
- IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
- G0(21,TopNew,StkMax)
- ELSE BEGIN
- IF LastAttr.TyPtr = IntPtr THEN BEGIN
- IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(9 (*FLO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax);
- LastAttr.TyPtr := LongPtr
- END
- END
- ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax);
- Attr.TyPtr := LongPtr
- END
- ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(70 (*LFO*),TopNew,StkMax);
- LastAttr.TyPtr := RealPtr
- END
- END
- ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(10 (*FLT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(71 (*LFT*),TopNew,StkMax);
- Attr.TyPtr := RealPtr
- END
- END;
- IF (LastAttr.TyPtr = RealPtr) AND
- (Attr.TyPtr = RealPtr) THEN
- G0(22,TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr = LongPtr) AND
- (Attr.TyPtr = LongPtr) THEN
- G0(63 (*SBL*),TopNew,StkMax)
- ELSE IF (LastAttr.TyPtr^.Form = Power) AND
- IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
- G0(5,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END;
- OrOpr:
- IF (LastAttr.TyPtr = BooleanPtr) AND
- (Attr.TyPtr = BooleanPtr) THEN
- G0(13,TopNew,StkMax)
- ELSE BEGIN
- Error(134); Attr.TyPtr := NIL
- END
- END (* CASE *)
- ELSE Attr.TyPtr := NIL
- END; (* WHILE *)
- END; (* SimpleExpression *)
-
-
- BEGIN (* Expression *)
- SimpleExpression(ESets+[VergleichOp]);
- IF Symb = VergleichOp THEN BEGIN
- IF Attr.TyPtr <> NIL THEN
- IF Attr.TyPtr^.Form <= Power THEN
- PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex)
- ELSE
- PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
- LastAttr := Attr; LastOp := Oper;
- IF LastOp = InOp THEN
- IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
- G0T(58,Attr.TyPtr,TopNew,StkMax);
- GetSymbol;
- SimpleExpression(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
- IF LastOp = InOp THEN
- IF Attr.TyPtr^.Form = Power THEN
- IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr^.ElemSet) THEN
- G0(11,TopNew,StkMax)
- ELSE BEGIN
- Error(129); Attr.TyPtr := NIL
- END
- ELSE BEGIN
- Error(130); Attr.TyPtr := NIL
- END
- ELSE BEGIN
- IF LastAttr.TyPtr <> Attr.TyPtr THEN
- IF LastAttr.TyPtr = IntPtr THEN BEGIN
- IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(9,TopNew,StkMax); LastAttr.TyPtr := RealPtr
- END
- ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
- G0(66 (*ILO*),TopNew,StkMax); LastAttr.TyPtr := LongPtr
- END
- END
- ELSE IF LastAttr.TyPtr = RealPtr 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); LastAttr.TyPtr := RealPtr
- END
- END
- ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
- IF Attr.TyPtr = IntPtr THEN BEGIN
- G0(67 (*ILT*),TopNew,StkMax); Attr.TyPtr := LongPtr
- END
- ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
- G0(70 (*LFO*),TopNew,StkMax); LastAttr.TyPtr := RealPtr
- END
- END;
- IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN BEGIN
- ActSize := LastAttr.TyPtr^.Size;
- CASE LastAttr.TyPtr^.Form OF
- Scalar:
- IF LastAttr.TyPtr = RealPtr THEN
- TypIndex := 'r'
- ELSE IF LastAttr.TyPtr = BooleanPtr THEN
- TypIndex := 'b'
- ELSE IF LastAttr.TyPtr = CharPtr THEN
- TypIndex := 'c'
- ELSE IF LastAttr.TyPtr = LongPtr THEN
- TypIndex := 'l'
- ELSE
- TypIndex := 'i';
- Pointers:
- BEGIN
- IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
- Error(131);
- TypIndex := 'a'
- END;
- Power:
- BEGIN
- IF LastOp IN [LessThanOp,GrThanOp] THEN
- Error(132);
- TypIndex := 's'
- END;
- Arrays:
- BEGIN
- IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
- Error(131);
- (* IF NOT STRNG(LATTR.TyPtr) THEN ERROR(134); *)
- TypIndex := 'm'
- END;
- Records:
- BEGIN
- IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
- Error(131);
- TypIndex := 'm'
- END;
- Files:
- BEGIN
- Error(133); TypIndex := 'f'
- END
- END; (* CASE *)
- CASE LastOp OF
- LessThanOp:
- G2(53,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- LessOp:
- G2(52,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- GrThanOp:
- G2(49,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- GrEqualOp:
- G2(48,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- NotEqualOp:
- G2(55,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- EqualOp:
- G2(47,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
- END
- END
- ELSE Error(129)
- END;
- Attr.TyPtr := BooleanPtr; Attr.Art := IsExpr
- END;
- END; (* Expression *)