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*) ;