External Cross::Block(2);{$L-}{$E-}{$C-}{$T-}
 PROCEDURE BLOCK;
 VAR
   DBL_DECF,
   (*ZEIGER AUF ERSTE UND LETZTE VARIABLE DIE ALS PROCEDURE*)
   DBL_DECL : ^DBL_DEC;    (*IN DIESEM BLOCK DOPPELT DEKLARIERT WURDEN*)
   CURPROC : LIST_PTR_TY;
   Exit_Set:Set Of Symbol;
   Exit:Boolean;
   (*ZEIGER AUF DIE PROZEDUR IN DEREN
    ANWEISUNGSTEIL DAS PROGRAMM SICH BEFINDET*)
   {%E}
   PROCEDURE RECDEF;
   VAR
     OLD_SPACES_MARK  : INTEGER;
     (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON RECORDS*)
     PROCEDURE CASEDEF;
     VAR
       OLD_SPACES_MARK  : INTEGER;
       (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON VARIANT PARTS*)
       PROCEDURE PARENTHESE;
       VAR
         OLD_SPACES_MARK : INTEGER;
         (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG
          VON KLAMMERN INNERHALB VON VARIANT PARTS*)
       BEGIN (*PARENTHESE*)
         OLD_SPACES_MARK := SPACES;
         IF OLDSPACES
           THEN SPACES := LASTSPACES
           ELSE LASTSPACES := SPACES;
         SPACES := SPACES + BUFFERPTR - 2;
         OLDSPACES := TRUE;
         REPEAT
           INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
           CASE SYTY OF
             LBRACK :
                    PARENTHESE;
             CASESY :
                    CASEDEF;
             RECORDSY :
                    RECDEF;
             Else:{}
           END;
         UNTIL SYTY IN [RPARENT,EOBSY];
         SPACES := OLD_SPACES_MARK;
         OLDSPACES := TRUE;
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
       END (*PARENTHESE*) ;
       {%E}
     BEGIN (*CASEDEF*)
       DELSY ['('] := LBRACK;
       OLD_SPACES_MARK := SPACES;
       IF OLDSPACES
         THEN SPACES := LASTSPACES
         ELSE LASTSPACES := SPACES;
       SPACES := BUFFERPTR - BUFFMARK + SPACES - SYLENG + 3;
       OLDSPACES := TRUE;
       REPEAT
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
         CASE SYTY OF
           LBRACK :
                  PARENTHESE;
           CASESY :
                  CASEDEF;
           RECORDSY:
                  RECDEF;
           Else: {}
         END;
       UNTIL SYTY IN [ENDSY,RPARENT,EOBSY];
       SPACES := OLD_SPACES_MARK;
       DELSY ['('] := LPARENT;
     END (*CASEDEF*) ;
   BEGIN (*RECDEF*)
     OLD_SPACES_MARK := SPACES;
     SPACES := BUFFERPTR - BUFFMARK + SPACES - SYLENG - 2 + FEED;
     OLDSPACES := TRUE;
     INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
     WR_LINE ( BUFFERPTR-SYLENG);
     REPEAT
       CASE SYTY OF
         CASESY :
                CASEDEF;
         RECORDSY :
                RECDEF;
         Else:
                INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC)
       END;
     UNTIL SYTY IN [ENDSY,EOBSY];
     WR_LINE (BUFFERPTR-SYLENG);
     OLDSPACES := TRUE;
     LASTSPACES := SPACES - FEED;
     SPACES := OLD_SPACES_MARK;
     INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
   END (*RECDEF*) ;
   {%E}
   PROCEDURE ERROR (ERRNR : INTEGER);
   BEGIN (*ERROR*)
     ERRFLAG := TRUE;
     WR_LINE (BUFFERPTR);
     WRITE (CROSSLIST,' ':17,' **** ');
     CASE ERRNR OF
       1 :
              WRITELN (CROSSLIST,SY,' ? ? ? ',MESSAGE);
       2 :
   WRITELN (CROSSLIST,'Missing ''End'' OR ''Until'' Number ',EMARKNR : 4);
       3 :
              WRITELN (CROSSLIST,'Missing ''Then'' Number ',EMARKNR : 4);
       4 :
     WRITELN (CROSSLIST,'Missing ''Of'' To ''Case'' Number ',BMARKNR : 4);
       5 :
              WRITELN (CROSSLIST,' Only one ''Exit'' allowed');
       6 :
           WRITELN (CROSSLIST,'Missing ''Exit'' in ''Loop'' ',EMARKNR : 4)
     END;
   END (*ERROR*) ;
   {%E}
   PROCEDURE STATEMENT ;
   VAR
     CURBLOCKNR : INTEGER;     (*AKTUELLE BLOCKNUMMER*)
     PROCEDURE COMPSTAT;
Var Exit:Boolean;
     BEGIN (*COMPSTAT*)
       BMARKTEXT := 'B';
       OLDSPACES := TRUE;
       LASTSPACES := SPACES - BACKFEED;
       INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
       WR_LINE (BUFFERPTR-SYLENG);
       REPEAT
Exit:=False;
         REPEAT
           STATEMENT ;
         UNTIL SYTY IN ENDSYM;
         IF SYTY IN [ENDSY,EOBSY,PROC_SY,FUNCT_SY]
           THEN Exit:=True;
If Not Exit Then
Begin
         ERROR (1);
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
End;
       UNTIL Exit;
       WR_LINE (BUFFERPTR-SYLENG);
       EMARKTEXT := 'E';
       EMARKNR := CURBLOCKNR;
       LASTSPACES := SPACES-BACKFEED;
       OLDSPACES := TRUE;
       IF SYTY = ENDSY
         THEN
           BEGIN
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
             WR_LINE (BUFFERPTR-SYLENG);
           END
         ELSE ERROR (2);
     END (*COMPSTAT*) ;
     {%E}
     PROCEDURE CASESTAT;
     VAR
       OLD_SPACES_MARK : INTEGER;
       (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON CASE-STATEMENTS*)
Exit:Boolean;
Exit_Set,Exit_S2:Set Of Symbol;
     BEGIN (*CASESTAT*)
       BMARKTEXT := 'C';
       OLDSPACES := TRUE;
       LASTSPACES := SPACES-BACKFEED;
       INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
       STATEMENT ;
       IF SYTY = OFSY
         THEN WR_LINE (BUFFERPTR)
         ELSE ERROR (3);
       REPEAT
Exit:=False;
         REPEAT
           REPEAT
             If SyTy<>Other_Wise
               Then
                 INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
Exit_Set:=(EndSym-[ElseSy]+[Colon,Other_Wise]);
           UNTIL SYTY IN Exit_Set;
           IF (SYTY = COLON)Or(SyTy=Other_Wise)
             THEN
               BEGIN
                 OLD_SPACES_MARK := SPACES;
                 LASTSPACES := SPACES;
                 SPACES := OLD_SPACES_MARK + CASEFEED;
                 OLDSPACES := TRUE;
                 INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
                 IF NOT ( SYTY IN BEGSYM )
                   THEN
                     BEGIN
                       WR_LINE ( BUFFERPTR - SYLENG );
                       SPACES := SPACES +1;
                     END;
                 STATEMENT ;
                 SPACES := OLD_SPACES_MARK;
               END;
Exit_S2:=EndSym-[ElseSy];
         UNTIL SYTY IN Exit_S2;
         IF SYTY IN [ENDSY,EOBSY,PROC_SY,FUNCT_SY]
           THEN Exit:=True;
If Not Exit Then
         ERROR (1);
       UNTIL Exit;
       WR_LINE (BUFFERPTR-SYLENG);
       EMARKTEXT := 'E';
       EMARKNR := CURBLOCKNR;
       LASTSPACES := SPACES-BACKFEED;
       OLDSPACES := TRUE;
       IF SYTY = ENDSY
         THEN
           BEGIN
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
             WR_LINE (BUFFERPTR-SYLENG);
           END
         ELSE ERROR (2);
     END (*CASESTAT*) ;
     {%E
      PROCEDURE LOOPSTAT;
      VAR
      LOOPFLAG : BOOLEAN;     (*GESETZT BEIM AUFTRETEN VON EXIT-STATEMENTS
      BEGIN (*LOOPSTAT
      BMARKTEXT := 'L';
      OLDSPACES := TRUE;
      LASTSPACES := SPACES - BACKFEED;
      INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
      WR_LINE (BUFFERPTR-SYLENG);
      LOOPFLAG := FALSE;
      REPEAT
      REPEAT
      STATEMENT ;
      IF SYTY = EXITSY
      THEN
      BEGIN
      WR_LINE (BUFFERPTR-SYLENG);
      IF LOOPFLAG
      THEN ERROR (5);
      OLDSPACES := TRUE;
      LASTSPACES := SPACES-BACKFEED;
      LOOPFLAG := TRUE;
      EMARKTEXT := 'X';
      EMARKNR := CURBLOCKNR;
      INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC); INSYMBOL(Dbl_DecL,CurProc);
      END;
      UNTIL SYTY IN ENDSYM;
      IF SYTY IN [ENDSY,EOBSY,PROC_SY,FUNCT_SY]
      THEN Exit:=True;
If Not Exit Then
Begin
      ERROR (1);
      INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
End;
      UNTIL Exit;
      WR_LINE (BUFFERPTR-SYLENG);
      EMARKTEXT := 'E';
      EMARKNR := CURBLOCKNR;
      LASTSPACES := SPACES-BACKFEED;
      OLDSPACES := TRUE;
      IF SYTY = ENDSY
      THEN
      BEGIN
      INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
      WR_LINE (BUFFERPTR-SYLENG);
      END
      ELSE ERROR (2);
      IF NOT LOOPFLAG
      THEN ERROR (6);
      END (*LOOPSTAT ;
      }
     {%E}
     PROCEDURE IFSTAT ;
     BEGIN (*IFSTAT*)
       BMARKTEXT := 'I';
       LASTSPACES := SPACES - BACKFEED;
       OLDSPACES := TRUE;
       INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
       STATEMENT ;
       SPACES:=SPACES+FEED;
       IF SYTY = THENSY
         THEN
           BEGIN
             WR_LINE (BUFFERPTR-SYLENG);
             LASTSPACES := SPACES - BACKFEED;
             OLDSPACES := TRUE;
             EMARKTEXT := 'T';
             EMARKNR := CURBLOCKNR;
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
             STATEMENT ;
           END
         ELSE ERROR (4);
       IF SYTY = ELSESY
         THEN
           BEGIN
             OLDSPACES := TRUE;
             LASTSPACES := SPACES - BACKFEED;
             WR_LINE (BUFFERPTR-SYLENG);
             EMARKTEXT := 'S';
             EMARKNR := CURBLOCKNR;
             LASTSPACES := SPACES - BACKFEED;
             OLDSPACES := TRUE;
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
             STATEMENT ;
           END;
       SPACES:=SPACES-FEED;
     END (*IFSTAT*) ;
     {%E}
     PROCEDURE LABELSTAT;
     BEGIN (*LABELSTAT*)
       LASTSPACES := 0;
       OLDSPACES := TRUE;
       INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
       WR_LINE (BUFFERPTR-SYLENG);
     END (*LABELSTAT*) ;
     PROCEDURE REPEATSTAT;
Var Exit:Boolean;
     BEGIN (*REPEATSTAT*)
       BMARKTEXT := 'R';
       OLDSPACES := TRUE;
       LASTSPACES := SPACES - BACKFEED;
       INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
       WR_LINE (BUFFERPTR-SYLENG);
       REPEAT
Exit:=False;
         REPEAT
           STATEMENT ;
         UNTIL SYTY IN ENDSYM;
         IF SYTY IN [UNTILSY,EOBSY,PROC_SY,FUNCT_SY]
           THEN Exit:=True;
If Not Exit Then
Begin
         ERROR (1);
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
End;
       UNTIL EXIT;
       WR_LINE (BUFFERPTR-SYLENG);
       EMARKTEXT := 'U';
       EMARKNR := CURBLOCKNR;
       OLDSPACES := TRUE;
       LASTSPACES := SPACES-BACKFEED;
       IF SYTY = UNTILSY
         THEN
           BEGIN
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
             STATEMENT ;
           END
         ELSE ERROR (2);
     END (*REPEATSTAT*) ;
     {%E}
   BEGIN (*STATEMENT*)
     IF SYTY = INTCONST
       THEN
         BEGIN
           INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
           IF SYTY = COLON
             THEN LABELSTAT;
         END;
     IF SYTY IN BEGSYM
       Then
         BEGIN
           BLOCKNR := BLOCKNR + 1;
           CURBLOCKNR := BLOCKNR;
           BMARKNR := CURBLOCKNR;
           WR_LINE (BUFFERPTR-SYLENG);
           SPACES := SPACES + FEED;
           CASE SYTY OF
             BEGINSY :
                    COMPSTAT;
                    {             LOOPSY  :
                     LOOPSTAT;         }
             CASESY  :
                    CASESTAT;
             IFSY    :
                    IFSTAT ;
             REPEATSY :
                    REPEATSTAT ;
             Else:{}
           END;
           SPACES := SPACES - FEED;
         END
ELSE
WHILE NOT(SYTY IN([SEMICOLON,Colon]+ENDSYM))DO
INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
     IF (SYTY = SEMICOLON)Or(SyTy=Colon)
       THEN INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC)
       ELSE
         IF SYTY = DOSY
           THEN
             BEGIN
               INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
               STATEMENT ;
             END;
   END (*STATEMENT*) ;
   {%E}
 BEGIN (*BLOCK*)
   DBL_DECF := NIL;
   LEVEL := LEVEL + 1;
   CURPROC := LISTPTR;
If Level=1 Then
Begin
 Insymbol(Dbl_DecF,Dbl_DecL,CurProc);
 No_Main:=SyTy=ExternSy;
 While SyTy<>Semicolon Do InSymbol(Dbl_DecF,Dbl_DecL,CurProc);
End;
   SPACES := LEVEL * FEED;
   REPEAT
     INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC)
   UNTIL (SYTY IN RELEVANTSYM);
   Repeat
     WHILE SYTY IN (DECSYM) DO
     BEGIN
       WR_LINE (BUFFERPTR-SYLENG);
       SPACES := SPACES - FEED;
       WR_LINE (BUFFERPTR);
       SPACES := SPACES + FEED;
       REPEAT
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
         IF SYTY = RECORDSY
           THEN RECDEF;
       UNTIL SYTY IN RELEVANTSYM;
     END;
     WHILE SYTY IN PROSYM DO
     BEGIN
       WR_LINE (BUFFERPTR-SYLENG);
       OLDSPACES := TRUE;
       IF SYTY <> INITPROCSY
         THEN
           BEGIN
             IF SYTY = PROC_SY
               THEN PROCDEC := 1
               ELSE PROCDEC := 2;
             INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
           END;
       BLOCK;
       IF SYTY = SEMICOLON
         THEN INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
     END;
Exit_Set:=ProSym+DecSym;
Exit:=Not (SyTy In Exit_Set);
   Until Exit;
   LEVEL := LEVEL - 1;

   SPACES := LEVEL * FEED;
   IF NOT ((SYTY IN [BEGINSY,FORWARDSY,EXTERNSY,FORTRANSY,EobSy])
           Or((No_Main)And (SyTy=Point)))
     THEN
       BEGIN
         ERROR (1);
WHILE NOT
(SYTY IN [BEGINSY,FORWARDSY,EXTERNSY,FORTRANSY,EOBSY])
DO INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC)
       END;
       {%E}
   IF SYTY = BEGINSY
     THEN STATEMENT
     ELSE
       BEGIN
         INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
         IF SYTY = FORTRANSY
           THEN INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC) ;
       END ;
   IF DBL_DECF <> NIL
     THEN
       REPEAT
         DBL_DECF^.PROCORT^.PROCVAR := 0;
         DBL_DECF := DBL_DECF^.NEXTPROC;
       UNTIL  DBL_DECF = NIL;
   IF (LEVEL = 0)And (Not No_Main)
     THEN
       BEGIN
         IF SYTY <> POINT
           THEN
             BEGIN
               WRITELN (OUTPUT,'Missing point at program end');
               WRITELN (OUTPUT);
  WRITELN (CROSSLIST,' ' : 17, ' **** Missing point at program end ****');
               INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC);
             END;
         IF SYTY <> EOBSY
           THEN
             REPEAT
               INSYMBOL(DBL_DECF,Dbl_DecL,CURPROC)
             UNTIL SYTY = EOBSY;
       END;
 END (*BLOCK*) ;