home *** CD-ROM | disk | FTP | other *** search
- 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*) ;
- .
-