mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 07:54:25 +00:00
3656 lines
124 KiB
Fortran
3656 lines
124 KiB
Fortran
C***********************************************************************
|
||
C
|
||
C 8 0 8 0 P L / M C O M P I L E R , P A S S - 1
|
||
C PLM81
|
||
C VERSION 2.0
|
||
C JANUARY, 1975
|
||
C
|
||
C COPYRIGHT (C) 1975
|
||
C INTEL CORPORATION
|
||
C 3065 BOWERS AVENUE
|
||
C SANTA CLARA, CALIFORNIA 95051
|
||
C
|
||
C MODIFIED BY JEFF OGDEN (UM), DECEMBER 1977
|
||
C
|
||
C***********************************************************************
|
||
C
|
||
C
|
||
C
|
||
C P A S S - 1 E R R O R M E S S A G E S
|
||
C
|
||
C ERROR MESSAGE
|
||
C NUMBER
|
||
C ------ -------------------------------------------------------------
|
||
C 1 THE SYMBOLS PRINTED BELOW HAVE BEEN USED IN THE CURRENT BLOCK
|
||
C BUT DO NOT APPEAR IN A DECLARE STATEMENT, OR LABEL APPEARS IN
|
||
C A GO TO STATEMENT BUT DOES NOT APPEAR IN THE BLOCK.
|
||
C
|
||
C 2 PASS-1 COMPILER SYMBOL TABLE OVERFLOW. TOO MANY SYMBOLS IN
|
||
C THE SOURCE PROGRAM. EITHER REDUCE THE NUMBER OF VARIABLES IN
|
||
C THE PROGRAM, OR RE-COMPILE PASS-1 WITH A LARGER SYMBOL TABLE.
|
||
C
|
||
C 3 INVALID PL/M STATEMENT. THE PAIR OF SYMBOLS PRINTED BELOW
|
||
C CANNOT APPEAR TOGETHER IN A VALID PL/M STATEMENT (THIS ERROR
|
||
C MAY HAVE BEEN CAUSED BE A PREVIOUS ERROR IN THE PROGRAM).
|
||
C
|
||
C 4 INVALID PL/M STATEMENT. THE STATEMENT IS IMPROPERLY FORMED--
|
||
C THE PARSE TO THIS POINT FOLLOWS (THIS MAY HAVE OCCURRED BE-
|
||
C CAUSE OF A PREVIOUS PROGRAM ERROR).
|
||
C
|
||
C 5 PASS-1 PARSE STACK OVERFLOW. THE PROGRAM STATEMENTS ARE
|
||
C RECURSIVELY NESTED TOO DEEPLY. EITHER SIMPLIFY THE PROGRAM
|
||
C STRUCTURE, OR RE-COMPILE PASS-1 WITH A LARGER PARSE STACK.
|
||
C
|
||
C 6 NUMBER CONVERSION ERROR. THE NUMBER EITHER EXCEEDS 65535 OR
|
||
C CONTAINS DIGITS WHICH CONFLICT WITH THE RADIX INDICATOR.
|
||
C
|
||
C 7 PASS-1 TABLE OVERFLOW. PROBABLE CAUSE IS A CONSTANT STRING
|
||
C WHICH IS TOO LONG. IF SO, THE STRING SHOULD BE WRITTEN AS A
|
||
C SEQUENCE OF SHORTER STRINGS, SEPARATED BY COMMAS. OTHERWISE,
|
||
C RE-COMPILE PASS-1 WITH A LARGER VARC TABLE.
|
||
C
|
||
C 8 MACRO TABLE OVERFLOW. TOO MANY LITERALLY DECLARATIONS.
|
||
C EITHER REDUCE THE NUMBER OF LITERALLY DECLARATIONS, OR RE-
|
||
C COMPILE PASS-1 WITH A LARGER 'MACROS' TABLE.
|
||
C
|
||
C 9 INVALID CONSTANT IN INITIAL, DATA, OR IN-LINE CONSTANT.
|
||
C PRECISION OF CONSTANT EXCEEDS TWO BYTES (MAY BE INTERNAL
|
||
C PASS-1 COMPILER ERROR).
|
||
C
|
||
C 10 INVALID PROGRAM. PROGRAM SYNTAX INCORRECT FOR TERMINATION
|
||
C OF PROGRAM. MAY BE DUE TO PREVIOUS ERRORS WHICH OCCURRED
|
||
C WITHIN THE PROGRAM.
|
||
C
|
||
C 11 INVALID PLACEMENT OF A PROCEDURE DECLARATION WITHIN THE PL/M
|
||
C PROGRAM. PROCEDURES MAY ONLY BE DECLARED IN THE OUTER BLOCK
|
||
C (MAIN PART OF THE PROGRAM) OR WITHIN DO-END GROUPS (NOT
|
||
C ITERATIVE DO'S, DO-WHILE'S, OR DO-CASE'S).
|
||
C
|
||
C 12 IMPROPER USE OF IDENTIFIER FOLLOWING AN END STATEMENT.
|
||
C IDENTIFIERS CAN ONLY BE USED IN THIS WAY TO CLOSE A PROCEDURE
|
||
C DEFINITION.
|
||
C
|
||
C 13 IDENTIFIER FOLLOWING AN END STATEMENT DOES NOT MATCH THE NAME
|
||
C OF THE PROCEDURE WHICH IT CLOSES.
|
||
C
|
||
C 14 DUPLICATE FORMAL PARAMETER NAME IN A PROCEDURE HEADING.
|
||
C
|
||
C 15 IDENTIFIER FOLLOWING AN END STATEMENT CANNOT BE FOUND IN THE
|
||
C PROGRAM.
|
||
C
|
||
C 16 DUPLICATE LABEL DEFINITION AT THE SAME BLOCK LEVEL.
|
||
C
|
||
C 17 NUMERIC LABEL EXCEEDS CPU ADDRESSING SPACE.
|
||
C
|
||
C 18 INVALID CALL STATEMENT. THE NAME FOLLOWING THE CALL IS NOT
|
||
C A PROCEDURE.
|
||
C
|
||
C 19 INVALID DESTINATION IN A GO TO. THE VALUE MUST BE A LABEL
|
||
C OR SIMPLE VARIABLE.
|
||
C
|
||
C 20 MACRO TABLE OVERFLOW (SEE ERROR 8 ABOVE).
|
||
C
|
||
C 21 DUPLICATE VARIABLE OR LABEL DEFINITION.
|
||
C
|
||
C 22 VARIABLE WHICH APPEARS IN A DATA DECLARATION HAS BEEN PRE-
|
||
C VIOUSLY DECLARED IN THIS BLOCK
|
||
C
|
||
C 23 PASS-1 SYMBOL TABLE OVERFLOW (SEE ERROR 2 ABOVE).
|
||
C
|
||
C 24 INVALID USE OF AN IDENTIFIER AS A VARIABLE NAME.
|
||
C
|
||
C 25 PASS-1 SYMBOL TABLE OVERFLOW (SEE ERROR 2 ABOVE).
|
||
C
|
||
C 26 IMPROPERLY FORMED BASED VARIABLE DECLARATION. THE FORM IS
|
||
C I BASED J, WHERE I IS AN IDENTIFIER NOT PREVIOUSLY DECLARED
|
||
C IN THIS BLOCK, AND J IS AN ADDRESS VARIABLE.
|
||
C
|
||
C 27 SYMBOL TABLE OVERFLOW IN PASS-1 (SEE ERROR 2 ABOVE).
|
||
C
|
||
C 28 INVALID ADDRESS REFERENCE. THE DOT OPERATOR MAY ONLY
|
||
C PRECEDE SIMPLE AND SUBSCRIPTED VARIABLES IN THIS CONTEXT.
|
||
C
|
||
C 29 UNDECLARED VARIABLE. THE VARIABLE MUST APPEAR IN A DECLARE
|
||
C STATEMENT BEFORE ITS USE.
|
||
C
|
||
C 30 SUBSCRIPTED VARIABLE OR PROCEDURE CALL REFERENCES AN UN-
|
||
C DECLARED IDENTIFIER. THE VARIABLE OR PROCEDURE MUST BE
|
||
C DECLARED BEFORE IT IS USED.
|
||
C
|
||
C 31 THE IDENTIFIER IS IMPROPERLY USED AS A PROCEDURE OR SUB-
|
||
C SCRIPTED VARIABLE.
|
||
C
|
||
C 32 TOO MANY SUBSCRIPTS IN A SUBSCRIPTED VARIABLE REFERENCE.
|
||
C PL/M ALLOWS ONLY ONE SUBSCRIPT.
|
||
C
|
||
C 33 ITERATIVE DO INDEX IS INVALID. IN THE FORM 'DO I = E1 TO E2'
|
||
C THE VARIABLE I MUST BE SIMPLE (UNSUBSCRIPTED).
|
||
C
|
||
C 34 ATTEMPT TO COMPLEMENT A $ CONTROL TOGGLE WHERE THE TOGGLE
|
||
C CURRENTLY HAS A VALUE OTHER THAN 0 OR 1. USE THE '= N'
|
||
C OPTION FOLLOWING THE TOGGLE TO AVOID THIS ERROR.
|
||
C
|
||
C 35 INPUT FILE NUMBER STACK OVERFLOW. RE-COMPILE PASS-1 WITH
|
||
C A LARGER INSTK TABLE.
|
||
C
|
||
C 36 TOO MANY BLOCK LEVELS IN THE PL/M PROGRAM. EITHER SIMPLIFY
|
||
C YOUR PROGRAM (30 BLOCK LEVELS ARE CURRENTLY ALLOWED) OR
|
||
C RE-COMPILE PASS-1 WITH A LARGER BLOCK TABLE.
|
||
C
|
||
C 37 THE NUMBER OF ACTUAL PARAMETERS IN THE CALLING SEQUENCE
|
||
C IS GREATER THAN THE NUMBER OF FORMAL PARAMETERS DECLARED
|
||
C FOR THIS PROCEDURE.
|
||
C
|
||
C 38 THE NUMBER OF ACTUAL PARAMETERS IN THE CALLING SEQUENCE
|
||
C IS LESS THAN THE NUMBER OF FORMAL PARAMETERS DECLARED
|
||
C FOR THIS PROCEDURE.
|
||
C
|
||
C 39 INVALID INTERRUPT NUMBER (MUST BE BETWEEN 0 AND 7)
|
||
C
|
||
C 40 DUPLICATE INTERRUPT PROCEDURE NUMBER. A PROCEDURE
|
||
C HAS BEEN PREVIOUSLY SPECIFIED WITH AN IDENTICAL
|
||
C INTERRUPT ATTRIBUTE.
|
||
C
|
||
C
|
||
C 41 PROCEDURE APPEARS ON LEFT-HAND-SIDE OF AN ASSIGNMENT.
|
||
C
|
||
C 42 ATTEMPTED 'CALL' OF A TYPED PROCEDURE.
|
||
C
|
||
C 43 ATTEMPTED USE OF AN UNTYPED PROCEDURE AS A FUNCTION
|
||
C OR A VARIABLE.
|
||
C
|
||
C
|
||
C 44 THIS PROCEDURE IS UNTYPED AND SHOULD NOT RETURN A VALUE.
|
||
C
|
||
C 45 THIS PROCEDURE IS TYPED AND SHOULD RETURN A VALUE.
|
||
C
|
||
C 46 'RETURN' IS INVALID OUTSIDE A PROCEDURE DEFINITION.
|
||
C
|
||
C 47 ILLEGAL USE OF A LABEL AS AN IDENTIFIER.
|
||
C
|
||
C ------ -------------------------------------------------------------
|
||
C I M P L E M E N T A T I O N N O T E S
|
||
C - - - - - - - - - - - - - - - - - - -
|
||
C THE PL/M COMPILER IS INTENDED TO BE WRITTEN IN ANSI STANDARD
|
||
C FORTRAN - IV, AND THUS IT SHOULD BE POSSIBLE TO COMPILE AND
|
||
C EXECUTE THIS PROGRAM ON ANY MACHINE WHICH SUPPORTS THIS FORTRAN
|
||
C STANDARD. BOTH PASS-1 AND PASS-2, HOWEVER, ASSUME THE HOST
|
||
C MACHINE WORD SIZE IS AT LEAST 31 BITS, EXCLUDING THE SIGN BIT
|
||
C (I.E., 32 BITS IF THE SIGN IS INCLUDED).
|
||
C
|
||
C THE IMPLEMENTOR MAY FIND IT NECESSARY TO CHANGE THE SOURCE PROGRAM
|
||
C IN ORDER TO ACCOUNT FOR SYSTEM DEPENDENCIES. THESE CHANGES ARE
|
||
C AS FOLLOWS
|
||
C
|
||
C 1) THE FORTRAN LOGICAL UNIT NUMBERS FOR VARIOUS DEVICES
|
||
C MAY HAVE TO BE CHANGED IN THE 'GNC' AND 'WRITEL' SUBROU-
|
||
C TINES (SEE THE FILE DEFINITIONS BELOW).
|
||
C
|
||
C 2) THE HOST MACHINE MAY NOT HAVE THE PL/M 52 CHARACTER SET
|
||
C 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$=./()+-'*,<>:;
|
||
C (THE LAST 15 SPECIAL CHARACTERS ARE
|
||
C DOLLAR, EQUAL, PERIOD, SLASH, LEFT PAREN,
|
||
C RIGHT PAREN, PLUS, MINUS, QUOTE, ASTERISK,
|
||
C COMMA, LESS-THAN, GREATER-THAN, COLON, SEMI-COLON)
|
||
C IN THIS CASE, IT IS NECESSARY TO CHANGE THE 'OTRAN' VECTOR IN
|
||
C BLOCK DATA TO A CHARACTER SET WHICH THE HOST MACHINE SUPPORTS
|
||
C
|
||
C 3) THE COMPUTED GO TO IN 'SYNTH' MAY BE TOO LONG FOR SOME
|
||
C COMPILERS. IF YOU GET A COMPILATION ERROR, BREAK THE
|
||
C 'GO TO' INTO TWO SECTIONS.
|
||
C
|
||
C 4) THE HOST FORTRAN SYSTEM MAY HAVE A LIMITATION ON THE NUMBER
|
||
C OF CONTIGUOUS COMMENT RECORDS (E.G. S/360 LEVEL G). IF SO,
|
||
C INTERSPERSE THE DECLARATION STATEMENTS INTEGER I1000, INTEGER
|
||
C I1001, ETC., AS NECESSARY TO BREAK UP THE LENGTH OF COMMENTS.
|
||
C THE SYMBOLS I1XXX ARE RESERVED FOR THIS PURPOSE.
|
||
C
|
||
C THERE ARE A NUMBER OF COMPILER PARAMETERS WHICH MAY HAVE TO
|
||
C BE CHANGED FOR YOUR INSTALLATION. THESE PARAMETERS ARE DEFINED
|
||
C BELOW (SEE 'SCANNER COMMANDS'), AND THE CORRESPONDING DEFAULT
|
||
C VALUES ARE SET FOLLOWING THEIR DEFINITION. FOR EXAMPLE, THE
|
||
C $RIGHTMARGIN = I
|
||
C PARAMETER DETERMINES THE RIGHT MARGIN OF THE INPUT SOURCE LINE.
|
||
C THE PARAMETER IS SET EXTERNALLY BY A SINGLE LINE STARTING WITH
|
||
C '$R' IN COLUMNS ONE AND TWO (THE REMAINING CHARACTERS UP TO
|
||
C THE '=' ARE IGNORED). THE INTERNAL COMPILER REPRESENTATION
|
||
C OF THE CHARACTER 'R' IS 29 (SEE CHARACTER CODES BELOW), AND THUS
|
||
C THE VALUE OF THE $RIGHTMARGIN PARAMETER CORRESPONDS TO ELEMENT 29
|
||
C OF THE 'CONTRL' VECTOR.
|
||
C
|
||
C 1) THE PARAMETERS $T, $P, $W, $I, $O, AND $R
|
||
C CONTROL THE OPERATING MODE OF PL/M. FOR BATCH PROCESSING,
|
||
C ASSUMING 120 CHARACTER (OR LARGER) PRINT LINE AND 80 CHARAC-
|
||
C TER CARD IMAGE, THE PARAMETERS SHOULD DEFAULT AS FOLLOWS
|
||
C $TERMINAL = 0
|
||
C $PRINT = 1
|
||
C $WIDTH = 120
|
||
C $INPUT = 2
|
||
C $OUTPUT = 2
|
||
C $RIGHTMARGIN= 80
|
||
C NOTE THAT IT MAY BE DESIRABLE TO LEAVE $R=72 TO ALLOW ROOM
|
||
C FOR AN 8-DIGIT SEQUENCE NUMBER IN COLUMNS 73-80 OF THE PL/M
|
||
C SOURCE CARD.
|
||
C
|
||
C 2) FOR INTERACTIVE PROCESSING, ASSUMING A CONSOLE WITH WIDTH
|
||
C OF 72 CHARACTERS (E.G., A TTY), THESE PARAMETERS SHOULD
|
||
C DEFAULT AS FOLLOWS
|
||
C $TERMINAL = 1
|
||
C $PRINT = 1
|
||
C $WIDTH = 72
|
||
C $INPUT = 1
|
||
C $OUTPUT = 1
|
||
C $RIGHTMARGIN= 72
|
||
C
|
||
C 3) THE CHARACTERISTICS OF THE INTERMEDIATE LANGUAGE FILES
|
||
C PRODUCED BY PASS-1 ARE GOVERNED BY THE $J, $K, $U, $V, AND
|
||
C $Y PARAMETERS. THESE PARAMETERS CORRESPOND TO THE DESTINATION
|
||
C AND WIDTH OF THE INTERMEDIATE CODE FILE ($J AND $K), AND
|
||
C DESTINATION AND WIDTH OF THE INTERMEDIATE SYMBOL TABLE ($U
|
||
C AND $V). SOME FORTRAN SYSTEMS DELETE THE LEADING CHARACTER
|
||
C OF THE FILES PRODUCED BY OTHER FORTRAN PROGRAMS. THE $Y
|
||
C PARAMETER CAN BE USED TO PAD EXTRA BLANKS AT THE BEGINNING OF
|
||
C THE INTERMEDIATE FILES IF THIS BECOMES A PROBLEM ON THE HOST
|
||
C SYSTEM.
|
||
C
|
||
C UNDER NORMAL CIRCUMSTANCES, THESE PARAMETERS WILL NOT
|
||
C HAVE TO BE CHANGED. IN ANY CASE, EXPERIMENT WITH VARIOUS
|
||
C VALUES OF THE $ PARAMETERS BY SETTING THEM EXTERNALLY BE-
|
||
C FORE ACTUALLY CHANGING THE DEFAULTS.
|
||
C
|
||
C THE IMPLEMENTOR MAY ALSO WISH TO INCREASE OR DECREASE THE SIZE
|
||
C OF PASS-1 OR PASS-2 TABLES. THE TABLES IN PASS-1 WHICH MAY BE
|
||
C CHANGED IN SIZE ARE 'MACROS' AND 'SYMBOL' WHICH CORRESPOND TO
|
||
C THE AREAS WHICH HOLD 'LITERALLY' DEFINITIONS AND PROGRAM SYMBOLS
|
||
C AND ATTRIBUTES, RESPECTIVELY. IT IS IMPOSSIBLE TO PROVIDE AN
|
||
C EXACT FORMULA WHICH RELATES THE NUMBER OF SYMBOLS HELD BY EITHER
|
||
C OF THESE TABLES TO THE TABLE LENGTH, SINCE TABLE SPACE IS DY-
|
||
C NAMICALLY ALLOCATED ACCORDING TO SYMBOL NAME LENGTH AND NUMBER
|
||
C OF ATTRIBUTES REQUIRED FOR THE PARTICULAR SYMBOL.
|
||
C
|
||
C 1) IN THE CASE OF THE MACROS TABLE, THE LENGTH IS RELATED TO THE
|
||
C TOTAL NUMBER OF CHARACTERS IN THE MACRO NAMES PLUS THE TOTAL
|
||
C NUMBER OF CHARACTERS IN THE MACRO DEFINITIONS - AT THE DEEP-
|
||
C EST BLOCK LEVEL DURING COMPILATION. TO CHANGE THE MACRO
|
||
C TABLE SIZE, ALTER ALL OCCURRENCES OF
|
||
C
|
||
C MACROS(500)
|
||
C
|
||
C IN EACH SUBROUTINE TO MACROS(N), WHERE N REPRESENTS THE NEW
|
||
C INTEGER CONSTANT SIZE. IN ADDITION, THE 'DATA' STATEMENT
|
||
C BLOCK DATA (LAST PROGRAM SEGMENT) MUST BE CHANGED FOR THE
|
||
C MACRO PARAMETERS BASED UPON THE CONSTANT VALUE N TO
|
||
C
|
||
C DATA MACROS /N*0/, CURMAC /N+1/, MAXMAC /N/,
|
||
C 1 MACTOP /1/
|
||
C
|
||
C 2) IF THE IMPLEMENTOR WISHES TO INCREASE OR DECREASE THE SIZE
|
||
C OF THE SYMBOL TABLE, THEN ALL OCCURRENCES OF
|
||
C
|
||
C SYMBOL(4000)
|
||
C
|
||
C MUST BE CHANGED TO SYMBOL(M), WHERE M IS THE DESIRED INTEGER
|
||
C CONSTANT SIZE. THE 'DATA' STATEMENTS FOR SYMBOL TABLE PARA-
|
||
C METERS MUST ALSO BE ALTERED AS DESCRIBED IN THE CORRESPONDING
|
||
C COMMENT IN BLOCK DATA. IN PARTICULAR, THE LAST ITEM OF
|
||
C THE DATA STATEMENT FOR 'SYMBOL' FILLS THE UNINITIALIZED POR-
|
||
C TION OF THE TABLE WITH ZEROES, AND HENCE MUST BE THE EVALUATION
|
||
C OF THE ELEMENT
|
||
C (M-120)*0
|
||
C
|
||
C (IT IS CURRENTLY (4000-120)*0 = 3880*0). THE DATA STATEMENT
|
||
C FOR MAXSYM AND SYMABS MUST BE CHANGED TO INITIALIZE THESE
|
||
C VARIABLES TO THE VALUE M.
|
||
C
|
||
C GOOD LUCK...
|
||
C
|
||
C
|
||
C F I L E D E F I N I T I O N S
|
||
C INPUT OUTPUT
|
||
C
|
||
C FILE FORTRAN MTS DEFAULT FORTRAN MTS DEFAULT
|
||
C NUM I/O UNIT I/O UNIT FDNAME I/O UNIT I/O UNIT FDNAME
|
||
C
|
||
C 1 1 GUSER *MSOURCE* 11 SERCOM *MSINK*
|
||
C 2 2 SCARDS *SOURCE* 12 SPRINT *SINK*
|
||
C 3 3 3 13 13
|
||
C 4 4 4 14 14
|
||
C 5 5 5 15 15
|
||
C 6 6 6 16 16 -PLM16##
|
||
C 7 7 7 17 17 -PLM17##
|
||
C
|
||
C ALL INPUT RECORDS ARE 80 CHARACTERS OR LESS. ALL
|
||
C OUTPUT RECORDS ARE 120 CHARACTERS OR LESS.
|
||
C THE FORTRAN UNIT NUMBERS CAN BE CHANGED IN THE
|
||
C SUBROUTINES GNC AND WRITEL (THESE ARE THE ONLY OC-
|
||
C CURRENCES OF REFERENCES TO THESE UNITS).
|
||
C
|
||
C
|
||
C
|
||
C 0 1 2 3 4 5 6 7 8 9
|
||
C 0 0 0 0 0 0 0 0 1 1
|
||
C 2 3 4 5 6 7 8 9 0 1
|
||
C
|
||
C
|
||
C $ = . / ( ) + - ' * , < > : ;
|
||
C 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5
|
||
C 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
|
||
C
|
||
C
|
||
C A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
||
C 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
|
||
C 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
|
||
C
|
||
C
|
||
C SEQNO SUB/FUNC NAME
|
||
C 15410000 SUBROUTINE EXITB
|
||
C 16300000 INTEGER FUNCTION LOOKUP(IV)
|
||
C 17270000 INTEGER FUNCTION ENTER(INFOV)
|
||
C 18050000 SUBROUTINE DUMPSY
|
||
C 20030000 SUBROUTINE RECOV
|
||
C 20420000 LOGICAL FUNCTION STACK(Q)
|
||
C 20930000 LOGICAL FUNCTION PROK(PRD)
|
||
C 21550000 SUBROUTINE REDUCE
|
||
C 22100000 SUBROUTINE CLOOP
|
||
C 22740000 SUBROUTINE PRSYM(CC,SYM)
|
||
C 23120000 INTEGER FUNCTION GETC1(I,J)
|
||
C 23330000 SUBROUTINE SCAN
|
||
C 25280000 INTEGER FUNCTION WRDATA(SY)
|
||
C 26460000 SUBROUTINE DUMPCH
|
||
C 26960000 SUBROUTINE SYNTH(PROD,SYM)
|
||
C 36310000 INTEGER FUNCTION GNC(Q)
|
||
C 37980000 SUBROUTINE WRITEL(NSPACE)
|
||
C 38520000 FUNCTION ICON(I)
|
||
C 38710000 SUBROUTINE DECIBP
|
||
C 38850000 SUBROUTINE CONV(PREC)
|
||
C 39090000 SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH)
|
||
C 39370000 SUBROUTINE CONOUT(CC,K,N,BASE)
|
||
C 39690000 SUBROUTINE PAD(CC,CHR,I)
|
||
C 39800000 SUBROUTINE STACKC(I)
|
||
C 39950000 SUBROUTINE ENTERB
|
||
C 40180000 SUBROUTINE DUMPIN
|
||
C 40880000 SUBROUTINE ERROR(I,LEVEL)
|
||
C 41320000 INTEGER FUNCTION SHR(I,J)
|
||
C 41360000 INTEGER FUNCTION SHL(I,J)
|
||
C 41400000 INTEGER FUNCTION RIGHT(I,J)
|
||
C 41440000 SUBROUTINE SDUMP
|
||
C 41670000 SUBROUTINE REDPR(PROD,SYM)
|
||
C 41900000 SUBROUTINE EMIT(VAL,TYP)
|
||
C
|
||
C***********************************************************************
|
||
C
|
||
INTEGER I
|
||
INTEGER TITLE(10),VERS
|
||
COMMON /TITL/TITLE,VERS
|
||
C
|
||
C SYNTAX ANALYZER TABLES
|
||
INTEGER SHL,SHR,RIGHT,CONV,GETC1
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
C GLOBAL VARIABLES
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18)
|
||
COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
C THE FOLLOWING SCANNER COMMANDS ARE DEFINED
|
||
C ANALYZE = I (12) PRINT SYNTAX ANALYSIS TRACE
|
||
C BYPASS (13) BYPASS STACK DUMP ON ERROR
|
||
C COUNT = I (14) BEGIN LINE COUNT AT I
|
||
C DELETE = I (15)
|
||
C EOF (16)
|
||
C GENERATE (18)
|
||
C INPUT = I (20)
|
||
C JFILE (CODE)= I (21)
|
||
C KWIDTH (CD)= I (22)
|
||
C LEFTMARGIN = I (23)
|
||
C MEMORY = I (24)
|
||
C OUTPUT = I (26)
|
||
C PRINT (T OR F) (27)
|
||
C RIGHTMARG = I (29)
|
||
C SYMBOLS (30)
|
||
C TERMINAL (31) (0=BATCH, 1=TERM, 2=INTERLIST)
|
||
C USYMBOL = I (32)
|
||
C VWIDTH (SYM) = I (33)
|
||
C WIDTH = I (34)
|
||
C YPAD = N (36) BLANK PAD ON OUTPUT
|
||
C CONTRL(1) IS THE ERROR COUNT
|
||
DO 2 I=1,64
|
||
2 CONTRL(I) = -1
|
||
CONTRL(1) = 0
|
||
CONTRL(12) = 0
|
||
CONTRL(13) = 1
|
||
CONTRL(14) = 0
|
||
CONTRL(15) = 120
|
||
CONTRL(16) = 0
|
||
CONTRL(18) = 0
|
||
CONTRL(20) = 2
|
||
CONTRL(21) = 6
|
||
CONTRL(22) = 72
|
||
CONTRL(23) = 1
|
||
CONTRL(24) = 1
|
||
CONTRL(26) = 2
|
||
CONTRL(27) = 1
|
||
CONTRL(29) = 80
|
||
CONTRL(30) = 0
|
||
CONTRL(31) = 1
|
||
CONTRL(32) = 7
|
||
CONTRL(33) = 72
|
||
CONTRL(34) = 120
|
||
CONTRL(36) = 1
|
||
C
|
||
DO 4 I=1,5
|
||
4 PRMASK(I)=2**(I*8-8)-1
|
||
DO 8 I=1,256
|
||
ITRAN(I) = 1
|
||
8 CONTINUE
|
||
C
|
||
DO 5 I=53,64
|
||
OTRAN(I) = OTRAN(1)
|
||
5 CONTINUE
|
||
C
|
||
DO 10 I=1,52
|
||
J = OTRAN(I)
|
||
J = ICON(J)
|
||
10 ITRAN(J) = I
|
||
CALL CONOUT(0,4,8080,10)
|
||
CALL PAD(1,1,1)
|
||
CALL FORM(1,TITLE,1,10,10)
|
||
CALL CONOUT(1,1,VERS/10,10)
|
||
CALL PAD(1,40,1)
|
||
CALL CONOUT(1,1,MOD(VERS,10),10)
|
||
CALL WRITEL(1)
|
||
DO 20 I=1,3
|
||
20 PSTACK(I)=0
|
||
PSTACK(4)=EOFILE
|
||
SP = 4
|
||
CALL SCAN
|
||
CALL CLOOP
|
||
CALL EMIT(NOP,OPR)
|
||
100 IF (POLTOP.EQ.0) GO TO 200
|
||
CALL EMIT(NOP,OPR)
|
||
GO TO 100
|
||
200 CONTINUE
|
||
C PRINT ERROR COUNT
|
||
I = CONTRL(1)
|
||
J = CONTRL(26)
|
||
K = J
|
||
300 CONTINUE
|
||
CALL WRITEL(0)
|
||
CONTRL(26) = J
|
||
IF (I.EQ.0) CALL FORM(0,MSSG,6,7,41)
|
||
IF (I.NE.0) CALL CONOUT(2,-5,I,10)
|
||
CALL PAD(1,1,1)
|
||
CALL FORM(1,MSSG,8,20,41)
|
||
IF (I.NE.1) CALL PAD(1,30,1)
|
||
CALL PAD(0,1,1)
|
||
CALL WRITEL(0)
|
||
C CHECK FOR TERMINAL CONTROL OF A BATCH RUN
|
||
IF ((J.EQ.1).OR.(CONTRL(31).EQ.0)) GO TO 400
|
||
C ARRIVE HERE IF TERMINAL TOGGLE GT 0, AND OUTPUT NOT CONSOLE
|
||
J = 1
|
||
GO TO 300
|
||
400 CONTINUE
|
||
CONTRL(26) = K
|
||
CALL DUMPSY
|
||
C MAY WANT A SYMBOL TABLE FOR THE SIMULATOR
|
||
IF(CONTRL(24).EQ.0) SYMBOL(2) = 0
|
||
CALL DUMPCH
|
||
CALL DUMPIN
|
||
STOP
|
||
END
|
||
SUBROUTINE EXITB
|
||
C GOES THROUGH HERE UPON BLOCK EXIT
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER HENTRY(127),HCODE
|
||
COMMON /HASH/HENTRY,HCODE
|
||
INTEGER RIGHT,SHR,SHL
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
LOGICAL ERRED
|
||
ERRED = .FALSE.
|
||
IF (CURBLK .LE. 0) GO TO 9999
|
||
I = BLOCK(CURBLK)
|
||
N = MACBLK(CURBLK)
|
||
CURMAC = RIGHT(N,12)
|
||
MACTOP = SHR(N,12)
|
||
CURBLK = CURBLK - 1
|
||
J = SYMBOL(SYMTOP)
|
||
100 IF (J.LT.I) GO TO 300
|
||
IF (SYMBOL(J+1).LT.0) GO TO 200
|
||
K = IABS(SYMBOL(J+2))
|
||
KP = RIGHT(K,4)
|
||
LP = SHR(KP,8)
|
||
IF(KP.GE.LITER) GO TO 200
|
||
IF ((KP.NE.VARB).AND.(KP.NE.LABEL))GO TO 150
|
||
K = RIGHT(SHR(K,4),4)
|
||
IF (K.NE.0) GO TO 150
|
||
IF ((KP.EQ.LABEL).AND.(CURBLK.GT.1)) GO TO 200
|
||
IF (ERRED) GO TO 130
|
||
CALL ERROR(1,1)
|
||
ERRED=.TRUE.
|
||
130 CALL PAD(0,1,5)
|
||
N = SYMBOL(J+1)
|
||
N = SHR(N,12)
|
||
IF (N.EQ.0) GO TO 150
|
||
DO 120 KP=1,N
|
||
LTEMP=J+2+KP
|
||
L=SYMBOL(LTEMP)
|
||
DO 120 LP=1,PACK
|
||
JP = 30-LP*6
|
||
JP = RIGHT(SHR(L,JP),6)+1
|
||
CALL PAD(1,JP,1)
|
||
120 CONTINUE
|
||
CALL WRITEL(0)
|
||
150 SYMBOL(J+1) = -SYMBOL(J+1)
|
||
C MAY WANT TO FIX THE HASH CODE CHAIN
|
||
IF (LP.LE.0) GO TO 200
|
||
C FIND MATCH ON THE ENTRY
|
||
K = J - 1
|
||
KP = SYMBOL(K)
|
||
HCODE = SHR(KP,16)
|
||
KP = RIGHT(KP,16)
|
||
N = HENTRY(HCODE)
|
||
IF (N.NE.K) GO TO 160
|
||
C
|
||
C THIS ENTRY IS DIRECTLY CONNECTED
|
||
HENTRY(HCODE) = KP
|
||
GO TO 200
|
||
C
|
||
C LOOK THROUGH SOME LITERALS IN THE SYMBOL TABLE ABOVE
|
||
160 NP = RIGHT(SYMBOL(N),16)
|
||
IF (NP.EQ.K) GO TO 170
|
||
N = NP
|
||
GO TO 160
|
||
C
|
||
170 SYMBOL(N) = SHR(HCODE,16) + KP
|
||
C
|
||
200 J = RIGHT(SYMBOL(J),16)
|
||
GO TO 100
|
||
300 BLKSYM = BLOCK(CURBLK)
|
||
9999 RETURN
|
||
END
|
||
INTEGER FUNCTION LOOKUP(IV)
|
||
C SYNTAX ANALYZER TABLES
|
||
INTEGER SHL,SHR,RIGHT,CONV,GETC1
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER HENTRY(127),HCODE
|
||
COMMON /HASH/HENTRY,HCODE
|
||
INTEGER ENTER
|
||
LOGICAL SFLAG
|
||
EQUIVALENCE (L,SYMLEN),(I,SYMLOC)
|
||
NVAL = FIXV(IV)
|
||
SFLAG = PSTACK(IV) .NE. NUMBV
|
||
I = VAR(IV)
|
||
L = SHR(I,12)
|
||
I = RIGHT(I,12)
|
||
J = I
|
||
KP = PACK*6
|
||
K = KP
|
||
JP = 0
|
||
M = 0
|
||
100 IF (JP .GE. L) GO TO 300
|
||
K = K - 6
|
||
IF (K .GE. 0) GO TO 200
|
||
VARC(J) = M
|
||
J = J + 1
|
||
M = 0
|
||
K = KP - 6
|
||
200 LTEMP=JP+I
|
||
M=SHL(VARC(LTEMP)-1,K)+M
|
||
JP = JP + 1
|
||
GO TO 100
|
||
300 VARC(J) = M
|
||
C VARC IS NOW IN PACKED FORM READY FOR LOOKUP
|
||
C COMPUTE HASH CODE (REDUCE NUMBERS MOD 127, USE FIRST 5 CHARS OF
|
||
C IDENTIFIERS AND STRINGS )
|
||
HCODE = NVAL
|
||
IF (SFLAG) HCODE = VARC(I)
|
||
HCODE = MOD(HCODE,127) + 1
|
||
C HCODE IS IN THE RANGE 1 TO 127
|
||
LP = (L-1)/PACK + 1
|
||
K = HENTRY(HCODE)
|
||
400 IF (K .LE. 0) GO TO 9990
|
||
IF (SFLAG) GO TO 450
|
||
C COMPARE NUMBERS IN INTERNAL FORM RATHER THAN CHARACTERS
|
||
J = SYMBOL(K+3)
|
||
IF (RIGHT(J,4).LE.LITER) GO TO 600
|
||
J = SHR(J,8)
|
||
IF (J.EQ.NVAL) GO TO 510
|
||
GO TO 600
|
||
450 J = SYMBOL(K+2)
|
||
JP = RIGHT(J,12)
|
||
IF (JP .NE. L) GO TO 600
|
||
J = K + 3
|
||
JP = I
|
||
DO 500 M=1,LP
|
||
LTEMP=J+M
|
||
IF(VARC(JP).NE.SYMBOL(LTEMP)) GO TO 600
|
||
500 JP = JP + 1
|
||
C SYMBOL FOUND
|
||
C
|
||
C MAKE SURE THE TYPES MATCH.
|
||
JP = PSTACK(IV)
|
||
M = SYMBOL(K+3)
|
||
M = RIGHT(M,4)
|
||
IF ((JP.EQ.STRV).AND.(M.EQ.LITER)) GO TO 510
|
||
IF ((JP.NE.IDENTV).OR.(M.GE.LITER)) GO TO 600
|
||
C JP IS IDENTIFIER, M IS VARIABLE, LABEL, OR PROCEDURE.
|
||
510 LOOKUP = K+2
|
||
RETURN
|
||
600 K = SYMBOL(K)
|
||
K = RIGHT(K,16)
|
||
GO TO 400
|
||
9990 LOOKUP = 0
|
||
RETURN
|
||
END
|
||
INTEGER FUNCTION ENTER(INFOV)
|
||
INTEGER Q,TYP,INFO,INFOV,SHR,SHL,RIGHT
|
||
C SYNTAX ANALYZER TABLES
|
||
INTEGER CONV,GETC1
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
C
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER HENTRY(127),HCODE
|
||
COMMON /HASH/HENTRY,HCODE
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
C ENTER ASSUMES A PREVIOUS CALL TO LOOKUP (EITHER THAT, OR SET UP
|
||
C THE VALUES OF SYMLOC AND SYMLEN IN THE VARC ARRAY).
|
||
C ALSO SET-UP HASH CODE VALUE (SEE LOOKUP), IF NECESSARY
|
||
INFO = INFOV
|
||
I = SYMTOP
|
||
IF (INFO.GE.0) GO TO 10
|
||
C ENTRY WITH NO EXTERNAL NAME
|
||
IHASH = 0
|
||
HCODE = 0
|
||
INFO = - INFO
|
||
SYMLEN = 0
|
||
Q = 0
|
||
GO TO 20
|
||
C
|
||
10 IHASH = 1
|
||
Q = (SYMLEN-1)/PACK + 1
|
||
C
|
||
20 SYMTOP = SYMTOP + Q + IHASH + 3
|
||
IQ = I
|
||
I = I + IHASH
|
||
C
|
||
IF (SYMTOP .LE. MAXSYM) GO TO 100
|
||
I = IHASH
|
||
SYMTOP = Q + IHASH + 3
|
||
CALL ERROR(2,5)
|
||
100 SYMBOL(SYMTOP) = I
|
||
SYMCNT = SYMCNT + 1
|
||
SYMBOL(I) = SHL(SYMCNT,16) + SYMBOL(IQ)
|
||
I = I + 1
|
||
SYMBOL(I) = SHL(Q,12) + SYMLEN
|
||
IP = I + 1
|
||
SYMBOL(IP) = INFO
|
||
L = SYMLOC - 1
|
||
IF (Q.EQ.0) GO TO 210
|
||
DO 200 J = 1,Q
|
||
LTEMP=IP+J
|
||
LTEMP1=L+J
|
||
200 SYMBOL(LTEMP)=VARC(LTEMP1)
|
||
210 ENTER = I
|
||
C
|
||
C COMPUTE HASH TABLE ENTRY
|
||
IF (IHASH.EQ.0) GO TO 300
|
||
C FIX COLLISION CHAIN
|
||
SYMBOL(IQ) = SHL(HCODE,16) + HENTRY(HCODE)
|
||
HENTRY(HCODE) = IQ
|
||
300 RETURN
|
||
END
|
||
SUBROUTINE DUMPSY
|
||
INTEGER INTPRO(8)
|
||
COMMON /INTER/INTPRO
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER RIGHT,SHR,SHL
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON/BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER LOOKUP,ENTER
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
IC = CONTRL(30)
|
||
IF (IC.EQ.0) GO TO 2000
|
||
CALL WRITEL(0)
|
||
IF (IC.GT.1) CALL FORM(0,MSSG,42,77,77)
|
||
I = SYMBOL(SYMTOP)
|
||
IT = SYMTOP
|
||
210 IF (I .LE. 0) GO TO 1000
|
||
K = SYMBOL(I)
|
||
KP = SHR(K,16)
|
||
C QUICK CHECK FOR ZERO LENGTH NAME
|
||
IF (IC.GE.2) GO TO 215
|
||
N = IABS(SYMBOL(I+1))
|
||
IF (SHR(N,12).EQ.0) GO TO 218
|
||
215 CONTINUE
|
||
CALL PAD(0,30,1)
|
||
CALL CONOUT(1,5,KP,10)
|
||
218 CONTINUE
|
||
K = SYMBOL(I+1)
|
||
IF (IC.LT.2) GO TO 220
|
||
J = 1
|
||
IF (K .LT. 0) J = 47
|
||
CALL PAD(1,J,1)
|
||
CALL PAD(1,1,1)
|
||
220 CONTINUE
|
||
K = IABS(K)
|
||
KP = SHR(K,12)
|
||
N = KP
|
||
K = RIGHT(K,12)
|
||
MC = K
|
||
IF (IC.LT.2) GO TO 230
|
||
CALL CONOUT(1,4,I+1,10)
|
||
CALL PAD(1,1,1)
|
||
CALL CONOUT(1,-3,KP,10)
|
||
CALL PAD(1,1,1)
|
||
CALL CONOUT(1,-4,K,10)
|
||
CALL PAD(1,1,1)
|
||
230 CONTINUE
|
||
K = SYMBOL(I+2)
|
||
J = 29
|
||
IF (IC.LT.2) GO TO 240
|
||
IF (K .LT. 0) J = 13
|
||
CALL PAD(1,J,1)
|
||
CALL PAD(1,1,1)
|
||
240 CONTINUE
|
||
K = IABS(K)
|
||
M = RIGHT(K,4)
|
||
IF (IC.LT.2) GO TO 250
|
||
KP = SHR(K,8)
|
||
CALL CONOUT(1,6,KP,10)
|
||
KP = RIGHT(SHR(K,4),4)
|
||
CALL CONOUT(1,-3,KP,10)
|
||
KP = RIGHT(K,4)
|
||
CALL CONOUT(1,-3,KP,10)
|
||
250 CONTINUE
|
||
CALL PAD(1,1,1)
|
||
IP = I+2
|
||
IF (N.EQ.0) GO TO 310
|
||
IF (M.EQ.LITER) CALL PAD(1,46,1)
|
||
DO 300 KP=1,N
|
||
LTEMP=KP+IP
|
||
L=SYMBOL(LTEMP)
|
||
DO 300 LP=1,PACK
|
||
IF ((KP-1)*PACK+LP.GT.MC) GO TO 305
|
||
JP = 30-LP*6
|
||
JP = RIGHT(SHR(L,JP),6)+1
|
||
CALL PAD(1,JP,1)
|
||
300 CONTINUE
|
||
305 IF (M.EQ.LITER) CALL PAD(1,46,1)
|
||
310 IP = IP + N
|
||
IF (IC.LT.2) GO TO 330
|
||
320 IP = IP + 1
|
||
IF (IP .GE. IT) GO TO 330
|
||
CALL PAD(1,1,1)
|
||
K = SYMBOL(IP)
|
||
J = 1
|
||
IF (K .LT. 0) J = 45
|
||
CALL PAD(1,J,1)
|
||
K = IABS(K)
|
||
CALL CONOUT(1,8,K,16)
|
||
GO TO 320
|
||
330 IT = I
|
||
I = RIGHT(SYMBOL(I),16)
|
||
GO TO 210
|
||
1000 CONTINUE
|
||
CALL WRITEL(0)
|
||
2000 CONTINUE
|
||
CALL WRITEL(0)
|
||
K = CONTRL(26)
|
||
CONTRL(26) = CONTRL(32)
|
||
KP = CONTRL(34)
|
||
CONTRL(34) = CONTRL(33)
|
||
C WRITE THE INTERRUPT PROCEDURE NAMES
|
||
CALL PAD(1,41,1)
|
||
DO 2050 I = 1,8
|
||
J = INTPRO(I)
|
||
IF (J.LE.0) GO TO 2050
|
||
C WRITE INTNUMBER SYMBOLNUM (4 BASE-32 DIGITS)
|
||
CALL PAD(1,I+1,1)
|
||
DO 2020 L=1,3
|
||
CALL PAD(1,RIGHT(J,5)+2,1)
|
||
2020 J = SHR(J,5)
|
||
CALL PAD(1,41,1)
|
||
2050 CONTINUE
|
||
CALL PAD(1,41,1)
|
||
CALL WRITEL(0)
|
||
C
|
||
C
|
||
C REVERSE THE SYMBOL TABLE POINTERS
|
||
C SET THE LENGTH FIELD OF COMPILER-GENERATED LABELS TO 1
|
||
C
|
||
L = 0
|
||
I = SYMTOP
|
||
J = SYMBOL(I)
|
||
SYMBOL(I) = 0
|
||
2100 IF (J.EQ.0) GO TO 2200
|
||
L = L + 1
|
||
C CHECK FOR A LABEL VARIABLE
|
||
K = SYMBOL(J+2)
|
||
IF (MOD(K,16).NE.LABEL) GO TO 2110
|
||
C CHECK FOR CHARACTER LENGTH = 0
|
||
K = IABS(SYMBOL(J+1))
|
||
IF (MOD(K,4096).NE.0) GO TO 2110
|
||
C SET LENGTH TO 1 AND PREC TO 5 (FOR COMP GENERATED LABELS)
|
||
SYMBOL(J+2) = 336 + LABEL
|
||
C 336 = 1 * 256 + 5 * 16
|
||
2110 M = SYMBOL(J)
|
||
SYMBOL(J) = I
|
||
I = J
|
||
J = RIGHT(M,16)
|
||
GO TO 2100
|
||
C
|
||
2200 CONTINUE
|
||
JP = 0
|
||
IFIN = 1
|
||
IP = 1
|
||
J = 1
|
||
C
|
||
2500 IF (J.NE.JP) GO TO 2610
|
||
J = J + IP
|
||
2610 IF (J.LT.IFIN) GO TO 2700
|
||
C OTHERWISE GET ANOTHER ENTRY FROM TABLE
|
||
CALL PAD(1,41,1)
|
||
J = I + 1
|
||
I = SYMBOL(I)
|
||
IF (I.EQ.0) GO TO 2800
|
||
IP = IABS(SYMBOL(J))
|
||
IP = RIGHT(SHR(IP,12),12)
|
||
J = J + 1
|
||
JP = J + 1
|
||
C CHECK FOR BASED VARIABLE -- COMPUTE LAST ENTRY
|
||
IFIN = JP + IP
|
||
IF (SYMBOL(J).LT.0) IFIN = IFIN + 1
|
||
GO TO 2500
|
||
2700 L = 1
|
||
LP = SYMBOL(J)
|
||
IF (LP.LT.0) L = 45
|
||
LP = IABS(LP)
|
||
CALL PAD(1,L,1)
|
||
2710 CALL PAD(1,RIGHT(LP,5)+2,1)
|
||
LP = SHR(LP,5)
|
||
IF (LP.GT.0) GO TO 2710
|
||
J = J + 1
|
||
GO TO 2500
|
||
C
|
||
2800 CALL PAD(1,41,1)
|
||
CALL WRITEL(0)
|
||
CONTRL(26) = K
|
||
CONTRL(34) = KP
|
||
RETURN
|
||
END
|
||
SUBROUTINE RECOV
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER GETC1
|
||
INTEGER RIGHT
|
||
C FIND SOMETHING SOLID IN THE TEXT
|
||
100 IF(TOKEN.EQ.DECL.OR.TOKEN.EQ.PROCV.OR.TOKEN.EQ.ENDV
|
||
1 .OR.TOKEN.EQ.DOV.OR.TOKEN.EQ.SEMIV.OR.TOKEN.EQ.EOFILE) GO TO 300
|
||
200 CALL SCAN
|
||
GO TO 100
|
||
C AND IN THE STACK
|
||
300 I = PSTACK(SP)
|
||
IF (FAILSF.AND.GETC1(I,TOKEN).NE.0) GO TO 500
|
||
IF (I.EQ.EOFILE.AND.TOKEN.EQ.EOFILE) GO TO 400
|
||
IF ((I.EQ.GROUPV.OR.I.EQ.SLISTV.OR.I.EQ.STMTV.OR.
|
||
1 I.EQ.DOV.OR.I.EQ.PROCV).AND.TOKEN.NE.EOFILE) GO TO 200
|
||
C BUT DON'T GO TOO FAR
|
||
IF (SP.LE.4) GO TO 200
|
||
VARTOP = RIGHT(VAR(SP),12)
|
||
SP = SP - 1
|
||
GO TO 300
|
||
400 COMPIL = .FALSE.
|
||
500 FAILSF = .FALSE.
|
||
RETURN
|
||
END
|
||
LOGICAL FUNCTION STACK(Q)
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER GETC1,SHL,SHR
|
||
INTEGER Q
|
||
100 I = GETC1(PSTACK(SP),TOKEN)+1
|
||
GO TO (1000,2000,3000,4000),I
|
||
C ILLEGAL SYMBOL PAIR
|
||
1000 CALL ERROR(3,1)
|
||
CALL PRSYM(0,PSTACK(SP))
|
||
CALL PAD(1,1,1)
|
||
CALL PRSYM(1,TOKEN)
|
||
CALL SDUMP
|
||
CALL RECOV
|
||
C RECOVER MAY HAVE SET COMPILING FALSE
|
||
IF (.NOT.COMPIL) GO TO 2000
|
||
GO TO 100
|
||
C RETURN TRUE
|
||
2000 STACK = .TRUE.
|
||
GO TO 9999
|
||
C RETURN FALSE
|
||
3000 STACK = .FALSE.
|
||
GO TO 9999
|
||
C CHECK TRIPLES
|
||
4000 CONTINUE
|
||
J = SHL(PSTACK(SP-1),16)+SHL(PSTACK(SP),8)+TOKEN
|
||
IU = NC1TRI+2
|
||
IL = 1
|
||
4100 K =SHR(IU+IL,1)
|
||
JP = C1TRI(K)
|
||
IF(J .LT. JP) IU = K
|
||
IF(J .GE. JP) IL = K
|
||
IF ((IU-IL) .GT. 1) GO TO 4100
|
||
C CHECK FOR MATCH
|
||
STACK = J .EQ. C1TRI(IL)
|
||
9999 RETURN
|
||
END
|
||
LOGICAL FUNCTION PROK(PRD)
|
||
INTEGER PRD
|
||
INTEGER SHL,SHR,RIGHT,CONV,GETC1
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
C CONTEXT CHECK OF EQUAL OR IMBEDDED RIGHT PARTS
|
||
I = CONTC(PRD)+1
|
||
GO TO (1000,2000,3000,4000),I
|
||
C NO CHECK REQUIRED
|
||
1000 PROK = .TRUE.
|
||
GO TO 9999
|
||
C RIGHT CONTEXT CHECK
|
||
2000 PROK = GETC1(HDTB(PRD),TOKEN) .NE. 0
|
||
GO TO 9999
|
||
C LEFT CONTEXT CHECK
|
||
3000 K = HDTB(PRD) - NT
|
||
L = PRLEN(PRD)
|
||
LTEMP=SP-L
|
||
I=PSTACK(LTEMP)
|
||
L = LEFTI(K)+1
|
||
LP = LEFTI(K+1)
|
||
IF (L .GT. LP) GO TO 3200
|
||
DO 3100 J=L,LP
|
||
IF (LEFTC(J) .NE. I) GO TO 3100
|
||
PROK = .TRUE.
|
||
GO TO 9999
|
||
3100 CONTINUE
|
||
3200 CONTINUE
|
||
C
|
||
PROK = .FALSE.
|
||
GO TO 9999
|
||
C CHECK TRIPLES
|
||
4000 CONTINUE
|
||
K = HDTB(PRD)-NT
|
||
L=PRLEN(PRD)
|
||
LTEMP=SP-L
|
||
I=SHL(PSTACK(LTEMP),8)+TOKEN
|
||
L = TRIPI(K)+1
|
||
LP = TRIPI(K+1)
|
||
IF (L .LT. LP) GO TO 4200
|
||
DO 4100 J=L,LP
|
||
IF (CONTT(J) .NE. I) GO TO 4100
|
||
PROK = .TRUE.
|
||
GO TO 9999
|
||
4100 CONTINUE
|
||
4200 CONTINUE
|
||
PROK = .FALSE.
|
||
9999 RETURN
|
||
END
|
||
SUBROUTINE REDUCE
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
INTEGER SHL,SHR,RIGHT,CONV,GETC1
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER I,J,PRD,K,L,M
|
||
LOGICAL JL,ML,PROK
|
||
EQUIVALENCE (J,JL),(M,ML)
|
||
C PACK STACK TOP
|
||
K = SP-4
|
||
L = SP-1
|
||
J = 0
|
||
DO 100 I=K,L
|
||
100 J = SHL(J,8)+PSTACK(I)
|
||
LTEMP=PSTACK(SP)
|
||
K=PRIND(LTEMP)+1
|
||
L=PRIND(LTEMP+1)
|
||
C
|
||
DO 200 PRD=K,L
|
||
M = PRLEN(PRD)
|
||
M = 8 * (M - 1)
|
||
M = RIGHT (J, M)
|
||
IF (M .NE. PRTB(PRD)) GO TO 200
|
||
IF (.NOT. PROK(PRD)) GO TO 200
|
||
MP = SP -PRLEN(PRD)+1
|
||
MPP1 = MP+1
|
||
J = HDTB(PRD)
|
||
CALL SYNTH(PRDTB(PRD),J)
|
||
SP = MP
|
||
PSTACK(SP) = J
|
||
VARTOP=RIGHT(VAR(SP),12)
|
||
GO TO 9999
|
||
C
|
||
200 CONTINUE
|
||
300 CONTINUE
|
||
C NO APPLICABLE PRODUCTION
|
||
CALL ERROR(4,1)
|
||
FAILSF = .FALSE.
|
||
CALL SDUMP
|
||
CALL RECOV
|
||
9999 RETURN
|
||
END
|
||
SUBROUTINE CLOOP
|
||
LOGICAL STACK
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
INTEGER SHL,SHR,RIGHT
|
||
COMPIL = .TRUE.
|
||
100 IF (.NOT. COMPIL) GO TO 9999
|
||
IF (.NOT. STACK(0)) GO TO 400
|
||
C STACK MAY HAVE SET COMPILING FALSE
|
||
IF (.NOT.COMPIL) GO TO 9999
|
||
SP = SP + 1
|
||
IF (SP .LT. MSTACK) GO TO 300
|
||
CALL ERROR(5,5)
|
||
GO TO 9999
|
||
300 PSTACK(SP) = TOKEN
|
||
C INSERT ACCUM INTO VARC HERE
|
||
IF (TOKEN .NE. NUMBV) GO TO 302
|
||
CALL CONV(16)
|
||
IF (VALUE.GE.0) GO TO 301
|
||
CALL ERROR(6,1)
|
||
VALUE = 0
|
||
301 FIXV(SP) = VALUE
|
||
302 VAR(SP) = VARTOP
|
||
305 IF (ACCLEN .EQ. 0) GO TO 315
|
||
DO 310 J=1,ACCLEN
|
||
VARC(VARTOP) = ACCUM(J)
|
||
VARTOP = VARTOP + 1
|
||
IF (VARTOP .LE. MVAR) GO TO 310
|
||
CALL ERROR(7,5)
|
||
VARTOP = 1
|
||
310 CONTINUE
|
||
315 IF (TOKEN .NE. STRV) GO TO 360
|
||
IF (STYPE .NE. CONT) GO TO 360
|
||
CALL SCAN
|
||
GO TO 305
|
||
360 I = VARTOP-VAR(SP)
|
||
IF (I .LT. 0) I = 1
|
||
VAR(SP) = SHL(I,12) + VAR(SP)
|
||
CALL SCAN
|
||
GO TO 100
|
||
400 CALL REDUCE
|
||
GO TO 100
|
||
9999 RETURN
|
||
END
|
||
SUBROUTINE PRSYM(CC,SYM)
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER CC,SYM,SHL,SHR,RIGHT
|
||
INTEGER PBUFF(30)
|
||
K=VLOC(SYM+1)
|
||
IF (SYM .GT. NT) GO TO 100
|
||
L = V(K)
|
||
CALL FORM(CC,V,K+1,K+L,NSY+1)
|
||
GO TO 9999
|
||
100 CONTINUE
|
||
L = RIGHT(K,15)-1
|
||
K = SHR(K,15)
|
||
KP = 0
|
||
DO 300 I=1,K,PACK
|
||
L = L + 1
|
||
LP = V(L)
|
||
JP = PACK * 6
|
||
DO 300 J=1,PACK
|
||
JP = JP - 6
|
||
KP = KP + 1
|
||
IP = SHR(LP,JP)
|
||
PBUFF(KP) = RIGHT(IP,6)+1
|
||
300 CONTINUE
|
||
C
|
||
CALL FORM(CC,PBUFF,1,K,30)
|
||
9999 RETURN
|
||
END
|
||
INTEGER FUNCTION GETC1(I,J)
|
||
INTEGER SHL,SHR,RIGHT
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
K = (NT+1)*I+J
|
||
L = K/15+1
|
||
L = C1(L)
|
||
M = SHL(14-MOD(K,15),1)
|
||
GETC1=RIGHT(SHR(L,M),2)
|
||
RETURN
|
||
END
|
||
SUBROUTINE SCAN
|
||
INTEGER GNC,SHL,SHR,RIGHT
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
C SCAN FINDS THE NEXT ENTITY IN THE INPUT STREAM
|
||
C THE RESULTING ITEM IS PLACED INTO ACCUM (OF LENGTH
|
||
C ACCLEN). TYPE AND STYPE IDENTIFY THE ITEM AS SHOWN
|
||
C BELOW --
|
||
C TYPE STYPE ITEM VARIABLE
|
||
C 1 NA END OF FILE EOFLAG
|
||
C 2 CONT IDENTIFIER IDENT
|
||
C 3 RADIX NUMBER NUMB
|
||
C 4 NA SPEC CHAR SPECL
|
||
C 5 CONT STRING STR
|
||
C
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
FAILSF = .TRUE.
|
||
10 I=GNC(0)
|
||
ACCLEN = 0
|
||
IF (STYPE .NE. CONT) GO TO 51
|
||
GO TO (100,200,51,51,499), TYPE
|
||
C DEBLANK INPUT
|
||
50 I = GNC(0)
|
||
51 IF (I .EQ. 0) GO TO 100
|
||
GO TO (50,300,300,300,300,300,300,300,300,300,300,
|
||
1 200,200,200,200,200,200,200,200,200,200,
|
||
2 200,200,200,200,200,200,200,200,200,200,
|
||
3 200,200,200,200,200,200,
|
||
4 400,400,400,400,400,400,400,400,400,400,
|
||
5 400,400,400,400,400,400,400,400,400,400,
|
||
6 400,400,400,400,400,400,400),I
|
||
C END OF FILE
|
||
100 TYPE = EOFLAG
|
||
GO TO 999
|
||
C IDENTIFIER
|
||
200 TYPE = IDENT
|
||
210 ACCLEN = ACCLEN + 1
|
||
ACCUM(ACCLEN) = I
|
||
IF (ACCLEN .GE. 32) GO TO 220
|
||
215 I = GNC(0)
|
||
C CHECK FOR $ WITHIN AN IDENTIFIER
|
||
IF (I.EQ.38) GO TO 215
|
||
IF ((I .GE. 2) .AND. (I .LE. 37)) GO TO 210
|
||
CALL DECIBP
|
||
STYPE = 0
|
||
GO TO 999
|
||
220 STYPE = CONT
|
||
GO TO 999
|
||
C
|
||
C
|
||
C NUMBER
|
||
300 TYPE = NUMB
|
||
STYPE = 0
|
||
310 ACCLEN = ACCLEN +1
|
||
ACCUM(ACCLEN) = I
|
||
IF (ACCLEN .EQ. 32) GO TO 350
|
||
312 I = GNC(0)
|
||
C CHECK FOR $ IN NUMBER
|
||
IF (I.EQ.38) GO TO 312
|
||
IF ((I .GE. 2) .AND. (I .LE. 17)) GO TO 310
|
||
C CHECK RADIX
|
||
IF (I .EQ. 19) STYPE = 16
|
||
IF (I .EQ. 28) STYPE = 8
|
||
IF (I .EQ. 26) STYPE = 8
|
||
IF (STYPE .NE. 0) GO TO 325
|
||
IF (ACCUM(ACCLEN) .EQ. 13) GO TO 315
|
||
IF (ACCUM(ACCLEN) .EQ. 15) GO TO 318
|
||
STYPE = 10
|
||
GO TO 320
|
||
315 STYPE = 2
|
||
ACCLEN = ACCLEN - 1
|
||
GO TO 320
|
||
318 STYPE = 10
|
||
ACCLEN = ACCLEN -1
|
||
320 CALL DECIBP
|
||
325 DO 330 I=1,ACCLEN
|
||
J = ACCUM(I) -2
|
||
IF (J.GE.STYPE) GO TO 340
|
||
330 CONTINUE
|
||
GO TO 999
|
||
340 STYPE = 1
|
||
GO TO 999
|
||
350 STYPE = 1
|
||
351 I = GNC(0)
|
||
IF ((I .GE. 2) .AND. (I .LE. 17)) GO TO 351
|
||
CALL DECIBP
|
||
GO TO 999
|
||
C SPECIAL CHARACTER (TEST FOR QUOTE)
|
||
400 CONTINUE
|
||
IF (I .EQ. 46) GO TO 500
|
||
TYPE = SPECL
|
||
ACCLEN = 1
|
||
ACCUM(1) = I
|
||
IF (I .NE. 41) GO TO 999
|
||
I = GNC(0)
|
||
C LOOK FOR COMMENT
|
||
IF (I .EQ. 47) GO TO 410
|
||
CALL DECIBP
|
||
GO TO 999
|
||
C COMMENT FOUND
|
||
410 I = GNC (0)
|
||
IF (I .EQ. 0) GO TO 100
|
||
IF (I .NE. 47) GO TO 410
|
||
I = GNC(0)
|
||
IF (I .EQ. 41) GO TO 420
|
||
CALL DECIBP
|
||
GO TO 410
|
||
420 ACCLEN = 0
|
||
GO TO 50
|
||
C CONTINUE WITH STRING
|
||
499 CALL DECIBP
|
||
C STRING QUOTE
|
||
500 TYPE = STR
|
||
ACCUM(1) = 1
|
||
510 I = GNC(0)
|
||
IF (I .EQ. 46) GO TO 530
|
||
520 ACCLEN = ACCLEN +1
|
||
ACCUM(ACCLEN) = I
|
||
IF (ACCLEN .LT. 32) GO TO 510
|
||
STYPE = CONT
|
||
GO TO 999
|
||
C STRING QUOTE FOUND (ENDING, MAYBE)
|
||
530 I = GNC(0)
|
||
IF (I. EQ. 46) GO TO 520
|
||
CALL DECIBP
|
||
STYPE = 0
|
||
C THE CODE BELOW IS HERE TO SATISFY THE SYNTAX ANALYZER
|
||
999 IF (TYPE.EQ.EOFLAG) GO TO 2000
|
||
TOKEN = STRV
|
||
IF (TYPE .EQ. STR) RETURN
|
||
TOKEN = 0
|
||
IF (ACCLEN .GT. VIL) GO TO 3000
|
||
C SEARCH FOR TOKEN IN VOCABULARY
|
||
J = VINDX(ACCLEN)+1
|
||
K = VINDX(ACCLEN+1)
|
||
DO 1300 I=J,K
|
||
L = VLOC(I)
|
||
LP = L + V(L)
|
||
L = L + 1
|
||
N = 1
|
||
DO 1200 M=L,LP
|
||
IF (ACCUM(N) .NE. V(M)) GO TO 1300
|
||
1200 N = N + 1
|
||
TOKEN = I-1
|
||
GO TO 1400
|
||
1300 CONTINUE
|
||
GO TO 3000
|
||
1400 RETURN
|
||
2000 TOKEN = EOFILE
|
||
RETURN
|
||
3000 IF (TYPE .NE. IDENT) GO TO 4000
|
||
TOKEN = IDENTV
|
||
L = MACTOP
|
||
3100 L = MACROS(L)
|
||
IF (L .EQ. 0) GO TO 3400
|
||
K = MACROS(L+1)
|
||
IF (K .NE. ACCLEN) GO TO 3100
|
||
I = L+2
|
||
DO 3200 J=1,K
|
||
IF (ACCUM(J) .NE. MACROS(I)) GO TO 3100
|
||
3200 I = I + 1
|
||
C MACRO FOUND, SET-UP MACRO TABLE AND RESCAN
|
||
CURMAC = CURMAC - 1
|
||
IF (CURMAC .GT. MACTOP) GO TO 3300
|
||
CALL ERROR(8,5)
|
||
CURMAC = MAXMAC
|
||
3300 J = I + MACROS(I)
|
||
MACROS(CURMAC) = SHL(I,12)+J
|
||
GO TO 10
|
||
3400 CONTINUE
|
||
4000 IF (TYPE .EQ. NUMB) TOKEN = NUMBV
|
||
RETURN
|
||
END
|
||
INTEGER FUNCTION WRDATA(SY)
|
||
INTEGER SY
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
LOGICAL DFLAG
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
C IF SY IS NEGATIVE, THE CALL COMES FROM SYNTH -- DATA IS INSERTED
|
||
C INLINE BY CALLING LIT WITH EACH BYTE VALUE.
|
||
C
|
||
C IF SY IS POSITIVE, THE CALL COMES FROM DUMPIN --
|
||
C WRDATA WRITES DATA INTO THE OUTPUT FILE FROM SYMBOL AT LOCATION
|
||
C 'SY' EACH BYTE VALUE IS WRITTEN AS A PAIR OF BASE 32 DIGITS.
|
||
C THE HIGH ORDER BIT OF THE FIRST DIGIT IS 1, AND ALL REMAINING HIGH
|
||
C ORDER DIGITS ARE ZERO. THE VALUE RETURNED BY WRDATA IS THE TOTAL
|
||
C NUMBER OF BYTES WRITTEN.
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER ASCII(64)
|
||
COMMON /ASC/ASCII
|
||
INTEGER SHL, SHR, RIGHT
|
||
NBYTES = 0
|
||
J = IABS(SY)
|
||
C
|
||
C CHECK PRECISION OF VALUE
|
||
K = SYMBOL(J+1)
|
||
C SET DFLAG TO TRUE IF WE ARE DUMPING A VARIABLE OR LABEL NAME
|
||
L = RIGHT(K,4)
|
||
DFLAG = (L.EQ.LABEL).OR.(L.EQ.VARB).OR.(L.EQ.PROC)
|
||
L = RIGHT(SHR(K,4),4)
|
||
IF ((L.GT.2).OR.DFLAG) GO TO 400
|
||
C
|
||
C SINGLE OR DOUBLE BYTE CONSTANT
|
||
KP = SHR(K,8)
|
||
K = 16
|
||
NBYTES = L
|
||
C
|
||
200 IF (L.LE.0) GO TO 9999
|
||
C PROCESS NEXT BYTE
|
||
L = L - 1
|
||
N = RIGHT(SHR(KP,L*8),8)
|
||
IF (SY.LT.0) GO TO 350
|
||
C N IS THEN WRITTEN IN TWO PARTS
|
||
DO 300 I=1,2
|
||
K = RIGHT(SHR(N,(2-I)*4),4) + K + 2
|
||
CALL PAD(1,K,1)
|
||
300 K = 0
|
||
C
|
||
GO TO 200
|
||
C
|
||
C OTHERWISE EMIT DATA INLINE
|
||
350 CALL EMIT(N,LIT)
|
||
GO TO 200
|
||
C
|
||
C WRITE OUT STRING DATA
|
||
400 CONTINUE
|
||
L = RIGHT(IABS(SYMBOL(J)),12)
|
||
J = J + 1
|
||
K = 16
|
||
N = - 1
|
||
NP = (PACK-1)*6
|
||
LP = 1
|
||
C
|
||
500 IF (LP.GT.L) GO TO 9999
|
||
IF (N.GE.0) GO TO 600
|
||
N = NP
|
||
J = J + 1
|
||
M = SYMBOL(J)
|
||
C
|
||
600 CONTINUE
|
||
NBYTES = NBYTES + 1
|
||
KP = RIGHT(SHR(M,N),6)+1
|
||
IF (DFLAG) GO TO 900
|
||
KP = ASCII(KP)
|
||
C
|
||
C WRITE OUT BOTH HEX VALUES
|
||
IF (SY.LT.0) GO TO 800
|
||
C
|
||
DO 700 IP=1,2
|
||
K = RIGHT(SHR(KP,(2-IP)*4),4) + K + 2
|
||
CALL PAD(1,K,1)
|
||
700 K = 0
|
||
710 N = N - 6
|
||
LP = LP + 1
|
||
GO TO 500
|
||
C
|
||
C EMIT STRING DATA INLINE
|
||
800 CALL EMIT(KP,LIT)
|
||
GO TO 710
|
||
C
|
||
C WRITE OUT THE VARIABLE OR LABEL NAME
|
||
900 CALL PAD(1,KP,1)
|
||
GO TO 710
|
||
9999 WRDATA = NBYTES
|
||
RETURN
|
||
END
|
||
SUBROUTINE DUMPCH
|
||
C DUMP THE SYMBOLIC NAMES FOR THE SIMULATOR
|
||
INTEGER SHR,SHL,RIGHT
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER WRDATA
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
CALL WRITEL(0)
|
||
KT = CONTRL(26)
|
||
CONTRL(26) = CONTRL(32)
|
||
KQ = CONTRL(34)
|
||
CONTRL(34) = CONTRL(33)
|
||
C
|
||
K = 0
|
||
I = 2
|
||
IF (SYMBOL(2).EQ.0) I=0
|
||
CALL PAD(1,41,1)
|
||
200 IF (I.EQ.0) GO TO 1000
|
||
K = K + 1
|
||
J = SYMBOL(I+2)
|
||
IF (J.LT.0) GO TO 400
|
||
J = MOD(J,16)
|
||
IF ((J.NE.LABEL).AND.(J.NE.VARB).AND.(J.NE.PROC)) GO TO 400
|
||
C CHECK FOR NO CHARACTERS
|
||
J = IABS(SYMBOL(I+1))
|
||
C CHECK FOR NO WORDS ALLOCATED
|
||
IF (SHR(J,12).EQ.0) GO TO 400
|
||
C WRITE SYMBOL NUMBER
|
||
M = K
|
||
DO 300 L=1,3
|
||
CALL PAD(1,MOD(M,32)+2,1)
|
||
M = M/32
|
||
300 CONTINUE
|
||
C NOW WRITE THE STRING
|
||
M = WRDATA(I+1)
|
||
CALL PAD(1,41,1)
|
||
400 I = SYMBOL(I)
|
||
GO TO 200
|
||
C
|
||
1000 CALL PAD(1,41,1)
|
||
CALL WRITEL(0)
|
||
CONTRL(26) = KT
|
||
CONTRL(34) = KQ
|
||
RETURN
|
||
END
|
||
SUBROUTINE SYNTH(PROD,SYMM)
|
||
C
|
||
C MP == LEFT , SP == RIGHT
|
||
C
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER PROD,SYMM,SHL,SHR,RIGHT,ENTER,LOOKUP,WRDATA
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18)
|
||
COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR
|
||
INTEGER ASCII(64)
|
||
COMMON /ASC/ASCII
|
||
INTEGER INTPRO(8)
|
||
COMMON /INTER/INTPRO
|
||
IF(CONTRL(12).NE.0) CALL REDPR(PROD,SYMM)
|
||
C 1 1 2 3 4 5 6 7 8 9 10
|
||
C 2 11 12 13 14 15 16 17 18 19 20
|
||
C 3 21 22 23 24 25 26 27 28 29 30
|
||
C 4 31 32 33 34 35 36 37 38 39 40
|
||
C 5 41 42 43 44 45 46 47 48 49 50
|
||
C 6 51 52 53 54 55 56 57 58 59 60
|
||
C 7 61 62 63 64 65 66 67 68 69 70
|
||
C 8 71 72 73 74 75 76 77 78 79 80
|
||
C 9 81 82 83 84 85 86 87 88 89 90
|
||
C A 91 92 93 94 95 96 97 98 99 100
|
||
C B 101 102 103 104 105 106 107 108 109 110
|
||
C C 111 112 113 114 115 116 117 118 119 120
|
||
C D 121 122 123 124 125 126 127 128 129 130
|
||
GO TO (
|
||
1 100,99999,99999,99999,99999, 600,99999, 800,99999,99999,
|
||
2 99999, 800, 1300, 1340, 1360,99999,99999, 1500, 1600,99999,
|
||
3 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700,
|
||
4 2800, 2900,99999, 3100, 3200, 3300, 3400, 3500, 3540, 3600,
|
||
5 3700, 3800, 3700, 4000, 4100, 4200, 4300, 4350, 4400, 4500,
|
||
6 4600, 4700, 5000,99999,99999,99999,99999,99999, 5300, 5600,
|
||
7 5610, 5620, 5610, 5400, 5500,99999, 5700, 5800, 5900,99999,
|
||
8 6100, 6400, 6300, 6400, 6500, 6600, 6500, 6800, 6900, 6800,
|
||
9 7100, 7100,99999,99999,99999, 7500,99999, 7600, 7700,99999,
|
||
1 7900,99999, 8100,99999, 8300, 8400, 8400, 8400, 8400, 8400,
|
||
2 8400,99999, 9300, 9300, 9300, 9300, 9400,99999,10000,10000,
|
||
3 10000,10300,10310,10320,10400,10500,99999,10550,10560,10600,
|
||
4 10700,10800,10900,11000,11100,11200,11300,11400),PROD
|
||
C P R O D U C T I O N S
|
||
C <PROGRAM> ::= <STATEMENT LIST>
|
||
C <STATEMENT LIST> ::= <STATEMENT>
|
||
100 CONTINUE
|
||
IF (MP .NE. 5) CALL ERROR(10,1)
|
||
COMPIL = .FALSE.
|
||
CALL EXITB
|
||
GO TO 99999
|
||
C <STATEMENT LIST> ::= <STATEMENT LIST> <STATEMENT>
|
||
C <STATEMENT> ::= <BASIC STATEMENT>
|
||
C <STATEMENT> ::= <IF STATEMENT>
|
||
C <BASIC STATEMENT> ::= <ASSIGNMENT> ;
|
||
600 IF (ACNT .LE. 0) GO TO 630
|
||
LTEMP=MAXSYM-ACNT
|
||
I=SYMBOL(LTEMP)
|
||
ACNT = ACNT - 1
|
||
IF (I.GT.0) GO TO 610
|
||
CALL EMIT(XCH,OPR)
|
||
GO TO 620
|
||
610 J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),ADR)
|
||
620 IF(ACNT.GT.0) CALL EMIT(STO,OPR)
|
||
GO TO 600
|
||
630 I = STD
|
||
GO TO 88888
|
||
C <BASIC STATEMENT> ::= <GROUP> ;
|
||
C <BASIC STATEMENT> ::= <PROCEDURE DEFINITION> ;
|
||
800 CONTINUE
|
||
I = DOPAR(CURBLK)
|
||
I = RIGHT(I,2)
|
||
IF (I.EQ.0) GO TO 99999
|
||
CALL ERROR(11,1)
|
||
GO TO 99999
|
||
C <BASIC STATEMENT> ::= <RETURN STATEMENT> ;
|
||
C <BASIC STATEMENT> ::= <CALL STATEMENT> ;
|
||
C <BASIC STATEMENT> ::= <GO TO STATEMENT> ;
|
||
C <BASIC STATEMENT> ::= <DECLARATION STATEMENT> ;
|
||
C <BASIC STATEMENT> ::= HALT
|
||
1300 I = HAL
|
||
GO TO 88888
|
||
C <BASIC STATEMENT> ::= ENABLE;
|
||
1340 CONTINUE
|
||
I = ENA
|
||
GO TO 88888
|
||
C <BASIC STATEMENT> ::= DISABLE;
|
||
1360 CONTINUE
|
||
I = DIS
|
||
GO TO 88888
|
||
C <BASIC STATEMENT> ::= ;
|
||
C <BASIC STATEMENT> ::= <LABEL DEFINITION> <BASIC STATEMENT>
|
||
1500 I = FIXV(MP)
|
||
GO TO 1610
|
||
C <IF STATEMENT> ::= <IF CLAUSE> <STATEMENT>
|
||
1600 I = FIXV(MP)
|
||
1610 J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),DEF)
|
||
SYMBOL(I+1) = 64+LABEL
|
||
GO TO 99999
|
||
C <IF STATEMENT> ::= <IF CLAUSE> <TRUE PART> <STATEMENT>
|
||
C <IF STATEMENT> ::= <LABEL DEFINITION> <IF STATEMENT>
|
||
C <IF CLAUSE> ::= IF <EXPRESSION> THEN
|
||
1800 I = ENTER(-LABEL)
|
||
J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),VLU)
|
||
CALL EMIT(TRC,OPR)
|
||
FIXV(MP) = I
|
||
GO TO 99999
|
||
C <TRUE PART> ::= <BASIC STATEMENT> ELSE
|
||
1900 I = ENTER(-LABEL)
|
||
J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
J = FIXV(MP-1)
|
||
FIXV(MP-1) = I
|
||
I = J
|
||
GO TO 1610
|
||
C <GROUP> ::= <GROUP HEAD> <ENDING>
|
||
2000 IF (FIXV(SP).GT.0) CALL ERROR(12,1)
|
||
IF (FIXC(SP).LT.0) FIXC(MP) = 0
|
||
I = DOPAR(CURBLK+1)
|
||
J = RIGHT(I,2) + 1
|
||
I = SHR(I,2)
|
||
GO TO (2060,2050,2040,2005),J
|
||
C GENERATE DESTINATION OF CASE BRANCH
|
||
2005 J = RIGHT(I,14)
|
||
K = SHR(SYMBOL(J-1),16)
|
||
CALL EMIT(K,DEF)
|
||
M = SHR(SYMBOL(J+1),8)
|
||
SYMBOL(J+1) = RIGHT(SYMBOL(J+1),8)
|
||
C M IS SYMBOL NUMBER OF LABEL AT END OF JUMP TABLE
|
||
CALL EMIT(CSE,OPR)
|
||
C DEFINE THE JUMP TABLE
|
||
I = SHR(I,14)
|
||
C REVERSE THE LABEL LIST
|
||
L = 0
|
||
2010 IF (I.EQ.0) GO TO 2020
|
||
K = SYMBOL(I+1)
|
||
SYMBOL(I+1) = SHL(L,8)+RIGHT(K,8)
|
||
L = I
|
||
I = SHR(K,8)
|
||
GO TO 2010
|
||
C EMIT LIST STARTING AT L
|
||
2020 I = SYMBOL(L+1)
|
||
SYMBOL(L+1) = 64 + LABEL
|
||
J = SHR(I,8)
|
||
IF (J.EQ.0) GO TO 2030
|
||
K = SHR(SYMBOL(L-1),16)
|
||
2025 CALL EMIT(K,VLU)
|
||
CALL EMIT(AX2,OPR)
|
||
L = J
|
||
GO TO 2020
|
||
2030 CONTINUE
|
||
C DEFINE END OF JUMP TABLE
|
||
CALL EMIT(M,DEF)
|
||
GO TO 99999
|
||
C DEFINE END OF WHILE STATEMENT
|
||
2040 J = SHR(I,14)
|
||
I = RIGHT(I,14)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
CALL EMIT(I,DEF)
|
||
GO TO 99999
|
||
C END OF ITERATIVE STATEMENT
|
||
2050 K = FIXV(MP)
|
||
IF (K.EQ.0) GO TO 2040
|
||
C OTHERWISE INCREMENT VARIABLE
|
||
CALL EMIT(K,VLU)
|
||
CALL EMIT(INC,OPR)
|
||
CALL EMIT(K,ADR)
|
||
CALL EMIT(STD,OPR)
|
||
C DEFINE ENDING BRANCH AND LABEL
|
||
GO TO 2040
|
||
2060 I = END
|
||
GO TO 88888
|
||
C <GROUP HEAD> ::= DO ;
|
||
2100 CALL ENTERB
|
||
I = ENB
|
||
GO TO 88888
|
||
C <GROUP HEAD> ::= DO <STEP DEFINITION> ;
|
||
2200 CALL ENTERB
|
||
DOPAR(CURBLK) = 1 + SHL(FIXV(MP+1),2)
|
||
GO TO 99999
|
||
C <GROUP HEAD> ::= DO <WHILE CLAUSE> ;
|
||
2300 CALL ENTERB
|
||
DOPAR(CURBLK) = 2 + SHL(FIXV(MP+1),2)
|
||
GO TO 99999
|
||
C <GROUP HEAD> ::= DO <CASE SELECTOR> ;
|
||
2400 CALL ENTERB
|
||
K = ENTER(-(64+LABEL))
|
||
K = SHR(SYMBOL(K-1),16)
|
||
C K IS LABEL AFTER CASE JUMP TABLE
|
||
I = ENTER(-(SHL(K,8)+64+LABEL))
|
||
J = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(AX1,OPR)
|
||
DOPAR(CURBLK) = SHL(I,2)+3
|
||
2410 I = DOPAR(CURBLK)
|
||
K = SHR(I,16)
|
||
J = ENTER(-(SHL(K,8)+64+LABEL))
|
||
DOPAR(CURBLK) = SHL(J,16) + RIGHT(I,16)
|
||
J = SHR(SYMBOL(J-1),16)
|
||
CALL EMIT(J,DEF)
|
||
GO TO 99999
|
||
C <GROUP HEAD> ::= <GROUP HEAD> <STATEMENT>
|
||
2500 CONTINUE
|
||
I = DOPAR(CURBLK)
|
||
IF (RIGHT(I,2).NE.3) GO TO 99999
|
||
C OTHERWISE CASE STMT
|
||
J = RIGHT(SHR(I,2),14)
|
||
J = SYMBOL(J+1)
|
||
J = SHR(J,8)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
GO TO 2410
|
||
C <STEP DEFINITION> ::= <VARIABLE> <REPLACE> <EXPRESSION> <ITERATION
|
||
C
|
||
2600 I = FIXV(MP)
|
||
J = FIXV(MP+3)
|
||
IF (J.GE.0) I = 0
|
||
C PLACE <VARIABLE> SYMBOL NUMBER INTO DO SLOT
|
||
FIXV(MP-1) = I
|
||
FIXV(MP) = IABS(J)
|
||
GO TO 99999
|
||
C <ITERATION CONTROL> ::= <TO> <EXPRESSION>
|
||
2700 CALL EMIT(LEQ,OPR)
|
||
I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(TRC,OPR)
|
||
FIXV(MP) = - (SHL(FIXV(MP),14)+I)
|
||
C SEND -(BACK BRANCH NUMBER/END LOOP NUMBER)
|
||
GO TO 99999
|
||
C <ITERATION CONTROL> ::= <TO> <EXPRESSION> <BY> <EXPRESSION>
|
||
2800 I = FIXV(MP-3)
|
||
C I = SYMBOL NUMBER OF INDEXING VARIABLE
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(ADD,OPR)
|
||
CALL EMIT(I,ADR)
|
||
CALL EMIT(STD,OPR)
|
||
C BRANCH TO COMPARE
|
||
I = FIXV(MP+2)
|
||
J = SHR(I,14)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
C DEFINE BEGINNING OF STATEMENTS
|
||
J = RIGHT(I,14)
|
||
CALL EMIT(J,DEF)
|
||
C <TO> ALREADY HAS (BACK BRANCH NUMBER/END LOOP NUMBER)
|
||
GO TO 99999
|
||
C <WHILE CLAUSE> ::= <WHILE> <EXPRESSION>
|
||
2900 I = ENTER(-(64+LABEL))
|
||
J = FIXV(MP)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
FIXV(MP) = SHL(J,14)+I
|
||
C (BACK BRANCH NUMBER/END LOOP NUMBER)
|
||
CALL EMIT(I,VLU)
|
||
I = TRC
|
||
GO TO 88888
|
||
C <CASE SELECTOR> ::= CASE <EXPRESSION>
|
||
C <PROCEDURE DEFINITION> ::= <PROCEDURE HEAD> <STATEMENT LIST> <ENDI
|
||
3100 I = FIXV(MP)
|
||
K = SHR(I,15)
|
||
I = RIGHT(I,15)
|
||
J = FIXV(SP)
|
||
IF (J.LT.0) J = -J+1
|
||
IF ((J.NE.0).AND.(I.NE.J)) CALL ERROR(13,1)
|
||
I = SHR(SYMBOL(K-1),16)
|
||
CALL EMIT(END,OPR)
|
||
C EMIT A RET JUST IN CASE HE FORGOT IT
|
||
CALL EMIT(DRT,OPR)
|
||
CALL EMIT(I,DEF)
|
||
GO TO 99999
|
||
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> ;
|
||
3200 L = 0
|
||
K = 0
|
||
GO TO 3450
|
||
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <TYPE> ;
|
||
3300 L = 0
|
||
K = FIXV(SP-1)
|
||
GO TO 3510
|
||
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <PARAMETER LIST> ;
|
||
3400 L = FIXV(MP+1)
|
||
K = 0
|
||
3450 PROCTP(CURBLK)=1
|
||
GO TO 3520
|
||
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <PARAMETER LIST> <TYPE> ;
|
||
3500 L = FIXV(MP+1)
|
||
K = FIXV(SP-1)
|
||
3510 PROCTP(CURBLK)=2
|
||
3520 I = FIXV(MP)
|
||
SYMBOL(I+1) = SHL(L,8)+SHL(K,4)+PROC
|
||
J = ENTER(-(64+LABEL))
|
||
FIXV(MP) = SHL(J,15) + I
|
||
J = SHR(SYMBOL(J-1),16)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(I,DEF)
|
||
GO TO 99999
|
||
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> INTERRUPT <NUMBER>;
|
||
3540 CONTINUE
|
||
C GET SYMBOL NUMBER
|
||
I = FIXV(MP)
|
||
I = SYMBOL(I-1)
|
||
I = SHR(I,16)
|
||
C GET INTERRUPT NUMBER
|
||
J = FIXV(SP-1)
|
||
IF (J.LE.7) GO TO 3550
|
||
CALL ERROR(39,1)
|
||
GO TO 3200
|
||
3550 J = J + 1
|
||
K = INTPRO(J)
|
||
C IS INTERRUPT DUPLICATED
|
||
IF (K.LE.0) GO TO 3560
|
||
CALL ERROR(40,1)
|
||
GO TO 3200
|
||
3560 INTPRO(J) = I
|
||
GO TO 3200
|
||
C <PROCEDURE NAME> ::= <LABEL DEFINITION> PROCEDURE
|
||
3600 CONTINUE
|
||
CALL ENTERB
|
||
I = ENP
|
||
GO TO 88888
|
||
C <PARAMETER LIST> ::= <PARAMETER HEAD> <IDENTIFIER> )
|
||
3700 CONTINUE
|
||
I = LOOKUP(SP-1)
|
||
IF (I.GE.BLKSYM) CALL ERROR(14,1)
|
||
I = ENTER(VARB)
|
||
FIXV(MP) = FIXV(MP)+1
|
||
GO TO 99999
|
||
C <PARAMETER HEAD> ::= (
|
||
3800 FIXV(MP) = 0
|
||
GO TO 99999
|
||
C <PARAMETER HEAD> ::= <PARAMETER HEAD> <IDENTIFIER> ,
|
||
C <ENDING> ::= END
|
||
4000 CALL EXITB
|
||
FIXV(MP) = 0
|
||
GO TO 99999
|
||
C <ENDING> ::= END <IDENTIFIER>
|
||
4100 CALL EXITB
|
||
I = LOOKUP(SP)
|
||
IF (I .EQ. 0) CALL ERROR(15,1)
|
||
FIXV(MP) = I
|
||
GO TO 99999
|
||
C <ENDING> ::= <LABEL DEFINITION> <ENDING>
|
||
4200 FIXV(MP) = FIXV(SP)
|
||
GO TO 99999
|
||
C <LABEL DEFINITION> ::= <IDENTIFIER> :
|
||
4300 I = LOOKUP(MP)
|
||
IF (CURBLK.EQ.2) IP = 48
|
||
IF (CURBLK.NE.2) IP = 64
|
||
IF (I.GE.BLKSYM) GO TO 4310
|
||
C
|
||
C PREC = 3 IF USER-DEFINED OUTER BLOCK LABEL
|
||
C PREC = 4 IF USER-DEFINED LABEL NOT IN OUTER BLOCK
|
||
C PREC = 5 IF COMPILER-GENERATED LABEL
|
||
I = ENTER (IP+LABEL)
|
||
GO TO 4320
|
||
4310 J = SYMBOL(I+1)
|
||
J = RIGHT(SHR(J,4),4)
|
||
K = I + 1
|
||
IF (J.EQ.0) GO TO 4315
|
||
CALL ERROR(16,1)
|
||
SYMBOL(K) = SYMBOL(K) - J*16
|
||
4315 SYMBOL(K) = SYMBOL(K) + IP
|
||
4320 FIXV(MP) = I
|
||
IF (TOKEN .EQ. PROCV) GO TO 99999
|
||
I = SYMBOL(I-1)
|
||
CALL EMIT(SHR(I,16),DEF)
|
||
GO TO 99999
|
||
C <LABEL DEFINITION> ::= <NUMBER> :
|
||
4350 CONTINUE
|
||
I = ORG
|
||
J = MP
|
||
4360 K = FIXV(J)
|
||
IF (K.LE.65535) GO TO 4370
|
||
CALL ERROR(17,1)
|
||
GO TO 99999
|
||
4370 CONTINUE
|
||
L = LOOKUP(J)
|
||
IF (L.NE.0) GO TO 4380
|
||
C ENTER NUMBER
|
||
J = 1
|
||
IF (K.GT.255) J = 2
|
||
L = ENTER(SHL(K,8)+SHL(J,4)+LITER+1)
|
||
4380 L = SYMBOL(L-1)
|
||
CALL EMIT(SHR(L,16),VLU)
|
||
GO TO 88888
|
||
C <RETURN STATEMENT> ::= RETURN
|
||
4400 CALL EMIT(0,LIT)
|
||
I = RET
|
||
IF(PROCTP(CURBLK).EQ.2) CALL ERROR(45,1)
|
||
IF(PROCTP(CURBLK).EQ.0) CALL ERROR(46,1)
|
||
GO TO 88888
|
||
C <RETURN STATEMENT> ::= RETURN <EXPRESSION>
|
||
4500 I = RET
|
||
IF(PROCTP(CURBLK).EQ.1) CALL ERROR(44,1)
|
||
IF(PROCTP(CURBLK).EQ.0) CALL ERROR(46,1)
|
||
GO TO 88888
|
||
C <CALL STATEMENT> ::= CALL <VARIABLE>
|
||
4600 I = FIXV(SP)
|
||
IF (I.EQ.0) GO TO 99999
|
||
IF (I.GT.0) GO TO 4620
|
||
4610 CALL ERROR(18,1)
|
||
GO TO 99999
|
||
4620 J = SYMBOL(I+1)
|
||
J = RIGHT(J,4)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(I,ADR)
|
||
I = 0
|
||
IF (J.EQ.PROC) I = PRO
|
||
IF (J.EQ.INTR) I = BIF
|
||
IF (I.EQ.0) GO TO 4610
|
||
GO TO 88888
|
||
C <GO TO STATEMENT> ::= <GO TO> <IDENTIFIER>
|
||
4700 CONTINUE
|
||
I = LOOKUP(SP)
|
||
IF(I .EQ. 0) I= ENTER(LABEL)
|
||
J=SYMBOL(I+1)
|
||
J = RIGHT(J,4)
|
||
IF ((J.EQ.LABEL).OR.(J.EQ.VARB)) GO TO 4710
|
||
CALL ERROR(19,1)
|
||
GO TO 99999
|
||
C INCREMENT THE REFERENCE COUNTER (USE LENGTH FIELD)
|
||
4710 IF (J.EQ.LABEL) SYMBOL(I+1) = SYMBOL(I+1) + 256
|
||
I = SYMBOL(I-1)
|
||
CALL EMIT(SHR(I,16),VLU)
|
||
I = TRA
|
||
GO TO 88888
|
||
C <GO TO STATEMENT> ::= <GOTO> <NUMBER>
|
||
5000 J = SP
|
||
I = TRA
|
||
GO TO 4360
|
||
C <GO TO> ::= GO TO
|
||
C <GO TO> ::= GOTO
|
||
C <DECLARATION STATEMENT> ::= DECLARE <DECLARATION ELEMENT>
|
||
C <DECLARATION STATEMENT> ::= <DECLARATION STATEMENT> , <DECLARATION
|
||
C
|
||
C <DECLARATION ELEMENT> ::= <TYPE DECLARATION>
|
||
C <DECLARATION ELEMENT> ::= <IDENTIFIER> LITERALLY <STRING>
|
||
5300 CONTINUE
|
||
L = MP
|
||
K = MACTOP
|
||
DO 5330 M = 1,2
|
||
I = VAR(L)
|
||
IP = SHR(I,12)
|
||
I = RIGHT(I,12)-1
|
||
K = K + 1
|
||
IF (K .GE. CURMAC) GO TO 5390
|
||
MACROS(K) = IP
|
||
DO 5320 J=1,IP
|
||
K = K + 1
|
||
IF (K .GE. CURMAC) GO TO 5390
|
||
LTEMP=I+J
|
||
MACROS(K)=VARC(LTEMP)
|
||
5320 CONTINUE
|
||
L = SP
|
||
5330 CONTINUE
|
||
C
|
||
K = K + 1
|
||
IF (K .GE. CURMAC) GO TO 5390
|
||
MACROS(K) = MACTOP
|
||
MACTOP = K
|
||
GO TO 99999
|
||
5390 CALL ERROR(20,5)
|
||
GO TO 99999
|
||
C <TYPE DECLARATION> ::= <IDENTIFIER SPECIFICATION> <TYPE>
|
||
5400 N = 1
|
||
5410 I = FIXV(MP)
|
||
J = SHR(I,15)
|
||
I = RIGHT(I,15)
|
||
K = FIXV(SP)
|
||
DO 5420 L = J,I
|
||
M = SYMBOL(L)+1
|
||
IP = SYMBOL(M)
|
||
IF (K.NE.0) GO TO 5430
|
||
IF (IP.NE.1) CALL ERROR(21,1)
|
||
IP = LABEL
|
||
5430 CONTINUE
|
||
SYMBOL(M) = SHL(N,8)+SHL(K,4)+RIGHT(IABS(IP),4)
|
||
IF (IP .LT. 0) SYMBOL(M) = - SYMBOL(M)
|
||
5420 CONTINUE
|
||
C
|
||
MAXSYM = I
|
||
FIXV(MP) = SYMBOL(I)
|
||
GO TO 99999
|
||
C <TYPE DECLARATION> ::= <BOUND HEAD> <NUMBER> ) <TYPE>
|
||
5500 N = FIXV(MP+1)
|
||
GO TO 5410
|
||
C <TYPE DECLARATION> ::= <TYPE DECLARATION> <INITIAL LIST>
|
||
C <DECLARATION ELEMENT> ::= <IDENTIFIER> <DATA LIST>
|
||
5600 I = FIXV(MP)+1
|
||
J = FIXV(MP+1)
|
||
L = RIGHT(J,16)
|
||
SYMBOL(I) = SHL(L,8) + SYMBOL(I)
|
||
J = SHR(J,16)
|
||
CALL EMIT(DAT,OPR)
|
||
CALL EMIT(J,DEF)
|
||
I = DAT
|
||
GO TO 99999
|
||
C <DATA LIST> ::= <DATA HEAD> <CONSTANT> )
|
||
5610 I = FIXV(MP+1)
|
||
FIXV(MP) = FIXV(MP) + WRDATA(-I)
|
||
GO TO 99999
|
||
C <DATA HEAD> ::= DATA (
|
||
5620 J = ENTER(-(64+LABEL))
|
||
J = SHR(SYMBOL(J-1),16)
|
||
CALL EMIT(J,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
FIXV(MP) = SHL(J,16)
|
||
I = LOOKUP(MP-1)
|
||
IF (I.LE.BLKSYM) GO TO 5630
|
||
CALL ERROR(22,1)
|
||
C SET PRECISION OF INLINE DATA TO 3
|
||
5630 I = ENTER(48+VARB)
|
||
FIXV(MP-1) = I
|
||
I = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(DAT,OPR)
|
||
CALL EMIT(I,DEF)
|
||
C COUNT THE NUMBER OF BYTES EMITTED
|
||
GO TO 99999
|
||
C <DATA HEAD> ::= <DATA HEAD> <CONSTANT> ,
|
||
C <TYPE> ::= BYTE
|
||
5700 FIXV(MP) = 1
|
||
GO TO 99999
|
||
C <TYPE> ::= ADDRESS
|
||
5800 FIXV(MP) = 2
|
||
GO TO 99999
|
||
C <TYPE> ::= LABEL
|
||
5900 FIXV(MP) = 0
|
||
GO TO 99999
|
||
C <BOUND HEAD> ::= <IDENTIFIER SPECIFICATION> (
|
||
C <IDENTIFIER SPECIFICATION> ::= <VARIABLE NAME>
|
||
6100 SYMBOL(MAXSYM) = FIXV(MP)
|
||
FIXV(MP) = SHL(MAXSYM,15)+MAXSYM
|
||
GO TO 99999
|
||
C <IDENTIFIER SPECIFICATION> ::= <IDENTIFIER LIST> <VARIABLE NAME> )
|
||
C <IDENTIFIER LIST> ::= (
|
||
6300 FIXV(MP) = MAXSYM
|
||
GO TO 99999
|
||
C <IDENTIFIER LIST> ::= <IDENTIFIER LIST> <VARIABLE NAME> ,
|
||
6400 IF (SYMTOP .LT. MAXSYM) GO TO 6420
|
||
6410 CALL ERROR(23,5)
|
||
MAXSYM = SYMABS
|
||
6420 SYMBOL(MAXSYM) = FIXV(MP+1)
|
||
FIXV(MP) = SHL(MAXSYM,15)+RIGHT(FIXV(MP),15)
|
||
MAXSYM=MAXSYM-1
|
||
GO TO 99999
|
||
C <VARIABLE NAME> ::= <IDENTIFIER>
|
||
6500 CONTINUE
|
||
I = LOOKUP(MP)
|
||
IF (I.GT.BLKSYM) GO TO 6520
|
||
I = ENTER(VARB)
|
||
GO TO 6540
|
||
6520 J = RIGHT(SYMBOL(I+1),8)
|
||
IF (J.EQ.VARB) GO TO 6540
|
||
CALL ERROR(24,1)
|
||
6540 FIXV(MP) = I
|
||
GO TO 99999
|
||
C <VARIABLE NAME> ::= <BASED VARIABLE> <IDENTIFIER>
|
||
6600 I = FIXV(MP)
|
||
J = SYMTOP
|
||
SYMTOP = SYMTOP + 1
|
||
IF (SYMTOP .LE. MAXSYM) GO TO 6620
|
||
SYMTOP = SYMTOP - 1
|
||
CALL ERROR(25,5)
|
||
GO TO 99999
|
||
6620 SYMBOL(SYMTOP) = SYMBOL(J)
|
||
K = LOOKUP(SP)
|
||
IF (K .NE. 0) GO TO 6630
|
||
K = ENTER(VARB)
|
||
GO TO 6640
|
||
6630 L = SYMBOL(K+1)
|
||
L = RIGHT(L,4)
|
||
IF (L.EQ.VARB) GO TO 6640
|
||
CALL ERROR(26,1)
|
||
GO TO 99999
|
||
6640 K = SYMBOL(K-1)
|
||
SYMBOL(J) = SHR(K,16)
|
||
I = I + 1
|
||
SYMBOL(I) = - SYMBOL(I)
|
||
GO TO 99999
|
||
C <BASED VARIABLE> ::= <IDENTIFIER> BASED
|
||
C <INITIAL LIST> ::= <INITIAL HEAD> <CONSTANT> )
|
||
6800 CONTINUE
|
||
I = FIXV(MP)
|
||
IF (MAXSYM.LE.SYMTOP) GO TO 6410
|
||
SYMBOL(I) = SYMBOL(I)+1
|
||
I = FIXV(MP+1)
|
||
I = SHL(SHR(SYMBOL(I-1),16),16) + I
|
||
SYMBOL(MAXSYM) = I
|
||
MAXSYM = MAXSYM - 1
|
||
GO TO 99999
|
||
C <INITIAL HEAD> ::= INITIAL (
|
||
6900 CONTINUE
|
||
I = FIXV(MP-1)
|
||
FIXV(MP) = MAXSYM
|
||
J = MAXSYM
|
||
MAXSYM = MAXSYM - 1
|
||
IF (MAXSYM .LE. SYMTOP) GO TO 6410
|
||
I = SHR(SYMBOL(I-1),16)
|
||
SYMBOL(J) = SHL(I,15)
|
||
GO TO 99999
|
||
C <INITIAL HEAD> ::= <INITIAL HEAD> <CONSTANT> ,
|
||
C <ASSIGNMENT> ::= <VARIABLE> <REPLACE> <EXPRESSION>
|
||
7100 ACNT = ACNT + 1
|
||
I = MAXSYM - ACNT
|
||
IF (I.GT.SYMTOP) GO TO 7110
|
||
CALL ERROR(27,5)
|
||
ACNT = 0
|
||
GO TO 99999
|
||
7110 SYMBOL(I) = FIXV(MP)
|
||
C CHECK FOR PROCEDURE ON LHS OF ASSIGNMENT.
|
||
C ****NOTE THAT THIS IS DEPENDENT ON SYMBOL NUMBER OF OUTPUT=17****
|
||
IF(FIXV(MP).NE.0.OR.FIXC(MP).EQ.17) GO TO 99999
|
||
CALL ERROR(41,1)
|
||
GO TO 99999
|
||
C <ASSIGNMENT> ::= <LEFT PART> <ASSIGNMENT>
|
||
C <REPLACE> ::= =
|
||
C <LEFT PART> ::= <VARIABLE> ,
|
||
C <EXPRESSION> ::= <LOGICAL EXPRESSION>
|
||
C <EXPRESSION> ::= <VARIABLE> : = <EXPRESSION>
|
||
7500 CONTINUE
|
||
I = STO
|
||
J = FIXV(MP)
|
||
IF(FIXV(MP).EQ.0) CALL ERROR(41,1)
|
||
IF (J.LT.0) GO TO 7510
|
||
J = SYMBOL(J-1)
|
||
CALL EMIT(SHR(J,16),ADR)
|
||
GO TO 88888
|
||
7510 CALL EMIT(XCH,OPR)
|
||
GO TO 88888
|
||
C
|
||
C <EXPRESSION> ::= <LOGICAL FACTOR>
|
||
C <EXPRESSION> ::= <EXPRESSION> OR <LOGICAL FACTOR>
|
||
7600 I = IOR
|
||
GO TO 88888
|
||
C <EXPRESSION> ::= <EXPRESSION> XOR <LOGICAL FACTOR>
|
||
7700 I = XOR
|
||
GO TO 88888
|
||
C <LOGICAL FACTOR> ::= <LOGICAL SECONDARY>
|
||
C <LOGICAL FACTOR> ::= <LOGICAL FACTOR> AND <LOGICAL SECONDARY>
|
||
7900 I = AND
|
||
GO TO 88888
|
||
C <LOGICAL SECONDARY> ::= <LOGICAL PRIMARY>
|
||
C <LOGICAL SECONDARY> ::= NOT <LOGICAL PRIMARY>
|
||
8100 I = NOT
|
||
GO TO 88888
|
||
C <LOGICAL PRIMARY> ::= <STRING EXPRESSION>
|
||
C <LOGICAL PRIMARY> ::= <STRING EXPRESSION> <RELATION> <STRING EXPRE
|
||
8300 I = FIXV(MP+1)
|
||
GO TO 88888
|
||
C
|
||
C * NOTE THAT THE CODE THAT FOLLOWS DEPENDS UPON FIXED PRODUCTION #
|
||
8400 FIXV(MP) = (PROD-96) + EQL
|
||
C THE 96 COMES FROM THE PRODUCTION NUMBER FOR =
|
||
GO TO 99999
|
||
C <RELATION> ::= =
|
||
C <RELATION> ::= <
|
||
C <RELATION> ::= >
|
||
C <RELATION> ::= < >
|
||
C <RELATION> ::= < =
|
||
C <RELATION> ::= > =
|
||
C <STRING EXPRESSION> ::= <ARITHMETIC EXPRESSION>
|
||
C
|
||
C <ARITHMETIC EXPRESSION> ::= <TERM>
|
||
C * NOTE THAT THE FOLLOWING CODE DPENDS UPON FIXED PROD NUMBERS
|
||
9300 I = (PROD-103) + ADD
|
||
C *** THE VALUES OF ADC AND SUB WERE ACCIDENTILY REVERSED ***
|
||
IF ((I.EQ.ADC).OR.(I.EQ.SUB)) I = 5-I
|
||
GO TO 88888
|
||
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> + <TERM>
|
||
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> - <TERM>
|
||
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> PLUS <TERM>
|
||
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> MINUS <TERM>
|
||
C <ARITHMETIC EXPRESSION> ::= - <TERM>
|
||
9400 CONTINUE
|
||
CALL EMIT(0,LIT)
|
||
CALL EMIT(XCH,OPR)
|
||
I = SUB
|
||
GO TO 88888
|
||
C
|
||
C <TERM> ::= <PRIMARY>
|
||
C * NOTE THAT THE FOLLOWING CODE DEPENDS UPON FIXED PROD NUMBERS
|
||
10000 I = (PROD-109) + MUL
|
||
GO TO 88888
|
||
C <TERM> ::= <TERM> * <PRIMARY>
|
||
C <TERM> ::= <TERM> / <PRIMARY>
|
||
C <TERM> ::= <TERM> MOD <PRIMARY>
|
||
C <PRIMARY> ::= <CONSTANT>
|
||
10300 I = FIXV(MP)
|
||
I = SYMBOL(I-1)
|
||
CALL EMIT(SHR(I,16),VLU)
|
||
GO TO 99999
|
||
C <PRIMARY> ::= . <CONSTANT>
|
||
10310 I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
FIXV(MP) = I
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
CALL EMIT(DAT,OPR)
|
||
CALL EMIT(0,DEF)
|
||
C DROP THROUGH TO NEXT PRODUCTION
|
||
C <PRIMARY> ::= <CONSTANT HEAD> <CONSTANT> )
|
||
C ENTER HERE FROM ABOVE ALSO
|
||
10320 I = FIXV(MP+1)
|
||
I = WRDATA(-I)
|
||
CALL EMIT(DAT,OPR)
|
||
I = FIXV(MP)
|
||
CALL EMIT(I,DEF)
|
||
GO TO 99999
|
||
C <PRIMARY> ::= <VARIABLE>
|
||
10400 I = FIXV(MP)
|
||
IF (I.GT.0) GO TO 10450
|
||
IF (I.EQ.0) GO TO 99999
|
||
C SUBSCRIPTED VARIABLE
|
||
I = LOD
|
||
GO TO 88888
|
||
C SIMPLE VARIABLE
|
||
10450 J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),VLU)
|
||
J = SYMBOL(I+1)
|
||
J = RIGHT(J,4)
|
||
IF (J.EQ.PROC) CALL EMIT(PRO,OPR)
|
||
IF (J.EQ.INTR) CALL EMIT(BIF,OPR)
|
||
GO TO 99999
|
||
C <PRIMARY> ::= . <VARIABLE>
|
||
10500 CONTINUE
|
||
I = FIXV(SP)
|
||
IF (I.GT.0) GO TO 10520
|
||
C SUBSCRIPTED - CHANGE PRECISION TO 2
|
||
IF (I.EQ.0) GO TO 10530
|
||
10510 I = CVA
|
||
GO TO 88888
|
||
C
|
||
10520 J = IABS(SYMBOL(I+1))
|
||
IF (RIGHT(J,4).EQ.VARB) GO TO 10540
|
||
10530 CALL ERROR(28,1)
|
||
GO TO 99999
|
||
10540 J = SYMBOL(I-1)
|
||
CALL EMIT(SHR(J,16),ADR)
|
||
GO TO 10510
|
||
C <PRIMARY> ::= ( <EXPRESSION> )
|
||
C <CONSTANT HEAD> ::= . (
|
||
10550 I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
FIXV(MP) = I
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
CALL EMIT(DAT,OPR)
|
||
CALL EMIT(0,DEF)
|
||
GO TO 99999
|
||
C <CONSTANT HEAD> ::= <CONSTANT HEAD> <CONSTANT> ,
|
||
10560 I = FIXV(MP+1)
|
||
I = WRDATA(-I)
|
||
GO TO 99999
|
||
C <VARIABLE> ::= <IDENTIFIER>
|
||
10600 CONTINUE
|
||
I = LOOKUP(MP)
|
||
IF (I .NE. 0) GO TO 10650
|
||
CALL ERROR(29,1)
|
||
I = ENTER(VARB)
|
||
10650 FIXV(MP) = I
|
||
J = IABS(SYMBOL(I+1))
|
||
J = RIGHT(J,4)
|
||
IF(J.EQ.LABEL) CALL ERROR(47,1)
|
||
IF ((J.NE.PROC).AND.(J.NE.INTR)) GO TO 99999
|
||
IF(SHR(SYMBOL(I+1),8).NE.0) CALL ERROR(38,1)
|
||
J=RIGHT(SHR(SYMBOL(I+1),4),4)
|
||
C IN THE STATEMENTS BELOW, 30 IS THE TOKEN FOR 'CALL'
|
||
IF(PSTACK(MP-1).EQ.30.AND.J.NE.0) CALL ERROR(42,1)
|
||
IF(PSTACK(MP-1).NE.30.AND.J.EQ.0) CALL ERROR(43,1)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
I = (SHL(I,15)+I+1)
|
||
FIXC(MP) = 0
|
||
GO TO 10760
|
||
C <VARIABLE> ::= <SUBSCRIPT HEAD> <EXPRESSION> )
|
||
10700 I = FIXV(MP)
|
||
IF (I.LT.0) GO TO 10740
|
||
FIXV(MP) = - I
|
||
I = INX
|
||
GO TO 88888
|
||
10740 I = -I
|
||
CALL EMIT(RIGHT(I,15),ADR)
|
||
IF (FIXC(MP).NE.1) CALL EMIT(STD,OPR)
|
||
IF(IABS(FIXC(MP)).EQ.0) CALL ERROR(37,1)
|
||
IF(IABS(FIXC(MP)).GT.1) CALL ERROR(38,1)
|
||
10760 CONTINUE
|
||
CALL EMIT(SHR(I,15),VLU)
|
||
FIXC(MP)=SHR(I,15)
|
||
I = PRO
|
||
FIXV(MP) = 0
|
||
GO TO 88888
|
||
C <SUBSCRIPT HEAD> ::= <IDENTIFIER> (
|
||
10800 I = LOOKUP(MP)
|
||
IF (I.NE.0) GO TO 10840
|
||
CALL ERROR(30,1)
|
||
I = ENTER(VARB)
|
||
10840 J = IABS(SYMBOL(I+1))
|
||
J = RIGHT(J,4)
|
||
IF (J.EQ.VARB) GO TO 10860
|
||
IF ((J.EQ.PROC).OR.(J.EQ.INTR)) GO TO 10880
|
||
CALL ERROR(31,1)
|
||
10860 FIXV(MP) = I
|
||
I = SYMBOL(I-1)
|
||
CALL EMIT(SHR(I,16),ADR)
|
||
GO TO 99999
|
||
10880 FIXC(MP) = SHR(SYMBOL(I+1),8)
|
||
IF (J.EQ.INTR) FIXC(MP) = -FIXC(MP)
|
||
J=RIGHT(SHR(SYMBOL(I+1),4),4)
|
||
C IN THE STATEMENTS BELOW, 30 IS THE TOKEN FOR 'CALL'
|
||
IF(PSTACK(MP-1).EQ.30.AND.J.NE.0) CALL ERROR(42,1)
|
||
IF(PSTACK(MP-1).NE.30.AND.J.EQ.0) CALL ERROR(43,1)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
FIXV(MP) = -(SHL(I,15)+I+1)
|
||
GO TO 99999
|
||
C <SUBSCRIPT HEAD> ::= <SUBSCRIPT HEAD> <EXPRESSION> ,
|
||
10900 I = -FIXV(MP)
|
||
IF (I .GT. 0) GO TO 10910
|
||
CALL ERROR(32,1)
|
||
GO TO 99999
|
||
10910 FIXV(MP) = -(I+1)
|
||
J = RIGHT(I,15)
|
||
CALL EMIT(J,ADR)
|
||
IF (FIXC(MP).NE.0) GO TO 10920
|
||
CALL ERROR(37,1)
|
||
GO TO 99999
|
||
10920 IF (FIXC(MP).NE.2) CALL EMIT(STD,OPR)
|
||
I = -1
|
||
IF (FIXC(MP).LT.0) I = 1
|
||
FIXC(MP) = FIXC (MP) + I
|
||
GO TO 99999
|
||
C <CONSTANT> ::= <STRING>
|
||
11000 CONTINUE
|
||
C MAY WISH TO TREAT THIS STRING AS A CONSTANT LATER
|
||
J = VAR(SP)
|
||
I = SHR(J,12)
|
||
L = 3
|
||
K = 0
|
||
IF ((I.LE.0).OR.(I.GT.2)) GO TO 11010
|
||
C CONVERT INTERNAL CHARACTER FORM TO ASCII
|
||
J = RIGHT(J,12)
|
||
K = 0
|
||
DO 11005 L = 1,I
|
||
LTEMP=J+L-1
|
||
KP=VARC(LTEMP)
|
||
K = K * 256 + ASCII(KP)
|
||
11005 CONTINUE
|
||
L = I
|
||
11010 I = LOOKUP(SP)
|
||
IF (I.EQ.0) I = ENTER(SHL(K,8)+SHL(L,4)+LITER)
|
||
FIXV(MP) = I
|
||
GO TO 99999
|
||
C <CONSTANT> :: = <NUMBER>
|
||
11100 CONTINUE
|
||
I = LOOKUP(SP)
|
||
IF (I.NE.0) GO TO 11120
|
||
C ENTER NUMBER INTO SYMBOL TABLE
|
||
I = FIXV(MP)
|
||
J = 1
|
||
IF (I.GT.255) J=2
|
||
I = ENTER(SHL(I,8)+SHL(J,4)+LITER+1)
|
||
11120 FIXV(MP) = I
|
||
GO TO 99999
|
||
C <TO> ::= TO
|
||
11200 CONTINUE
|
||
I = FIXV(MP-3)
|
||
IF (I .GT. 0) GO TO 11210
|
||
CALL ERROR(33,1)
|
||
FIXV(MP) = 1
|
||
GO TO 99999
|
||
11210 I = SYMBOL(I-1)
|
||
I = SHR(I,16)
|
||
FIXV(MP-3) = I
|
||
CALL EMIT(I,ADR)
|
||
CALL EMIT(STD,OPR)
|
||
J = ENTER(-(64+LABEL))
|
||
J = SHR(SYMBOL(J-1),16)
|
||
CALL EMIT(J,DEF)
|
||
FIXV(MP) = J
|
||
CALL EMIT(I,VLU)
|
||
GO TO 99999
|
||
C <BY> ::= BY
|
||
11300 CONTINUE
|
||
CALL EMIT(LEQ,OPR)
|
||
I = ENTER(-(64+LABEL))
|
||
C SAVE SYMBOL NUMBER AT <TO> (END LOOP NUMBER)
|
||
I = SHR(SYMBOL(I-1),16)
|
||
J = FIXV(MP-2)
|
||
FIXV(MP-2) = I
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(TRC,OPR)
|
||
I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
FIXV(MP) = SHL(J,14)+I
|
||
C <BY> IS (TO NUMBER/STATEMENT NUMBER)
|
||
CALL EMIT(I,VLU)
|
||
CALL EMIT(TRA,OPR)
|
||
C NOW DEFINE BY LABEL
|
||
I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
C SAVE BY LABEL IN <TO> AS BRANCH BACK NUMBER
|
||
FIXV(MP-2)=SHL(I,14)+FIXV(MP-2)
|
||
CALL EMIT(I,DEF)
|
||
GO TO 99999
|
||
C <WHILE> ::= WHILE
|
||
11400 CONTINUE
|
||
I = ENTER(-(64+LABEL))
|
||
I = SHR(SYMBOL(I-1),16)
|
||
CALL EMIT(I,DEF)
|
||
FIXV(MP) = I
|
||
GO TO 99999
|
||
88888 CALL EMIT(I,OPR)
|
||
99999 RETURN
|
||
END
|
||
INTEGER FUNCTION GNC(Q)
|
||
C GET NEXT CHARACTER FROM THE INPUT STREAM (OR 0 IF
|
||
C NO CHARACTER IS FOUND)
|
||
C
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
INTEGER SHL,SHR,RIGHT
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER Q
|
||
4000 IF(CURMAC .LE. MAXMAC) GO TO 2000
|
||
IF (IBP .LE. CONTRL(29)) GO TO 200
|
||
C READ ANOTHER RECORD FROM COMMAND STREAM
|
||
IF (CONTRL(31) .EQ. 0) GO TO 1
|
||
IF(CONTRL(20).EQ. 1) CALL PAD(0,1,1)
|
||
CALL WRITEL(0)
|
||
1 IFILE = CONTRL(20)
|
||
READ(IFILE,1000) IBUFF
|
||
100 DO 110 I=1,80
|
||
J = IBUFF(I)
|
||
J = ICON(J)
|
||
IBUFF(I) = ITRAN(J)
|
||
110 CONTINUE
|
||
C
|
||
LP = CONTRL(23)
|
||
IF (IBUFF(LP).EQ.38) GO TO 300
|
||
115 IBP = LP
|
||
CONTRL(14) = CONTRL(14) + 1
|
||
CALL EMIT(CONTRL(14),LIN)
|
||
IF (CONTRL(27).EQ.0) GO TO 200
|
||
CALL CONOUT(0,5,CONTRL(14),10)
|
||
CALL CONOUT(1,-3,CURBLK-1,10)
|
||
CALL PAD(1,1,3)
|
||
IF (CONTRL(23) .EQ. 1) GO TO 120
|
||
CALL FORM(1,IBUFF,1,CONTRL(23)-1,80)
|
||
CALL PAD(1,1,3)
|
||
120 CALL FORM(1,IBUFF,CONTRL(23),CONTRL(29),80)
|
||
IF(CONTRL(29) .EQ. 80) GO TO 130
|
||
CALL PAD(1,1,3)
|
||
CALL FORM(1,IBUFF,CONTRL(29)+1,80,80)
|
||
130 CONTINUE
|
||
200 GNC = IBUFF(IBP)
|
||
IBP = IBP + 1
|
||
RETURN
|
||
300 CONTINUE
|
||
IF(IBUFF(2) .EQ. 1) GO TO 115
|
||
LP = LP + 1
|
||
C SCANNER PARAMETERS FOLLOW
|
||
305 J = IBUFF(LP)
|
||
IF (J.EQ.38) GO TO 400
|
||
LP = LP + 1
|
||
C
|
||
DO 310 I=LP,80
|
||
II = I
|
||
IF (IBUFF(I) .EQ. 39) GO TO 330
|
||
IF (IBUFF(I).EQ.38) GO TO 315
|
||
310 CONTINUE
|
||
C
|
||
315 K = CONTRL(J)
|
||
LP = II
|
||
IF ((K.GT.1).OR.(K.LT.0)) GO TO 320
|
||
CONTRL (J) = 1-K
|
||
GO TO 325
|
||
320 CALL ERROR(34,1)
|
||
325 IF (II.EQ.80) GO TO 1
|
||
LP = LP + 1
|
||
GO TO 305
|
||
330 K = 0
|
||
II = II+1
|
||
C
|
||
DO 340 I=II,80
|
||
LP = II
|
||
L = IBUFF(I)
|
||
IF (L .LE. 1) GO TO 340
|
||
IF (L .GT. 11) GO TO 350
|
||
K = K*10+(L-2)
|
||
340 CONTINUE
|
||
C
|
||
350 CONTRL(J) = K
|
||
C MAY BE MORE $ IN INPUT LINE
|
||
360 II = LP + 1
|
||
DO 370 I=II,80
|
||
LP = I
|
||
IF (IBUFF(I).EQ.38) GO TO 380
|
||
370 CONTINUE
|
||
C NO MORE $ FOUND
|
||
GO TO 1
|
||
380 LP = LP + 1
|
||
GO TO 305
|
||
400 CONTINUE
|
||
C DISPLAY $ PARAMETERS
|
||
L = 2
|
||
K = 64
|
||
LP = LP + 1
|
||
J = IBUFF(LP)
|
||
IF (J.EQ.1) GO TO 410
|
||
L = J
|
||
K = J
|
||
410 CONTINUE
|
||
DO 420 I=L,K
|
||
J = CONTRL(I)
|
||
IF (J.LT.0) GO TO 420
|
||
CALL PAD(0,38,1)
|
||
CALL PAD(1,I,1)
|
||
CALL PAD(1,39,1)
|
||
CALL CONOUT(2,-10,J,10)
|
||
420 CONTINUE
|
||
IF (CONTRL(31).NE.0) CALL PAD(0,1,1)
|
||
CALL WRITEL(0)
|
||
GO TO 360
|
||
990 IF (INPTR .LT. 1) GO TO 999
|
||
CONTRL(16) = 0
|
||
INPTR = INPTR - 1
|
||
CONTRL(20) = INSTK(INPTR)
|
||
GO TO 1
|
||
999 GNC = 0
|
||
RETURN
|
||
1000 FORMAT(80A1)
|
||
2000 CONTINUE
|
||
I = MACROS(CURMAC)
|
||
J = SHR(I,12)
|
||
I = RIGHT(I,12)
|
||
IF (J .GE. I) GO TO 2100
|
||
J = J + 1
|
||
GNC = MACROS(J)
|
||
MACROS(CURMAC) = SHL(J,12)+I
|
||
RETURN
|
||
2100 CURMAC = CURMAC + 1
|
||
GO TO 4000
|
||
END
|
||
SUBROUTINE WRITEL(NSPAC )
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64),OFILE
|
||
COMMON/CNTRL/CONTRL
|
||
C
|
||
NSPACE=NSPAC
|
||
NP = CONTRL(36) - 1
|
||
IF (OBP.LE.NP) GO TO 998
|
||
NBLANK = 1
|
||
C
|
||
DO 5 I=1,OBP
|
||
J = OBUFF(I)
|
||
IF (J .NE. 1) NBLANK = I
|
||
5 OBUFF(I) = OTRAN(J)
|
||
C
|
||
OBP = IMIN(CONTRL(15),NBLANK)
|
||
OFILE = CONTRL(26) + 10
|
||
9 CONTINUE
|
||
10 WRITE(OFILE,1000) (OBUFF(I), I=1,OBP)
|
||
11 IF(NSPACE.LE.0) GO TO 998
|
||
C
|
||
DO 12 I=1,OBP
|
||
12 OBUFF(I)=OTRAN(1)
|
||
NSPACE=NSPACE-1
|
||
GO TO 9
|
||
998 IF (NP.LE.0) GO TO 997
|
||
DO 999 I=1,NP
|
||
999 OBUFF(I) = 1
|
||
997 OBP = NP
|
||
RETURN
|
||
1000 FORMAT (1H ,121A1)
|
||
1001 FORMAT(1H )
|
||
END
|
||
FUNCTION ICON(I)
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
C ICON IS CALLED WITH AN INTEGER VARIABLE I WHICH CONTAINS A
|
||
C CHARACTER READ WITH AN A1 FORMAT. ICON MUST REDUCE THIS CHARACTER
|
||
C TO A VALUE SOMEWHERE BETWEEN 1 AND 256. NORMALLY, THIS WOULD BE
|
||
C ACCOMPLISHED BY SHIFTING THE CHARACTER TO THE RIGHTMOST BIT POSI-
|
||
C TIONS OF THE WORD AND MASKING THE RIGHT 8 BITS. IT IS DONE RATHER
|
||
C INEFFICIENTLY HERE, HOWEVER, TO GAIN SOME MACHINE INDEPENDENCE.
|
||
DO 100 K=1,52
|
||
J = K
|
||
IF (I .EQ. OTRAN(K)) GO TO 200
|
||
100 CONTINUE
|
||
J = 1
|
||
200 ICON = J
|
||
RETURN
|
||
END
|
||
SUBROUTINE DECIBP
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
IF (CURMAC .LE. MAXMAC) GO TO 100
|
||
IBP = IBP -1
|
||
RETURN
|
||
100 I = MACROS(CURMAC)
|
||
MACROS(CURMAC) = I - 2**12
|
||
RETURN
|
||
END
|
||
SUBROUTINE CONV(PREC)
|
||
INTEGER PREC
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
IF (STYPE .LE. 1) GO TO 200
|
||
VALUE = 0
|
||
DO 100 I=1,ACCLEN
|
||
J = ACCUM(I) - 2
|
||
100 VALUE = VALUE * STYPE + J
|
||
IF (PREC .LE. 0) GO TO 999
|
||
I = 2**PREC
|
||
IF (VALUE .LT. I) GO TO 999
|
||
200 VALUE = -1
|
||
999 RETURN
|
||
END
|
||
FUNCTION IMIN(I,J)
|
||
IF (I .LT. J) GO TO 10
|
||
IMIN = J
|
||
GO TO 20
|
||
10 IMIN = I
|
||
20 RETURN
|
||
END
|
||
SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH)
|
||
C CC = 0 DUMP BUFFER, GO TO NEXT LINE
|
||
C CC = 1 APPEND TO CURRENT BUFFER
|
||
C CC = 2 DELETE LEADING BLANKS AND APPEND
|
||
INTEGER CHARS(LENGTH)
|
||
INTEGER CC,START,FINISH
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
J = START
|
||
I = CC + 1
|
||
GO TO (100,200,300),I
|
||
100 CALL WRITEL(0)
|
||
200 IF (J .GT. FINISH) GO TO 999
|
||
OBP = OBP + 1
|
||
OBUFF(OBP) = CHARS(J)
|
||
J = J + 1
|
||
IF (OBP .GE. CONTRL(34)) GO TO 100
|
||
GO TO 200
|
||
300 IF (J .GT. FINISH) GO TO 999
|
||
IF (CHARS(J) .NE. 1) GO TO 200
|
||
J = J + 1
|
||
GO TO 300
|
||
999 RETURN
|
||
END
|
||
SUBROUTINE CONOUT(CC,K,N,BASE)
|
||
INTEGER CC,K,N,BASE,T(20)
|
||
LOGICAL ZSUP
|
||
NP = N
|
||
ZSUP = K .LT. 0
|
||
KP = IMIN (IABS(K),19)
|
||
C
|
||
DO 10 I=1,KP
|
||
10 T(I) = 1
|
||
C
|
||
IP = KP + 1
|
||
C
|
||
DO 20 I=1,KP
|
||
LTEMP=IP-I
|
||
T(LTEMP)=MOD(NP,BASE)+2
|
||
NP = NP/BASE
|
||
IF(ZSUP .AND. (NP .EQ. 0)) GO TO 30
|
||
20 CONTINUE
|
||
C
|
||
30 IF(BASE .EQ. 8) GO TO 40
|
||
IF(BASE .EQ. 2) GO TO 45
|
||
IF(BASE .NE. 16) GO TO 50
|
||
KP = KP+1
|
||
T(KP) = 19
|
||
GO TO 50
|
||
40 KP = KP+1
|
||
T(KP) = 28
|
||
GO TO 50
|
||
45 KP = KP+1
|
||
T(KP) = 13
|
||
50 CALL FORM(CC,T,1,KP,20)
|
||
RETURN
|
||
END
|
||
SUBROUTINE PAD(CC,CHR,I)
|
||
INTEGER CC,CHR,I
|
||
INTEGER T(20)
|
||
J = IMIN(I,20)
|
||
C
|
||
DO 10 K=1,J
|
||
10 T(K) = CHR
|
||
C
|
||
CALL FORM(CC,T,1,J,20)
|
||
RETURN
|
||
END
|
||
SUBROUTINE STACKC(I)
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INPTR = INPTR + 1
|
||
IF (INPTR .GT. 7) GO TO 100
|
||
INSTK(INPTR) = CONTRL(20)
|
||
CONTRL(20) = I
|
||
RETURN
|
||
100 CALL ERROR(35,5)
|
||
RETURN
|
||
END
|
||
SUBROUTINE ENTERB
|
||
C ENTRY TO BLOCK GOES THROUGH HERE
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER SHL
|
||
INTEGER LOOKUP,ENTER
|
||
CURBLK = CURBLK + 1
|
||
PROCTP(CURBLK)=PROCTP(CURBLK-1)
|
||
IF (CURBLK .LE. MAXBLK) GO TO 100
|
||
CALL ERROR(36,5)
|
||
CURBLK = 1
|
||
100 BLOCK(CURBLK) = SYMTOP
|
||
DOPAR(CURBLK) = 0
|
||
C SAVE THE MACRO PARAMETERS
|
||
MACBLK(CURBLK) = SHL(MACTOP,12) + CURMAC
|
||
BLKSYM = SYMTOP
|
||
RETURN
|
||
END
|
||
SUBROUTINE DUMPIN
|
||
C DUMP THE INITIALIZATION TABLE
|
||
INTEGER WRDATA
|
||
C WRDATA(X) WRITES THE DATA AT LOCATION X IN SYMBOL TABLE
|
||
C AND RETURNS THE NUMBER OF BYTES WRITTEN
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER RIGHT,SHL,SHR
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
IF(CONTRL(30).NE.2) GO TO 1000
|
||
I = SYMABS+1
|
||
100 I = I - 1
|
||
IF (I .LE. MAXSYM) GO TO 1000
|
||
J = SYMBOL(I)
|
||
JP = RIGHT(J,15)
|
||
J = SHR(J,15)
|
||
CALL PAD(0,1,1)
|
||
CALL WRITEL(0)
|
||
CALL FORM(0,MSSG,42,48,77)
|
||
CALL PAD(1,30,1)
|
||
CALL CONOUT(1,5,J,10)
|
||
CALL PAD(1,1,1)
|
||
CALL PAD(1,39,1)
|
||
200 IF (JP.LE.0) GO TO 100
|
||
JP = JP - 1
|
||
I = I - 1
|
||
CALL PAD(1,1,1)
|
||
CALL PAD(1,30,1)
|
||
C GET THE SYMBOL NUMBER
|
||
K = SHR(SYMBOL(I),16)
|
||
CALL CONOUT(1,5,K,10)
|
||
GO TO 200
|
||
1000 CALL WRITEL(0)
|
||
KT = CONTRL(26)
|
||
CONTRL(26) = CONTRL(32)
|
||
KQ = CONTRL(34)
|
||
CONTRL(34) = CONTRL(33)
|
||
C READY TO WRITE THE INITIALIZATION TABLE
|
||
I = SYMABS+1
|
||
3000 CALL PAD(1,41,1)
|
||
3100 I = I - 1
|
||
IF (I.LE.MAXSYM) GO TO 4000
|
||
J = SYMBOL(I)
|
||
JP = RIGHT(J,15)
|
||
J = SHR(J,15)
|
||
C WRITE SYMBOL NUMBERS
|
||
DO 3300 K=1,3
|
||
KP = MOD(J,32)+2
|
||
CALL PAD(1,KP,1)
|
||
3300 J = J /32
|
||
C
|
||
C WRITE OUT DATA CORRESPONDING TO EACH CONSTANT
|
||
3400 IF (JP.LE.0) GO TO 3000
|
||
JP = JP - 1
|
||
I = I - 1
|
||
K = RIGHT(SYMBOL(I),16)
|
||
K = WRDATA(K)
|
||
GO TO 3400
|
||
C
|
||
4000 CALL PAD(1,41,1)
|
||
CALL WRITEL(0)
|
||
CONTRL(26) = KT
|
||
CONTRL(34) = KQ
|
||
RETURN
|
||
END
|
||
SUBROUTINE ERROR(I,LEVEL)
|
||
INTEGER I,LEVEL
|
||
C I IS ERROR NUMBER, LEVEL IS SEVERITY CODE
|
||
INTEGER TERR(22)
|
||
COMMON /TERRM/TERR
|
||
C TERR CONTAINS THE TERMINAL ERROR MESSAGE - COMPILATION TERMINATED
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
CONTRL(1) = CONTRL(1) + 1
|
||
CALL FORM(0,MSSG,21,21,41)
|
||
CALL CONOUT(1,5,CONTRL(14),10)
|
||
CALL FORM(1,MSSG,22,22,41)
|
||
CALL PAD(1,1,2)
|
||
CALL FORM(1,MSSG,16,20,41)
|
||
CALL PAD(1,1,1)
|
||
CALL CONOUT(2,-4,I,10)
|
||
CALL PAD(1,1,2)
|
||
CALL FORM(1,MSSG,23,26,41)
|
||
CALL PAD(1,1,1)
|
||
CALL FORM(1,ACCUM,1,ACCLEN,32)
|
||
CALL WRITEL(0)
|
||
C CHECK FOR TERMINAL ERROR - LEVEL GREATER THAN 4
|
||
IF (LEVEL.LE.4) GO TO 999
|
||
C TERMINATE COMPILATION
|
||
CALL FORM(0,TERR,1,22,22)
|
||
CALL WRITEL(0)
|
||
COMPIL = .FALSE.
|
||
999 RETURN
|
||
END
|
||
INTEGER FUNCTION SHR(I,J)
|
||
SHR = I/(2**J)
|
||
RETURN
|
||
END
|
||
INTEGER FUNCTION SHL(I,J)
|
||
SHL = I*(2**J)
|
||
RETURN
|
||
END
|
||
INTEGER FUNCTION RIGHT(I,J)
|
||
RIGHT = MOD(I,2**J)
|
||
RETURN
|
||
END
|
||
SUBROUTINE SDUMP
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C CHECK FOR STACK DUMP BYPASS
|
||
IF (CONTRL(13).NE.0) GO TO 400
|
||
CALL FORM(0,MSSG,29,41,41)
|
||
IF (SP .LT. 5) GO TO 200
|
||
DO 100 I=5,SP
|
||
J = PSTACK(I)
|
||
CALL PRSYM(1,J)
|
||
CALL PAD(1,1,1)
|
||
100 CONTINUE
|
||
200 CALL WRITEL(0)
|
||
400 CONTINUE
|
||
RETURN
|
||
END
|
||
SUBROUTINE REDPR(PROD,SYM)
|
||
INTEGER SYM,PROD
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
CALL CONOUT(0,-5,PROD,10)
|
||
CALL PAD(1,1,2)
|
||
CALL PRSYM(1,SYM)
|
||
CALL PAD(1,1,1)
|
||
CALL PAD(1,51,2)
|
||
CALL PAD(1,39,1)
|
||
DO 50 I=MP,SP
|
||
CALL PAD(1,1,1)
|
||
50 CALL PRSYM(1,PSTACK(I))
|
||
CALL WRITEL(0)
|
||
RETURN
|
||
END
|
||
SUBROUTINE EMIT(VAL,TYP)
|
||
INTEGER VAL,TYP
|
||
C TYP MEANING
|
||
C 0 OPERATOR
|
||
C 1 LOAD ADDRESS
|
||
C 2 LOAD VALUE
|
||
C 3 DEFINE LOCATION
|
||
C 4 LITERAL VALUE
|
||
C 5 LINE NUMBER
|
||
C 6 UNUSED
|
||
C 7 "
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18)
|
||
COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR
|
||
INTEGER RIGHT,SHR,SHL
|
||
POLTOP = POLTOP+1
|
||
IF (POLTOP .LE. MAXPOL) GO TO 100
|
||
CALL ERROR(37,1)
|
||
POLTOP = 1
|
||
100 POLCNT = POLCNT + 1
|
||
IF (CONTRL(18).EQ.0) GO TO 1200
|
||
CALL CONOUT(0,-5,POLCNT,10)
|
||
CALL PAD(1,1,1)
|
||
I = (TYP*3)+1
|
||
CALL FORM(1,POLCHR,I,I+2,18)
|
||
CALL PAD(1,1,1)
|
||
I = TYP+1
|
||
J = 1
|
||
GO TO (1000,1001,1001,1001,1004,1004),I
|
||
1000 J = OPCVAL(VAL+1)
|
||
DO 200 I=1,3
|
||
K = SHR(J,(3-I)*6)
|
||
CALL PAD(1,RIGHT(K,6),1)
|
||
200 CONTINUE
|
||
GO TO 1100
|
||
1001 CONTINUE
|
||
J = 30
|
||
1004 CALL PAD(1,J,1)
|
||
CALL CONOUT(1,5,VAL,10)
|
||
1100 CONTINUE
|
||
C
|
||
C NOW STORE THE POLISH ELEMENT IN THE POLISH ARRAY.
|
||
C
|
||
CALL WRITEL(0)
|
||
1200 POLISH(POLTOP) = SHL(VAL,3)+TYP
|
||
LCODE = CONTRL(22)/3
|
||
IF (POLTOP .LT. LCODE) GO TO 9999
|
||
C WRITE THE CURRENT BUFFER
|
||
CALL WRITEL(0)
|
||
KP = CONTRL(34)
|
||
CONTRL(34) = CONTRL(22)
|
||
K = CONTRL(26)
|
||
CONTRL(26) = CONTRL(21)
|
||
C
|
||
JP = 0
|
||
DO 2000 I=1,LCODE
|
||
J = POLISH(I)
|
||
DO 2000 L = 1,3
|
||
LP = RIGHT(SHR(J,(3-L)*5),5)+2
|
||
CALL PAD(JP,LP,1)
|
||
JP = 1
|
||
2000 CONTINUE
|
||
C
|
||
CALL WRITEL(0)
|
||
CONTRL(34) = KP
|
||
CONTRL(26) = K
|
||
POLTOP = 0
|
||
9999 RETURN
|
||
END
|
||
BLOCK DATA
|
||
INTEGER TITLE(10),VERS
|
||
COMMON /TITL/TITLE,VERS
|
||
INTEGER INTPRO(8)
|
||
COMMON /INTER/INTPRO
|
||
INTEGER ASCII(64)
|
||
COMMON /ASC/ASCII
|
||
INTEGER HENTRY(127),HCODE
|
||
COMMON /HASH/HENTRY,HCODE
|
||
INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75),
|
||
1 VARC(256),FIXV(75),FIXC(75),PRMASK(5)
|
||
LOGICAL FAILSF,COMPIL
|
||
COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR,
|
||
1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL
|
||
C GLOBAL TABLES
|
||
INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129),
|
||
1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57),
|
||
2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC,
|
||
1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI,
|
||
2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL,
|
||
3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV,
|
||
*DECL,DOV,ENDV,GROUPV,STMTV,SLISTV
|
||
INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR,
|
||
1 INSTK(7),ITRAN(256),OTRAN(64)
|
||
COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR,
|
||
1 INSTK,ITRAN,OTRAN
|
||
INTEGER CONTRL(64)
|
||
COMMON /CNTRL/CONTRL
|
||
C COMPILATION TERMINATED
|
||
INTEGER TERR(22)
|
||
COMMON /TERRM/TERR
|
||
INTEGER MSSG(77)
|
||
COMMON /MESSAG/MSSG
|
||
C
|
||
INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG,
|
||
1 IDENT,NUMB,SPECL,STR,CONT,VALUE
|
||
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
|
||
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
|
||
INTEGER VARB,INTR,PROC,LABEL,LITER
|
||
COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER
|
||
INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18)
|
||
COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR
|
||
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
|
||
INTEGER PROCTP(30)
|
||
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
|
||
1,PROCTP
|
||
C THE '48' USED IN BLOCK INITIALIZATION AND IN SYMBOL TABLE
|
||
C INITIALIZATION IS DERIVED FROM THE PROGRAM 'SYMCS' WHICH
|
||
C BUILDS THE INITIAL SYMBOL TABLE. IF THIS NUMBER CHANGES, BE
|
||
C SURE TO ALTER 'BLOCK', 'BLKSYM', 'SYMTOP', AND 'SYMCNT'.
|
||
C TWO ARRAYS, SYM1 AND SYM2, ARE EQUIVALENCED OVER THE
|
||
C SYMBOL TABLE ARRAY IN ORDER TO LIMIT THE NUMBER OF
|
||
C CONTINUATION CARDS IN SYMBOL TABLE INITIALIZATION
|
||
C BELOW. THE LENGTHS OF SYM1 AND SYM2, THEREFORE, MUST
|
||
C TOTAL THE LENGTH OF THE SYMBOL TABLE. CURRENTLY, THESE
|
||
C ARRAYS ARE DECLARED AS FOLLOWS
|
||
C
|
||
C SYM1(60) + SYM2(3940) = SYMBOL(4000)
|
||
C
|
||
C IF YOU INCREASE (DECREASE) THE SIZE OF SYMBOL, YOU MUST
|
||
C INCREASE (DECREASE) THE SIZE OF SYM2 AS WELL.
|
||
C
|
||
C NOTE ALSO THAT THE REMAINING ENTRIES OF THE SYMBOL
|
||
C TABLE ARE SET TO ZERO AT THE END OF THE DATA STATEMENT
|
||
C FOR SYM2. CURRENTLY, THIS IS ACCOMPLISHED WITH THE LAST
|
||
C ENTRY IN THE DATA STATEMENT
|
||
C
|
||
C 3880*0
|
||
C
|
||
C AGAIN, IF YOU CHANGE THE SIZE OF SYMBOL, YOU MUST
|
||
C ALSO CHANGE THIS LAST ENTRY. IF FOR EXAMPLE, YOU ALTER
|
||
C THE SIZE OF SYMBOL TO 3000, THE LAST ENTRY 1880*0 BECOMES
|
||
C
|
||
C 2880*0
|
||
C
|
||
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
|
||
1 ACNT
|
||
INTEGER SYM1(60),SYM2(3940)
|
||
EQUIVALENCE (SYMBOL(1),SYM1(1)),(SYMBOL(61),SYM2(1))
|
||
INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN,
|
||
*NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR,
|
||
*NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC,
|
||
*CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS,
|
||
*AX1,AX2,AX3
|
||
C SYNTAX ANALYZER TABLES
|
||
INTEGER V0(254),V1(73),V2(68),V3(51)
|
||
EQUIVALENCE (V(1),V0(1)),(V(255),V1(1)),(V(328),V2(1)),
|
||
4(V(396),V3(1))
|
||
INTEGER C10(110),C11(118),C12(136)
|
||
EQUIVALENCE (C1(1),C10(1)),(C1(111),C11(1)),(C1(229),C12(1))
|
||
INTEGER C1TRI0(93),C1TRI1(86),C1TRI2(64)
|
||
EQUIVALENCE (C1TRI(1),C1TRI0(1)),(C1TRI(94),C1TRI1(1)),
|
||
3(C1TRI(180),C1TRI2(1))
|
||
C ... PLM1 VERS ...
|
||
DATA TITLE/27,23,24, 3, 1,33,16,29,30, 1/
|
||
DATA VERS/20/
|
||
DATA INTPRO /8*0/
|
||
C TRANSLATION TABLE FROM INTERNAL TO ASCII
|
||
DATA ASCII /
|
||
1 32, 48,49,50,51,52, 53,54,55,56,57,
|
||
2 65,66,67,68,69,70,71,72,73,
|
||
3 74,75,76,77,78,79,80,81,82,
|
||
4 83,84,85,86,87,88,89,90,
|
||
5 36,61,46, 47,40,41, 43,45,39, 42,44,60, 62,58,59,
|
||
6 12*0/
|
||
DATA CONTRL /64*0/
|
||
DATA IBP/81/, OBP/0/, INPTR /0/
|
||
DATA OTRAN /1H ,1H0,1H1,1H2,1H3,1H4,
|
||
1 1H5,1H6,1H7,1H8,1H9,1HA,1HB,1HC,1HD,1HE,1HF,
|
||
2 1HG,1HH,1HI,1HJ,1HK,1HL,1HM,1HN,1HO,1HP,1HQ,
|
||
3 1HR,1HS,1HT,1HU,1HV,1HW,1HX,1HY,1HZ,
|
||
4 1H$,1H=,1H.,1H/,1H(,1H),1H+,1H-,1H',1H*,1H,,
|
||
5 1H<,1H>,1H:,1H;,12*0/
|
||
C COMPILATION TERMINATED
|
||
DATA TERR /14,26,24,27,20,23,12,31,20,26,25, 1,
|
||
1 31,16,29,24,20,25,12,31,16,15/
|
||
C PASS-NO PROGRAM
|
||
C ERROR
|
||
C ()NEARAT
|
||
C PARSE STACK
|
||
C SYMBOL ADDR WDS CHRS LENGTH PR TY
|
||
DATA MSSG /27,12,30,30,45,
|
||
1 25,26,27,29,26,18,29,12,24,1,
|
||
2 16,29,29,26,29,
|
||
3 42,43,25,16,12,29,12,31,
|
||
4 27,12,29,30,16,1,30,31,12,14,22,51,1,
|
||
5 30,36,24,13,26,23, 1,1, 12,15,15,29, 1, 34,15,30, 1,
|
||
6 14,19,29,30, 1,1,1, 23,16,25,18,31,19, 1,27,29, 1,31,36/
|
||
DATA STYPE /0/, EOFLAG /1/, IDENT /2/, NUMB /3/,
|
||
1 SPECL /4/, STR /5/, CONT /1/
|
||
C
|
||
DATA MP /0/, MPP1 /1/, MSTACK /75/, VARTOP /1/,
|
||
1 MVAR /256/, FAILSF /.FALSE./, COMPIL /.TRUE./
|
||
DATA MACROS /500*0/, CURMAC /501/, MAXMAC /500/,
|
||
1 MACTOP /1/
|
||
DATA VARB /1/, INTR /2/, PROC /3/, LABEL /4/, LITER /5/
|
||
DATA MAXPOL /30/, POLTOP /0/, POLCNT /0/
|
||
C OPRADRVALDEFLITLIN
|
||
DATA POLCHR /26,27,29, 12,15,29, 33,12,23, 15,16,17,
|
||
1 23,20,31, 23,20,25/
|
||
DATA BLOCK /1,120,28*0/, CURBLK /2/, MAXBLK /30/,
|
||
1 BLKSYM /120/, DOPAR /30*0/, MACBLK /30*0/
|
||
1,PROCTP/30*0/
|
||
DATA SYM1 /
|
||
1 5439488, 65536, 4101, 17, 221103907, 6815744,
|
||
2 131074, 4100, 17, 608028224, 5046272, 196615,
|
||
3 4100, 17, 491591168, 7471104, 262156, 8198,
|
||
4 17, 439207134, 587202560, 7995392, 327697, 8198,
|
||
5 17, 389903964, 587202560, 851968, 393239, 8200,
|
||
6 33, 494449493, 444186624, 3866624, 458781, 4099,
|
||
7 530, 476405760, 8126464, 524323, 4099, 530,
|
||
8 476430336, 5373952, 589864, 4099, 530, 491347968,
|
||
9 1310720, 655405, 4099, 530, 491372544, 131072,
|
||
A 720946, 4099, 530, 490037248, 4390912, 786487/
|
||
DATA SYM2 /
|
||
B 4099, 530, 490061824, 5373996, 852028, 4100,
|
||
C 258, 508392384, 7405568, 917569, 4100, 274,
|
||
D 307041408, 7143424, 983110, 4099, 274, 375787520,
|
||
E 5308416, 1048651, 4101, 274, 325167070, 3276800,
|
||
F 1114192, 8198, 274, 427681439, 503316480, 1114112,
|
||
G 1179733, 8198, 274, 373130334, 301989888, 1703936,
|
||
H 1245275, 4100, 274, 372103040, 1900544, 1310817,
|
||
I 4100, 770, 392561600, 589824, 1376358, 8198,
|
||
J 290, 241562390, 251658240, 458752, 1441899, 4099,
|
||
K 274, 238866432, 1507441, 0, 1, 117,
|
||
L 3880*0/
|
||
DATA SYMTOP /120/, MAXSYM /4000/, SYMABS /4000/,
|
||
1 SYMCNT /23/, ACNT /0/
|
||
DATA HENTRY /
|
||
*0,54,0,0,0,0,112,0,106,0,0,0,28,0,0,0,90,0,0,49,0,0,0,0,0,96,0,
|
||
10,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,
|
||
20,34,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0,0,11,0,0,0,79,64,1,0,0,0,
|
||
30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,74,0,0,0,69,16,0,0,
|
||
40,0,0,0,0,22,0,39,0,0,0/
|
||
DATA OPR /0/, ADR /1/, VLU /2/, DEF /3/, LIT /4/, LIN /5/,
|
||
*NOP/ 0/,ADD/ 1/,ADC/ 2/,SUB/ 3/,SBC/ 4/,MUL/ 5/,DIV/ 6/,REM/ 7/,
|
||
*NEG/ 8/,AND/ 9/,IOR/10/,XOR/11/,NOT/12/,EQL/13/,LSS/14/,GTR/15/,
|
||
*NEQ/16/,LEQ/17/,GEQ/18/,INX/19/,TRA/20/,TRC/21/,PRO/22/,RET/23/,
|
||
*STO/24/,STD/25/,XCH/26/,DEL/27/,DAT/28/,LOD/29/,BIF/30/,INC/31/,
|
||
*CSE/32/,END/33/,ENB/34/,ENP/35/,HAL/36/,RTL/37/,RTR/38/,SFL/39/,
|
||
*SFR/40/,HIV/41/,LOV/42/,CVA/43/,ORG/44/,DRT/45/,ENA/46/,DIS/47/,
|
||
*AX1/48/,AX2/49/,AX3/50/
|
||
DATA OPCVAL /
|
||
* 104091, 50127, 50126, 124941, 123726, 100375, 62753, 119832,
|
||
* 103442, 50767, 83613, 145053, 104095, 67351, 96158, 75741,
|
||
* 103452, 95260, 74780, 83555, 128844, 128846, 112474, 119839,
|
||
* 124890, 124879, 144275, 62487, 62239, 95887, 54545, 83534,
|
||
* 59280, 67151, 67149, 67163, 78615, 120791, 120797, 123991,
|
||
* 123997, 79137, 95905, 59468, 108370, 63327, 67148, 62750,
|
||
* 51395, 51396, 51397/
|
||
DATA V0/18,49,16,29,29,26,29,51,1,31,26,22,16,25,1,39,1,2,50,1,52,
|
||
11,43,1,42,1,48,1,51,1,39,1,49,1,50,1,44,1,45,1,47,1,41,1,40,2,20,
|
||
217,2,15,26,2,18,26,2,31,26,2,26,29,2,13,36,3,16,26,17,3,16,25,15,
|
||
33,35,26,29,3,12,25,15,3,25,26,31,3,24,26,15,4,19,12,23,31,4,31,19,
|
||
416,25,4,16,23,30,16,4,14,12,30,16,4,14,12,23,23,4,18,26,31,26,4,
|
||
515,12,31,12,4,13,36,31,16,4,27,23,32,30,5,23,12,13,16,23,5,13,12,
|
||
630,16,15,5,24,20,25,32,30,5,34,19,20,23,16,6,16,25,12,13,23,16,6,
|
||
729,16,31,32,29,25,7,15,20,30,12,13,23,16,7,15,16,14,23,12,29,16,7,
|
||
812,15,15,29,16,30,30,7,20,25,20,31,20,12,23,8,49,25,32,24,13,16,
|
||
929,50,8,49,30,31,29,20,25,18,50,9,20,25,31,16,29,29,32,27,31,9,27,
|
||
A29,26,14,16,15,32,29,16,9,23,20,31,16,29,12,23,23,36,12,49,20,15/
|
||
DATA V1/16,25,31,20,17,20,16,29,50,813276224,808598592,813315727,
|
||
1822083584,813233943,822083584,809879135,449052672,814032086,
|
||
2264503296,809865246,432275456,809337747,407310336,812238417,
|
||
3472742976,812709526,188021824,812238039,192035904,813741843,
|
||
4187786225,808818205,506300337,812709259,508401201,813032158,
|
||
5257750558,822083584,810352653,372111183,822083584,813287375,
|
||
66862622,822083584,809023371,5846878,822083584,809023371,4780750,
|
||
7822083584,811136030,6862622,822083584,808310611,291599320,
|
||
8516161536,809379484,259380441,415498240,809879135,436282315,
|
||
9247726080,808556504,234955723,247726080,810352669,506323927,
|
||
A258075712,814032086,251712907,527760448,810386654,321740822/
|
||
DATA V2/326495296,810386654,321740818,254602304,808761167,7665039,
|
||
1226072369,813741843,187786176,405631985,808818205,506300288,
|
||
2305968049,813032158,257750558,5846878,822083584,808760726,7725790,
|
||
3257750558,822083584,812238413,255457039,4780750,822083584,
|
||
4812238413,255457039,6337999,822083584,812168971,389931996,5846878,
|
||
5822083584,812168971,389931996,4780750,822083584,808499023,
|
||
6235012828,321701263,822083584,811177043,221077520,188081756,
|
||
7822083584,813036317,225523358,4780750,822083584,808499027,
|
||
8218224523,507343832,516161536,809865246,419551115,507343832,
|
||
9516161536,813032410,3732499,407758041,415498240,810345432,
|
||
A508363983,469853405,516161536,811177043,221077530,474837724/
|
||
DATA V3/600047616,812709791,476055390,192476623,410718208,
|
||
1811119375,369157072,325138323,425922560,813315727,3732310,
|
||
2191936403,425922560,810410972,192493144,3511838,476408896,
|
||
3811177043,221077533,255170062,192035904,811177043,221077519,
|
||
4577356765,491623985,809038678,191936403,425722838,257750558,
|
||
5822083584,812238413,255457039,3732499,407758041,415498240,
|
||
6809038678,191936403,425723742,192476623,410718208,808305886,
|
||
7308082579,218167450,473814867,425922560,810345432,508363983,
|
||
8469882511,223151309,192493144,822083584/
|
||
DATA VLOC /1,20,22,24,26,28,30,32,34,36,38,40,42,44,46,49,52,55,
|
||
158,61,64,68,72,76,80,84,88,93,98,103,108,113,118,123,128,133,139,
|
||
2145,151,157,164,171,179,187,195,203,212,221,231,241,251,131336,
|
||
3131337,196874,196876,229646,229648,229650,262420,295190,295192,
|
||
4295194,327964,327966,327968,360738,360741,360744,360747,360750,
|
||
5360753,393524,393527,393530,393533,459072,459075,459078,459081,
|
||
6491852,491855,491858,524629,524633,524637,524641,524645,524649,
|
||
7524653,524657,524661,557433,557437,557441,557445,557449,590221,
|
||
8590225,590229,623001,623005,655777,688549,721322,754095,754100,
|
||
9852409/
|
||
DATA VINDX /1,14,20,26,35,39,41,45,47,50,50,50,51/
|
||
DATA C10/0,0,0,32768,688288,35815424,713162890,715827202,
|
||
1673744896,991953792,196620,201326640,0,15740976,2129920,8388608,
|
||
22563,134283266,671219840,671091360,545786880,204472320,805306368,
|
||
3245952,541360640,0,40,33686536,134217728,0,10493968,16384,0,1281,
|
||
44194308,0,0,335807488,1048576,0,81984,268435712,0,20,16842752,0,0,
|
||
55246992,1064960,4194304,1281,67108864,1,4096,262144,4096,0,0,
|
||
6536904192,131072,40,33619972,67108880,0,5247008,2129920,8388608,
|
||
72562,67108865,335544384,335545680,268730368,0,0,64,268452096,
|
||
865536,20,16842756,67108880,0,5246992,1064960,0,1281,4194308,0,0,
|
||
9335822848,0,0,8,168,8232,174112,35651584,44040194,10485802,
|
||
A545267728,1064960,4194304,1281,0,0,0,262144,0,0,131200,268435456/
|
||
DATA C11/0,0,2129920,0,0,33554448,16384,0,1281,136314880,0,2,0,0,
|
||
10,128,268435712,0,20,16908296,134217760,0,10494208,0,0,0,
|
||
2138412292,1024,0,335822848,0,0,0,268435456,0,0,18907136,0,0,
|
||
333554448,0,0,0,254192288,44081696,2129920,41514,713042442,
|
||
4142606856,0,0,0,16,2228224,0,139264,134742016,0,0,256,201239200,
|
||
544081696,27885576,1049600,68157440,268435456,81984,268452096,
|
||
665536,20,19955712,0,0,33555080,715456680,168951816,134217728,
|
||
767108864,0,0,1024,68157440,268435456,81984,0,0,16,18874368,0,0,0,
|
||
82,0,0,4194564,1024,0,335847978,713042442,142606856,10,233482242,
|
||
9673744896,136314880,2935466,537559688,536904192,16,1064960,0,1281,
|
||
A134217730,671744128,671091360,537411584,344064,16859136,356581444/
|
||
DATA C12/84,4116,87056,18907136,0,0,0,0,0,1280,0,0,0,311296,0,0,9,
|
||
167108865,67109888,0,1048576,22021121,5242901,272633856,0,0,1024,
|
||
2134217730,671744128,671091360,537411584,0,0,8,134217728,0,128,0,0,
|
||
30,5243136,0,0,0,26214400,0,8912904,0,0,0,81924,84,37752852,87056,
|
||
417825792,0,0,256,5376,263424,5571585,71303168,0,4456452,16793600,
|
||
50,1088,1048576,0,0,0,16777216,0,0,4744,168,151126016,0,4194564,
|
||
61024,0,335839232,688288,36864000,713162884,0,0,0,1048576,0,0,0,0,
|
||
70,1,169869312,44081184,0,16384,0,0,4,84,4198420,87056,287342592,0,
|
||
80,16777728,0,0,0,169869312,44081184,0,41472,9732,8388608,8,
|
||
9134217728,0,0,1048576,0,0,260,0,0,0,169956608,44081184,1064960,
|
||
A1024,0,1088,1048576/
|
||
DATA C1TRI0/197379,197386,197389,197400,197421,197422,197426,
|
||
1209411,329219,329226,329229,329240,329261,329262,329266,393987,
|
||
2393994,393997,394008,394029,394030,394034,406019,590595,590602,
|
||
3590605,590616,590637,590638,590642,602627,656131,656138,656141,
|
||
4656152,656173,656174,656178,668163,721667,721674,721677,721688,
|
||
5721709,721710,721714,733699,787203,787210,787213,787224,787245,
|
||
6787246,787250,799235,864771,918275,918282,918285,918296,918317,
|
||
7918318,918322,930307,995843,998918,1180419,1180426,1180429,
|
||
81180440,1180461,1180462,1180466,1192451,1323523,1323525,1326596,
|
||
91326598,1328897,1442563,1442570,1442573,1442584,1442605,1442606,
|
||
A1442610,1454595,1508099,1508106,1508109,1508120,1508141,1508142/
|
||
DATA C1TRI1/1508146,1520131,1573635,1573642,1573645,1573656,
|
||
11573677,1573678,1573682,1585667,1639171,1639178,1639181,1639192,
|
||
21639213,1639214,1639218,1651203,1901315,1901322,1901325,1901336,
|
||
31901357,1901358,1901362,1913347,1978883,2228995,2229002,2229005,
|
||
42229016,2229037,2229038,2229042,2241027,2425603,2425610,2425613,
|
||
52425624,2425645,2425646,2425650,2437635,2622211,2622218,2622221,
|
||
62622232,2622253,2622254,2622258,2634243,2949665,2949667,2949675,
|
||
73091713,3343107,3343114,3343117,3343128,3343149,3343150,3343154,
|
||
83355139,3408643,3408650,3408653,3408664,3408685,3408686,3408690,
|
||
93420675,3670787,3670794,3670797,3670808,3670829,3670830,3670834,
|
||
A3682819,3932931,3932938,3932941,3932952,3932973,3932974,3932978/
|
||
DATA C1TRI2/3944963,4195075,4195082,4195085,4195096,4195117,
|
||
14195118,4195122,4207107,4338179,4338181,4341252,4341254,4343553,
|
||
24348700,4403715,4403717,4406788,4406790,4409089,4538114,4538116,
|
||
34600323,4603396,4603398,4796931,4796933,4800004,4800006,4802305,
|
||
44861186,5127938,5127940,5324546,5324548,5386755,5386757,5389828,
|
||
55389830,5392129,5517827,5517829,5520900,5520902,5523201,5584129,
|
||
65649665,5714434,5714436,5899011,5899018,5899021,5899032,5899053,
|
||
75899054,5899058,5911043,6369795,6369797,6372868,6372870,6375169,
|
||
86816771,6816818/
|
||
DATA PRTB /0,5592629,5582637,21813,21846,3933,3916,3919,85,15,71,
|
||
155,103,96,83,92,104,26,39,41,0,17727,20031,22322,24144,20799,840,
|
||
223112,32,106,44,13,50,0,0,22322,17727,24144,20031,20799,23112,62,
|
||
350,45,7,8,0,0,0,7,0,16,0,0,0,3656,91,0,0,0,50,0,0,0,57,0,12849,0,
|
||
497,21,57,88,0,0,4861186,106,26889,26890,26914,26917,10,0,21586,97,
|
||
573,13835,13836,13849,0,30,13,0,13,0,16963,82,73,66,0,50,70,
|
||
63360820,15932,51,56,29,40,97,0,98,0,0,25874,25878,0,97,0,24,0,0,
|
||
74078664,22807,0,4064518,0,26628,42,26944,0/
|
||
DATA PRDTB /0,38,39,36,37,25,26,27,35,24,6,7,8,9,10,11,12,13,14,
|
||
115,16,61,78,41,72,114,117,121,62,70,79,118,122,42,73,43,63,74,80,
|
||
2119,123,84,47,48,100,101,96,83,97,99,98,54,126,127,44,21,22,55,67,
|
||
369,77,128,49,68,53,125,59,124,40,45,52,76,75,120,65,64,103,104,
|
||
4105,106,107,102,34,46,23,109,110,111,108,51,116,115,113,112,19,3,
|
||
528,18,2,60,82,31,81,30,32,33,50,20,5,66,71,1,88,89,87,17,4,93,92,
|
||
658,29,91,90,86,85,57,56,95,94/
|
||
DATA HDTB /0,84,84,84,84,73,73,73,84,73,91,91,91,91,91,91,91,91,
|
||
191,91,91,68,77,86,106,61,61,62,69,74,78,81,90,87,94,87,69,94,78,
|
||
281,90,70,97,97,64,64,64,60,64,64,64,57,51,52,58,66,67,57,53,53,88,
|
||
356,96,53,92,63,102,63,85,58,92,80,80,62,98,98,105,105,105,105,105,
|
||
4105,103,58,55,54,54,54,54,83,61,61,61,61,75,82,73,75,82,102,71,99,
|
||
571,99,76,79,96,75,65,98,106,59,101,101,101,91,65,100,100,102,93,
|
||
689,89,72,72,104,104,95,95/
|
||
DATA PRLEN /0,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,3,3,
|
||
13,2,2,2,2,2,1,1,3,3,3,3,3,3,2,2,2,2,2,1,1,1,2,1,2,1,1,1,3,2,1,1,1,
|
||
22,1,1,1,2,1,3,1,2,2,2,2,1,1,4,2,3,3,3,3,2,1,3,2,2,3,3,3,1,2,2,1,2,
|
||
31,3,2,2,2,1,2,2,4,3,2,2,2,2,2,1,2,1,1,3,3,1,2,1,2,1,1,4,3,1,4,1,3,
|
||
42,3,1/
|
||
DATA CONTC /0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
10,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
20,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
40,0,0/
|
||
DATA LEFTC /105,4,42,94,85/
|
||
DATA LEFTI /0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||
11,1,1,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5/
|
||
DATA CONTT /0/
|
||
DATA TRIPI /0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||
10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1/
|
||
DATA PRIND /1,21,28,35,42,44,48,49,51,51,51,51,51,51,51,51,51,53,
|
||
153,54,54,55,55,55,55,55,55,56,57,57,57,58,58,59,59,60,61,61,62,62,
|
||
263,63,63,64,64,66,68,68,69,69,74,74,74,76,82,82,82,82,85,85,85,89,
|
||
392,94,94,99,99,99,100,100,100,101,107,107,107,109,109,110,110,110,
|
||
4111,111,112,112,112,112,112,112,112,115,115,117,117,117,117,119,
|
||
5119,119,120,121,123,125,127,127,127,129,129/
|
||
DATA NSY /106/, NT /50/, VLEN /445/, VIL /12/, C1W /102/,
|
||
2C1L /363/, NC1TRI /242/, PRTBL /128/, PRDTBL /128/, HDTBL /128/,
|
||
3PRLENL /128/, CONCL /128/, LEFTCL /4/, LEFTIL /56/, CONTL /0/,
|
||
4TRIPL /56/, PRIL /106/, PACK /5/, TOKEN /0/, IDENTV /50/,
|
||
5NUMBV /45/, STRV /46/, DIVIDE /0/, EOFILE /20/, PROCV /48/,
|
||
6SEMIV /1/, DECL /42/, DOV /15/, ENDV /21/, GROUPV /55/,
|
||
7STMTV /65/, SLISTV /82/
|
||
END
|
||
|