home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 02 / express.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-02-06  |  29.0 KB  |  647 lines

  1.         PROCEDURE Expression;
  2.     
  3.         VAR
  4.           LastAttr: Attribut;
  5.           LastOp: Operator;
  6.           TypIndex: CHAR;
  7.           ActSize: AddressRange;
  8.     
  9.     
  10.           PROCEDURE SimpleExpression (ESets: Symbolmenge);
  11.     
  12.           VAR
  13.             LastAttr: Attribut;
  14.             LastOp: Operator;
  15.             HasSign: BOOLEAN;
  16.     
  17.     
  18.             PROCEDURE Term (ESets: Symbolmenge);
  19.     
  20.             VAR
  21.               LastAttr: Attribut;
  22.               LastOp: Operator;
  23.     
  24.     
  25.               PROCEDURE Factor (ESets: Symbolmenge);
  26.     
  27.               VAR
  28.                 locc: KonstP;
  29.                 SavKonstPtr: KonstPointer;
  30.                 VarPart: BOOLEAN;
  31.                 SetConstants: SET OF SetMin..SetMax;
  32.                 SavSP: StP;
  33.     
  34.     
  35.                 PROCEDURE SetSubRange;
  36.     
  37.                 VAR LAttr1,LAttr2: Attribut;
  38.     
  39.                 BEGIN
  40.                   GetSymbol;
  41.                   LAttr1 := Attr;
  42.                   Expression(ESets+[CommaSymb,rBrack]);
  43.                   IF (LAttr1.Art = IsKonst) AND (Attr.Art = IsKonst) THEN
  44.                     IF (LAttr1.KonstVal.GanzeZahl < SetMin) OR
  45.                        (LAttr1.KonstVal.GanzeZahl > SetMax) OR
  46.                        (Attr.KonstVal.GanzeZahl < SetMin) OR
  47.                        (Attr.KonstVal.GanzeZahl > SetMax) OR
  48.                        (Attr.KonstVal.GanzeZahl < LAttr1.KonstVal.GanzeZahl) THEN
  49.                       Error(304)
  50.                     ELSE
  51.                       SetConstants :=
  52.                         SetConstants +
  53.                         [LAttr1.KonstVal.GanzeZahl..Attr.KonstVal.GanzeZahl]
  54.                   ELSE BEGIN
  55.                     IF LAttr1.Art = IsKonst THEN
  56.                       G2(51,1,LAttr1.KonstVal.GanzeZahl,TopNew,StkMax,KonstPtr)
  57.                     ELSE BEGIN
  58.                       LAttr2 := Attr;  Attr := LAttr1;
  59.                       PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  60.                       IF NOT IsCompatible(LAttr1.TyPtr,IntPtr) THEN
  61.                         G0T(58,LAttr1.TyPtr,TopNew,StkMax);
  62.                       Attr := LAttr2;
  63.                     END;
  64.                     IF Attr.Art = IsKonst THEN BEGIN
  65.                       G2(51,1,Attr.KonstVal.GanzeZahl,TopNew,StkMax,KonstPtr);
  66.                       Attr := LAttr1;
  67.                     END
  68.                     ELSE BEGIN
  69.                       PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  70.                       IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
  71.                         G0T(58,Attr.TyPtr,TopNew,StkMax);
  72.                     END;
  73.                     G0(61(*SGM*),TopNew,StkMax);
  74.                     IF VarPart THEN G0(28,TopNew,StkMax) ELSE VarPart := TRUE
  75.                   END;
  76.                   SavSP^.ElemSet := Attr.TyPtr;
  77.                   Attr.TyPtr := SavSP;
  78.                 END;
  79.     
  80.     
  81.               BEGIN (* Factor *)
  82.                 IF NOT (Symb IN FactorStartSymb) THEN BEGIN
  83.                   Error(58);  Recover(ESets+FactorStartSymb);
  84.                   Attr.TyPtr := NIL
  85.                 END;
  86.                 WHILE Symb IN FactorStartSymb DO BEGIN
  87.                   CASE Symb OF
  88.                     Bezeich:
  89.                       BEGIN
  90.                         FindeBez([KonstKlasse,VarClass,FieldClass,FuncClass],
  91.                                  locc);
  92.                         GetSymbol;
  93.                         IF locc^.Klass = FuncClass THEN BEGIN
  94.                           CallProcedure(ESets,locc);
  95.                           WITH Attr DO BEGIN
  96.                             Art := IsExpr;
  97.                             IF TyPtr <> NIL THEN
  98.                               IF TyPtr^.Form = SubRange THEN
  99.                                 TyPtr := TyPtr^.RangeType
  100.                           END
  101.                         END
  102.                         ELSE IF locc^.Klass = KonstKlasse THEN
  103.                           WITH Attr,locc^ DO BEGIN
  104.                             TyPtr := BezType;  Art := IsKonst;
  105.                             KonstVal := Values
  106.                           END
  107.                         ELSE BEGIN
  108.                           Selector(ESets,locc,TopNew,StkMax,
  109.                                    KonstPtr,KonstPtrIndex,PInf);
  110.                           IF Attr.TyPtr <> NIL THEN
  111.                             WITH Attr,TyPtr^ DO
  112.                               IF Form = SubRange THEN
  113.                                 TyPtr := RangeType
  114.                         END
  115.                       END;
  116.                     LongConst:
  117.                       BEGIN
  118.                         WITH Attr DO BEGIN
  119.                           TyPtr := LongPtr;  Art := IsKonst;
  120.                           KonstVal := LastConstVal;
  121.                         END;
  122.                         GetSymbol;
  123.                       END;
  124.                     IntConst:
  125.                       BEGIN
  126.                         WITH Attr DO BEGIN
  127.                           TyPtr := IntPtr;  Art := IsKonst;
  128.                           KonstVal := LastConstVal;
  129.                         END;
  130.                         GetSymbol;
  131.                       END;
  132.                     RealConst:
  133.                       BEGIN
  134.                         WITH Attr DO BEGIN
  135.                           TyPtr := RealPtr;  Art := IsKonst;
  136.                           KonstVal := LastConstVal
  137.                         END;
  138.                         GetSymbol
  139.                       END;
  140.                     StringConst:
  141.                       BEGIN
  142.                         WITH Attr DO BEGIN
  143.                           IF Lgth = 1 THEN TyPtr := CharPtr
  144.                           ELSE BEGIN
  145.                             New(SavSP);
  146.                             WITH SavSP^ DO BEGIN
  147.                               ElemType := CharPtr;  Form := Arrays;
  148.                               IndexType := NIL;  Size := Lgth*CharSize
  149.                             END;
  150.                             TyPtr := SavSP
  151.                           END;
  152.                           Art := IsKonst;  KonstVal := LastConstVal
  153.                         END;
  154.                         GetSymbol
  155.                       END;
  156.                     lBraces:
  157.                       BEGIN
  158.                         GetSymbol;  Expression(ESets+[rBrace]);
  159.                         IF Symb = rBrace THEN GetSymbol ELSE Error(4)
  160.                       END;
  161.                     NotSymb:
  162.                       BEGIN
  163.                         GetSymbol;  Factor(ESets);
  164.                         PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  165.                         G0(19,TopNew,StkMax);
  166.                         IF Attr.TyPtr <> NIL THEN
  167.                           IF Attr.TyPtr <> BooleanPtr THEN BEGIN
  168.                             Error(135);  Attr.TyPtr := NIL
  169.                           END
  170.                       END;
  171.                     lBrack:
  172.                       BEGIN
  173.                         GetSymbol;  SetConstants := [];  VarPart := FALSE;
  174.                         New(SavSP);
  175.                         WITH SavSP^ DO BEGIN
  176.                           ElemSet := NIL; Size := SetSize; Form := Power
  177.                         END;
  178.                         IF Symb = rBrack THEN BEGIN
  179.                           WITH Attr DO BEGIN
  180.                             TyPtr := SavSP;  Art := IsKonst
  181.                           END;
  182.                           GetSymbol
  183.                         END
  184.                         ELSE BEGIN
  185.                           REPEAT
  186.                             Expression(ESets+[ColonSymb,CommaSymb,rBrack]);
  187.                             IF Symb = ColonSymb THEN SetSubRange
  188.                             ELSE BEGIN (* 1 *)
  189.                               IF Attr.TyPtr <> NIL THEN
  190.                                 IF Attr.TyPtr^.Form <> Scalar THEN BEGIN
  191.                                   Error(136);  Attr.TyPtr := NIL
  192.                                 END
  193.                                 ELSE IF IsCompatible(SavSP^.ElemSet,Attr.TyPtr)
  194.                                 THEN BEGIN
  195.                                   IF Attr.Art = IsKonst THEN
  196.                                     IF (Attr.KonstVal.GanzeZahl<SetMin) OR
  197.                                        (Attr.KonstVal.GanzeZahl>SetMax) THEN
  198.                                       Error(304)
  199.                                     ELSE
  200.                                       SetConstants := SetConstants+
  201.                                                       [Attr.KonstVal.GanzeZahl]
  202.                                   ELSE BEGIN
  203.                                     PushContents(TopNew,StkMax,
  204.                                                  KonstPtr,KonstPtrIndex);
  205.                                     IF NOT IsCompatible (Attr.TyPtr,IntPtr) THEN
  206.                                       G0T(58,Attr.TyPtr,TopNew,StkMax);
  207.                                     G0(23,TopNew,StkMax);
  208.                                     IF VarPart THEN G0(28,TopNew,StkMax)
  209.                                     ELSE VarPart := TRUE
  210.                                   END;
  211.                                   SavSP^.ElemSet := Attr.TyPtr;
  212.                                   Attr.TyPtr := SavSP
  213.                                 END
  214.                                 ELSE Error(137);
  215.                             END;  (* ELSE 1 *)
  216.                             IF Ord(Symb) = 12 THEN Stop := FALSE
  217.                             ELSE Stop := TRUE;
  218.                             (* TEST := (SY <> COMMA); *)
  219.                             IF Symb = UpTo THEN
  220.                               WriteLn('Unterbereiche von Mengen ',
  221.                                       'noch nicht implementiert');
  222.                             IF NOT Stop THEN GetSymbol
  223.                           UNTIL Stop;
  224.                           IF Symb = rBrack THEN GetSymbol ELSE Error(12)
  225.                         END;
  226.                         IF VarPart THEN BEGIN
  227.                           IF SetConstants <> [] THEN BEGIN
  228.                             New(SavKonstPtr);
  229.                             SavKonstPtr^.Menge := SetConstants;
  230.                             SavKonstPtr^.KonstArt := SetKonst;
  231.                             IF KonstPtrIndex = MaxKonstants THEN Error(254)
  232.                             ELSE BEGIN
  233.                               KonstPtrIndex := KonstPtrIndex+1;
  234.                               KonstPtr[KonstPtrIndex] := SavKonstPtr;
  235.                               G2(51,5,KonstPtrIndex,TopNew,StkMax,KonstPtr);
  236.                               G0(28,TopNew,StkMax);
  237.                               Attr.Art := IsExpr
  238.                             END
  239.                           END
  240.                         END
  241.                         ELSE BEGIN
  242.                           New(SavKonstPtr);
  243.                           SavKonstPtr^.Menge := SetConstants;
  244.                           SavKonstPtr^.KonstArt := SetKonst;
  245.                           Attr.KonstVal.ValuePointer := SavKonstPtr
  246.                         END
  247.                       END
  248.                   END; (* CASE *)
  249.                   IF NOT (Symb IN ESets) THEN BEGIN
  250.                     Error(6);  Recover(ESets+FactorStartSymb)
  251.                   END
  252.                 END; (* WHILE *)
  253.               END; (* FACTOR *)
  254.     
  255.     
  256.             BEGIN (* Term *)
  257.               Factor(ESets+[MultOpr]);
  258.               WHILE Symb = MultOpr DO BEGIN
  259.                 PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  260.                 LastAttr := Attr;  LastOp := Oper;
  261.                 GetSymbol;
  262.                 Factor(ESets+[MultOpr]);
  263.                 PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  264.                 IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN
  265.                   CASE LastOp OF
  266.                     Mult:
  267.                       IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
  268.                         G0(15,TopNew,StkMax)
  269.                       ELSE BEGIN
  270.                         IF LastAttr.TyPtr = IntPtr THEN BEGIN
  271.                           IF Attr.TyPtr = RealPtr THEN BEGIN
  272.                             G0(9 (*FLO*),TopNew,StkMax);
  273.                             LastAttr.TyPtr := RealPtr
  274.                           END
  275.                           ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  276.                             G0(66 (*ILO*),TopNew,StkMax);
  277.                             LastAttr.TyPtr := LongPtr
  278.                           END
  279.                         END
  280.                         ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
  281.                           IF Attr.TyPtr = IntPtr THEN BEGIN
  282.                             G0(67 (*ILT*),TopNew,StkMax);
  283.                             Attr.TyPtr := LongPtr
  284.                           END
  285.                           ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
  286.                             G0(70 (*LFO*),TopNew,StkMax);
  287.                             LastAttr.TyPtr := RealPtr
  288.                           END
  289.                         END
  290.                         ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
  291.                           IF Attr.TyPtr = IntPtr THEN BEGIN
  292.                             G0(10 (*FLT*),TopNew,StkMax);
  293.                             Attr.TyPtr := RealPtr
  294.                           END
  295.                           ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  296.                             G0(71 (*LFT*),TopNew,StkMax);
  297.                             Attr.TyPtr := RealPtr
  298.                           END
  299.                         END;
  300.                         IF (LastAttr.TyPtr = RealPtr) AND
  301.                            (Attr.TyPtr = RealPtr) THEN
  302.                           G0(16,TopNew,StkMax)
  303.                         ELSE IF (LastAttr.TyPtr = LongPtr) AND
  304.                                 (Attr.TyPtr = LongPtr) THEN
  305.                           G0(68 (*MPL*),TopNew,StkMax)
  306.                         ELSE IF (LastAttr.TyPtr^.Form = Power) AND
  307.                                 IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
  308.                           G0(12,TopNew,StkMax)
  309.                         ELSE BEGIN
  310.                           Error(134);  Attr.TyPtr := NIL
  311.                         END
  312.                       END;
  313.                     RDiv:
  314.                       BEGIN
  315.                         IF Attr.TyPtr = IntPtr THEN BEGIN
  316.                           G0(10,TopNew,StkMax);
  317.                           Attr.TyPtr := RealPtr
  318.                         END;
  319.                         IF LastAttr.TyPtr = IntPtr THEN BEGIN
  320.                           G0(9,TopNew,StkMax);
  321.                           LastAttr.TyPtr := RealPtr
  322.                         END
  323.                         ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  324.                           G0(67 (*ILT*),TopNew,StkMax);
  325.                           Attr.TyPtr := RealPtr
  326.                         END
  327.                         ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
  328.                           G0(66 (*ILO*),TopNew,StkMax);
  329.                           LastAttr.TyPtr := RealPtr
  330.                         END;
  331.                         IF (LastAttr.TyPtr = RealPtr) AND
  332.                            (Attr.TyPtr = RealPtr) THEN
  333.                           G0(7,TopNew,StkMax)
  334.                         ELSE BEGIN
  335.                           Error(134);  Attr.TyPtr := NIL
  336.                         END
  337.                       END;
  338.                     IDiv:
  339.                       BEGIN
  340.                         IF (LastAttr.TyPtr = IntPtr) AND
  341.                            (Attr.TyPtr = LongPtr) THEN BEGIN
  342.                           G0(66 (*ILO*),TopNew,StkMax);
  343.                           LastAttr.TyPtr := LongPtr
  344.                         END
  345.                         ELSE IF (LastAttr.TyPtr = LongPtr) AND
  346.                                 (Attr.TyPtr = IntPtr) THEN BEGIN
  347.                           G0(67 (*ILT*),TopNew,StkMax);
  348.                           Attr.TyPtr := LongPtr
  349.                         END;
  350.                         IF (LastAttr.TyPtr = IntPtr) AND
  351.                            (Attr.TyPtr = IntPtr) THEN
  352.                           G0(6,TopNew,StkMax)
  353.                         ELSE IF (LastAttr.TyPtr = LongPtr) AND
  354.                                 (Attr.TyPtr = LongPtr) THEN
  355.                           G0(64 (*DVL*),TopNew,StkMax)
  356.                         ELSE BEGIN
  357.                           Error(134);  Attr.TyPtr := NIL
  358.                         END;
  359.                       END;
  360.                     IMod:
  361.                       BEGIN
  362.                         IF (LastAttr.TyPtr = IntPtr) AND
  363.                            (Attr.TyPtr = LongPtr) THEN BEGIN
  364.                           G0(66 (*ILO*),TopNew,StkMax);
  365.                           LastAttr.TyPtr := LongPtr
  366.                         END
  367.                         ELSE IF (LastAttr.TyPtr = LongPtr) AND
  368.                                 (Attr.TyPtr = IntPtr) THEN BEGIN
  369.                           G0(67 (*ILT*),TopNew,StkMax);
  370.                           Attr.TyPtr := LongPtr
  371.                         END;
  372.                         IF (LastAttr.TyPtr = IntPtr) AND
  373.                            (Attr.TyPtr = IntPtr) THEN
  374.                           G0(14,TopNew,StkMax)
  375.                         ELSE IF (LastAttr.TyPtr = LongPtr) AND
  376.                                 (Attr.TyPtr = LongPtr) THEN
  377.                           G0(65 (*MDL*),TopNew,StkMax)
  378.                         ELSE BEGIN
  379.                           Error(134);  Attr.TyPtr := NIL
  380.                         END;
  381.                       END;
  382.                     AndOp:
  383.                       IF (LastAttr.TyPtr = BooleanPtr) AND
  384.                          (Attr.TyPtr = BooleanPtr) THEN
  385.                         G0(4,TopNew,StkMax)
  386.                       ELSE BEGIN
  387.                         Error(134);  Attr.TyPtr := NIL
  388.                       END
  389.                   END  (* CASE *)
  390.                 ELSE Attr.TyPtr := NIL
  391.               END; (* WHILE *)
  392.             END; (* Term *)
  393.     
  394.     
  395.           BEGIN (* SimpleExpression *)
  396.             HasSign := FALSE;
  397.             IF (Symb = AddOpr) AND (Oper IN [Plus,Minus]) THEN BEGIN
  398.               HasSign := Oper = Minus;  GetSymbol
  399.             END;
  400.             Term(ESets+[AddOpr]);
  401.             IF HasSign THEN BEGIN
  402.               PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  403.               IF Attr.TyPtr = IntPtr THEN
  404.                 G0(17,TopNew,StkMax)
  405.               ELSE IF Attr.TyPtr = RealPtr THEN
  406.                 G0(18,TopNew,StkMax)
  407.               ELSE IF Attr.TyPtr = LongPtr THEN
  408.                 G0(69 (* NGL*),TopNew,StkMax)
  409.               ELSE BEGIN
  410.                 Error(134);  Attr.TyPtr := NIL
  411.               END
  412.             END;
  413.             WHILE Symb = AddOpr DO BEGIN
  414.               PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  415.               LastAttr := Attr;  LastOp := Oper;
  416.               GetSymbol;  Term(ESets+[AddOpr]);
  417.               PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  418.               IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN
  419.                 CASE LastOp OF
  420.                   Plus:
  421.                     IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
  422.                       G0(2,TopNew,StkMax)
  423.                     ELSE BEGIN
  424.                       IF LastAttr.TyPtr = IntPtr THEN BEGIN
  425.                         IF Attr.TyPtr = RealPtr THEN BEGIN
  426.                           G0(9 (*FLO*),TopNew,StkMax);
  427.                           LastAttr.TyPtr := RealPtr
  428.                         END
  429.                         ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  430.                           G0(66 (*ILO*),TopNew,StkMax);
  431.                           LastAttr.TyPtr := LongPtr
  432.                         END
  433.                       END
  434.                       ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
  435.                         IF Attr.TyPtr = IntPtr THEN BEGIN
  436.                           G0(67 (*ILT*),TopNew,StkMax);
  437.                           Attr.TyPtr := LongPtr
  438.                         END
  439.                         ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
  440.                           G0(70(*LFO*),TopNew,StkMax);
  441.                           LastAttr.TyPtr := RealPtr
  442.                         END
  443.                       END
  444.                       ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
  445.                         IF Attr.TyPtr = IntPtr THEN BEGIN
  446.                           G0(10 (*FLT*),TopNew,StkMax);
  447.                           Attr.TyPtr := RealPtr
  448.                         END
  449.                         ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  450.                           G0(71 (*LFT*),TopNew,StkMax);
  451.                           Attr.TyPtr := RealPtr
  452.                         END
  453.                       END;
  454.                       IF (LastAttr.TyPtr = RealPtr) AND
  455.                          (Attr.TyPtr = RealPtr) THEN
  456.                         G0(3,TopNew,StkMax)
  457.                       ELSE IF (LastAttr.TyPtr = LongPtr) AND
  458.                               (Attr.TyPtr = LongPtr) THEN
  459.                         G0(62 (*ADL*),TopNew,StkMax)
  460.                       ELSE IF (LastAttr.TyPtr^.Form = Power) AND
  461.                               IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
  462.                         G0(28,TopNew,StkMax)
  463.                       ELSE BEGIN
  464.                         Error(134);  Attr.TyPtr := NIL
  465.                       END
  466.                     END;
  467.                   Minus:
  468.                     IF (LastAttr.TyPtr = IntPtr) AND (Attr.TyPtr = IntPtr) THEN
  469.                       G0(21,TopNew,StkMax)
  470.                     ELSE BEGIN
  471.                       IF LastAttr.TyPtr = IntPtr THEN BEGIN
  472.                         IF Attr.TyPtr = RealPtr THEN BEGIN
  473.                           G0(9 (*FLO*),TopNew,StkMax);
  474.                           LastAttr.TyPtr := RealPtr
  475.                         END
  476.                         ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  477.                           G0(66 (*ILO*),TopNew,StkMax);
  478.                           LastAttr.TyPtr := LongPtr
  479.                         END
  480.                       END
  481.                       ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
  482.                         IF Attr.TyPtr = IntPtr THEN BEGIN
  483.                           G0(67 (*ILT*),TopNew,StkMax);
  484.                           Attr.TyPtr := LongPtr
  485.                         END
  486.                         ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
  487.                           G0(70 (*LFO*),TopNew,StkMax);
  488.                           LastAttr.TyPtr := RealPtr
  489.                         END
  490.                       END
  491.                       ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
  492.                         IF Attr.TyPtr = IntPtr THEN BEGIN
  493.                           G0(10 (*FLT*),TopNew,StkMax);
  494.                           Attr.TyPtr := RealPtr
  495.                         END
  496.                         ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  497.                           G0(71 (*LFT*),TopNew,StkMax);
  498.                           Attr.TyPtr := RealPtr
  499.                         END
  500.                       END;
  501.                       IF (LastAttr.TyPtr = RealPtr) AND
  502.                          (Attr.TyPtr = RealPtr) THEN
  503.                         G0(22,TopNew,StkMax)
  504.                       ELSE IF (LastAttr.TyPtr = LongPtr) AND
  505.                               (Attr.TyPtr = LongPtr) THEN
  506.                         G0(63 (*SBL*),TopNew,StkMax)
  507.                       ELSE IF (LastAttr.TyPtr^.Form = Power) AND
  508.                               IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN
  509.                         G0(5,TopNew,StkMax)
  510.                       ELSE BEGIN
  511.                         Error(134);  Attr.TyPtr := NIL
  512.                       END
  513.                     END;
  514.                   OrOpr:
  515.                     IF (LastAttr.TyPtr = BooleanPtr) AND
  516.                        (Attr.TyPtr = BooleanPtr) THEN
  517.                       G0(13,TopNew,StkMax)
  518.                     ELSE BEGIN
  519.                       Error(134);  Attr.TyPtr := NIL
  520.                     END
  521.                 END (* CASE *)
  522.               ELSE Attr.TyPtr := NIL
  523.             END; (* WHILE *)
  524.           END; (* SimpleExpression *)
  525.     
  526.     
  527.         BEGIN (* Expression *)
  528.           SimpleExpression(ESets+[VergleichOp]);
  529.           IF Symb = VergleichOp THEN BEGIN
  530.             IF Attr.TyPtr <> NIL THEN
  531.               IF Attr.TyPtr^.Form <= Power THEN
  532.                 PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex)
  533.               ELSE
  534.                 PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  535.             LastAttr := Attr;  LastOp := Oper;
  536.             IF LastOp = InOp THEN
  537.               IF NOT IsCompatible(Attr.TyPtr,IntPtr) THEN
  538.                 G0T(58,Attr.TyPtr,TopNew,StkMax);
  539.             GetSymbol;
  540.             SimpleExpression(ESets);
  541.             IF Attr.TyPtr <> NIL THEN
  542.               IF Attr.TyPtr^.Form <= Power THEN
  543.                 PushContents(TopNew,StkMax,KonstPtr,KonstPtrIndex)
  544.               ELSE
  545.                 PushAddress(TopNew,StkMax,KonstPtr,KonstPtrIndex);
  546.             IF (LastAttr.TyPtr <> NIL) AND (Attr.TyPtr <> NIL) THEN
  547.               IF LastOp = InOp THEN
  548.                 IF Attr.TyPtr^.Form = Power THEN
  549.                   IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr^.ElemSet) THEN
  550.                     G0(11,TopNew,StkMax)
  551.                   ELSE BEGIN
  552.                     Error(129);  Attr.TyPtr := NIL
  553.                   END
  554.                 ELSE BEGIN
  555.                   Error(130);  Attr.TyPtr := NIL
  556.                 END
  557.               ELSE BEGIN
  558.                 IF LastAttr.TyPtr <> Attr.TyPtr THEN
  559.                   IF LastAttr.TyPtr = IntPtr THEN BEGIN
  560.                     IF Attr.TyPtr = RealPtr THEN BEGIN
  561.                       G0(9,TopNew,StkMax);  LastAttr.TyPtr := RealPtr
  562.                     END
  563.                     ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  564.                       G0(66 (*ILO*),TopNew,StkMax);  LastAttr.TyPtr := LongPtr
  565.                     END
  566.                   END
  567.                   ELSE IF LastAttr.TyPtr = RealPtr THEN BEGIN
  568.                     IF Attr.TyPtr = IntPtr THEN BEGIN
  569.                       G0(10,TopNew,StkMax);  Attr.TyPtr := RealPtr
  570.                     END
  571.                     ELSE IF Attr.TyPtr = LongPtr THEN BEGIN
  572.                       G0(71 (*LFT*),TopNew,StkMax);  LastAttr.TyPtr := RealPtr
  573.                     END
  574.                   END
  575.                   ELSE IF LastAttr.TyPtr = LongPtr THEN BEGIN
  576.                     IF Attr.TyPtr = IntPtr THEN BEGIN
  577.                       G0(67 (*ILT*),TopNew,StkMax);  Attr.TyPtr := LongPtr
  578.                     END
  579.                     ELSE IF Attr.TyPtr = RealPtr THEN BEGIN
  580.                       G0(70 (*LFO*),TopNew,StkMax);  LastAttr.TyPtr := RealPtr
  581.                     END
  582.                   END;
  583.                   IF IsCompatible(LastAttr.TyPtr,Attr.TyPtr) THEN BEGIN
  584.                     ActSize := LastAttr.TyPtr^.Size;
  585.                     CASE LastAttr.TyPtr^.Form OF
  586.                       Scalar:
  587.                         IF LastAttr.TyPtr = RealPtr THEN
  588.                           TypIndex := 'r'
  589.                         ELSE IF LastAttr.TyPtr = BooleanPtr THEN
  590.                           TypIndex := 'b'
  591.                         ELSE IF LastAttr.TyPtr = CharPtr THEN
  592.                           TypIndex := 'c'
  593.                         ELSE IF LastAttr.TyPtr = LongPtr THEN
  594.                           TypIndex := 'l'
  595.                         ELSE
  596.                           TypIndex := 'i';
  597.                       Pointers:
  598.                         BEGIN
  599.                           IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
  600.                             Error(131);
  601.                           TypIndex := 'a'
  602.                         END;
  603.                       Power:
  604.                         BEGIN
  605.                           IF LastOp IN [LessThanOp,GrThanOp] THEN
  606.                             Error(132);
  607.                           TypIndex := 's'
  608.                         END;
  609.                       Arrays:
  610.                         BEGIN
  611.                           IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
  612.                             Error(131);
  613.                           (* IF NOT STRNG(LATTR.TyPtr) THEN ERROR(134); *)
  614.                           TypIndex := 'm'
  615.                         END;
  616.                       Records:
  617.                         BEGIN
  618.                           IF LastOp IN [LessThanOp,LessOp,GrThanOp,GrEqualOp] THEN
  619.                             Error(131);
  620.                           TypIndex := 'm'
  621.                         END;
  622.                       Files:
  623.                         BEGIN
  624.                           Error(133);  TypIndex := 'f'
  625.                         END
  626.                     END; (* CASE *)
  627.                     CASE LastOp OF
  628.                       LessThanOp:
  629.                         G2(53,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  630.                       LessOp:
  631.                         G2(52,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  632.                       GrThanOp:
  633.                         G2(49,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  634.                       GrEqualOp:
  635.                         G2(48,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  636.                       NotEqualOp:
  637.                         G2(55,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  638.                       EqualOp:
  639.                         G2(47,Ord(TypIndex),ActSize,TopNew,StkMax,KonstPtr);
  640.                     END
  641.                   END
  642.                   ELSE Error(129)
  643.                 END;
  644.                 Attr.TyPtr := BooleanPtr;  Attr.Art := IsExpr
  645.               END;
  646.         END; (* Expression *)
  647.