Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-02 - decus/20-0057/fasbol.sno
There are 2 other files named fasbol.sno in the archive. Click here to see a list.
*	*	*	*	*	*	*	*	*
*	*	DECLARATIONS	*	*	*	*	*
*	*	*	*	*	*	*	*	*
*
*		LOCAL
*
	DECLARE('SNOBOL.MAIN','FASBOL')
	DECLARE('OPTION','HASHSIZE=509')
	DECLARE('OPTION','NO.STNO')
	DECLARE('PURGE.VARIABLE',ALL)
	DECLARE('PURGE.LABEL',ALL)
	DECLARE('EXTERNAL.FUNCTION','INITLZ,DECLPH,EXECPH,EACTPH,
.CROSPH')
	DECLARE('GLOBAL.VARIABLE','SRCLIN,OBJLIN,OBJCHR,LSTLIN,LSTCHR')
	DECLARE('STRING','SNUMB(5)')
	DECLARE('INTEGER','I,J,K,DIAGNO,NXTNAM,NXTLAB,MSLI,CRSFLG')
	DECLARE('ENTRY.FUNCTION','PRTOUT(MESG,TTYFLG,CHRMOD)')
	DECLARE('ENTRY.FUNCTION','PUTOUT(MESG,CHRMOD)')
	DECLARE('ENTRY.FUNCTION','NEWNAM()')
	DECLARE('ENTRY.FUNCTION','NEWLAB()')
	DECLARE('ENTRY.FUNCTION','ERRMSG(MESG)')
	DECLARE('ENTRY.FUNCTION','STXERR(MESG)')
	DECLARE('ENTRY.FUNCTION','GETSTA()')
	DECLARE('ENTRY.FUNCTION','GETATR()')
	DECLARE('ENTRY.FUNCTION','GETITM()')
	DECLARE('ENTRY.FUNCTION','PARLIT(QTYP,BRKPAT)')
	DECLARE('ENTRY.FUNCTION','SUBS(SKEL,P1,P2,P3,P4,P5)')
*
*		SYSTEM COMMON
*
*	TABLES AND LISTS
	DECLARE('ENTRY.VARIABLE',
.'SYMBTB,XNAMTB,KEYWTB,CTRLTB,DECLTB,CROSTB,CONSTB,ENTFTB,DSIZTB,
.BOPRTB,UOPRTB')
	DECLARE('ENTRY.VARIABLE',
.'ENTRLS,EXTRLS,FORTLS')
*	ARRAYS
	DECLARE('ENTRY.VARIABLE',
.'PTVRAR,PTFNAR,PRIMAR,GOTOAR,DECLAR,PROGAR,VARBAR,MACHAR,STENAR,BOPRAR,
.UOPRAR,PATRAR,EXPRAR,AROPAR,ARITAR,EACTAR')
*	PARAMETERS (STRINGS,DATATYPES)
	DECLARE('ENTRY.VARIABLE',
.'C,INDENT,SPLASH,ITNAM,ITENT,NOFAIL,SNONAM,SUBNAM,PARBLK,PRGNAM,STARTP,
.TEMLOC,P1,P2,P3,P4,P5')
*	PARAMETERS (INTEGERS)
	DECLARE('ENTRY.VARIABLE',
.'P,OBJFLG,LISTSR,INTGER,ITTYP,ITATR,PRGALV,PRGALL,PRGALF,STNFLG,HSHSIZ,
.STRTIM,DMPFLG,LISTOB,STNO,MAXTMP')
	DECLARE('INTEGER',
.'P,OBJFLG,LISTSR,INTGER,ITTYP,ITATR,PRGALV,PRGALL,PRGALF,STNFLG,HSHSIZ,
.STRTIM,DMPFLG,LISTOB,STNO,MAXTMP')
	DECLARE('ENTRY.VARIABLE',
.'XNATRB,VTATRB,VDATRB,LTATRB,FTATRB,FDATRB,TXATRB,VNATRB,VXATRB,VIATRB,
.VGATRB,LIATRB,LGATRB,FIATRB,FGATRB,FXATRB,SKATRB,SDATRB,BTATRB')
	DECLARE('INTEGER',
.'XNATRB,VTATRB,VDATRB,LTATRB,FTATRB,FDATRB,TXATRB,VNATRB,VXATRB,VIATRB,
.VGATRB,LIATRB,LGATRB,FIATRB,FGATRB,FXATRB,SKATRB,SDATRB,BTATRB')
	DECLARE('ENTRY.VARIABLE',
.'XNVATR,XNLATR,XNFATR,XNXMSK,VTVATR,VDDATR,VDPATR,VDDMSK,LTDATR,LTTMSK,
.FTFATR,FDPATR,FDIATR,FDDMSK,TXTATR,TXTMSK,VNNATR,VXXATR,VIPATR,VGGATR,
.LIPATR,LGGATR,FIPATR,FGGATR,FXXATR,FXXMSK,SKRATR,SDRATR,BTRATR')
	DECLARE('INTEGER',
.'XNVATR,XNLATR,XNFATR,XNXMSK,VTVATR,VDDATR,VDPATR,VDDMSK,LTDATR,LTTMSK,
.FTFATR,FDPATR,FDIATR,FDDMSK,TXTATR,TXTMSK,VNNATR,VXXATR,VIPATR,VGGATR,
.LIPATR,LGGATR,FIPATR,FGGATR,FXXATR,FXXMSK,SKRATR,SDRATR,BTRATR')
*	SPECIAL CHARACTERS,CHARACTER SEQUENCES, AND CHARACTER CLASSES
	DECLARE('ENTRY.VARIABLE',
.'FFCHR,CRLCHR,LFCHR,CRCHR,SQCHR,DQCHR,TBCHR,LCSCHR,BLNCHR,EQLCHR,
.QTSCHR,ELTCHR,LBCHR')
*	PATTERNS AND MATCHES
	DECLARE('ENTRY.VARIABLE',
.'COMSPT,INTGPT,BLNKPT,OPBLPT,PCOMPT,PCPRMT,IDENPT,DCLCMT,RSIDPT,LABLPT,
.POPRMT,IDENMT,SQLTPT,DQLTPT,LBDCPT,IDDCPT')
*
*	MINIMAL SYMBOL TABLE
*
	DECLARE('UNPURGE.VARIABLE','PRTOUT,MESG,TTYFLG,CHRMOD,PUTOUT,
.NEWNAM,NEWLAB,ERRMSG,STXERR,GETSTA,GETATR,GETITM,PARLIT,QTYP,BRKPAT,
.SUBS,SKEL,P1,P2,P3,P4,P5,SUB1')
	DECLARE('UNPURGE.LABEL','PRTOUT PUTOUT NEWNAM NEWLAB ERRMSG
. STXERR GETSTA GETATR GETITM PARLIT SUBS SUB1 CTL1 CTL2 CTL3 CTL4
. CTL5 CTL6 CTL7 CTL8 CTL9 CTL10')
	DECLARE('PURGE.FUNCTION','DEFINE,DATA,DIFFER,TIME,IDENT,LPAD,
.RPAD,SIZE,DUPL,SUBSTR,TABLE,DATATYPE,REPLACE')
*	*	*	*	*	*	*	*	*
*	*	MAIN PROCESSING SEQUENCE	*	*	*
*	*	*	*	*	*	*	*	*
*
*	LOCAL INITIALIZATION
	DEFINE('SUB1(SKEL)')
	DATA('SYM(INAM,ATRB)')
	DATA('CRS(NEXT,CRSI)')
	DATA('NOD(FRNT,BACK)')
	NXTNAM	= 10000
	NXTLAB	= 10000
	ERRCHR	= DUPL(' ',9) SUBSTR(&ALPHABET,1,9) DUPL(' ',118)
*	INITIALIZE SYSTEM
	&DENSITY	= 90
	NXTLIN	= INITLZ()	:F(ENDMSG)
*	PROCESS DECLARATIONS
	DECLPH()
*	PROCESS EXECUTABLE STATEMENTS
	EXECPH()
*	GENERATE END-ACTION STORAGE
	EACTPH()
*	OPTIONAL CROSS-REFERENCE DICTIONARY
	(?DIFFER(CROSTB) ?CROSPH())
*	END PROCESSING
ENDMSG	PRTOUT(CRLCHR '*TOTAL COMPILATION TIME: ' TIME() - STRTIM
. ' MS., ' DIAGNO ' ERROR DIAGNOSTICS*' CRLCHR,1,1)
	&OUTPUT	=	:(END)
*	*	*	*	*	*	*	*	*
*	*	SUBROUTINES	*	*	*	*	*
*	*	*	*	*	*	*	*	*
*		PRTOUT(MESG,TTYFLG,CHRMOD) OUTPUT MESSAGE ON LISTING DEV
*	IF TTYFLG IS NON-NULL, THE MESSAGE IS ALSO OUTPUT ON THE USER
*	TTY. IF CHRMOD IS NON-NULL, THE MESSAGE IS OUTPUT IN CHAR MODE
*
PRTOUT	LSTLIN	= ?IDENT(CHRMOD) MESG	:F(PRTOU1)
	OUTPUT	= ?DIFFER(TTYFLG) MESG	:(RETURN)
PRTOU1	LSTCHR	= MESG
	OUTPUTC	= ?DIFFER(TTYFLG) MESG	:(RETURN)
*	*	*	*	*	*	*	*	*
*		PUTOUT(MESG,CHRMOD) OUTPUT MESSAGE ON OBJECT DEV
*	ALSO OUTPUTS MESSAGE ON LISTING DEVICE IF LISTOB IS NONZERO
*	IF CHRMOD IS NON-NULL, THE OBJECT DEVICE OUTPUT IS IN CHARACTER
*	MODE AND NO LISTING IS ATTEMPTED
*
PUTOUT	OBJLIN	= ?IDENT(CHRMOD) MESG	:S(PUTOU1)
	OBJCHR	= MESG	:(RETURN)
PUTOU1	MESG	?INE(LISTOB,0)  ';' ! REM $ LSTLIN	:(RETURN)
*	*	*	*	*	*	*	*	*
*		NEWNAM() NEW SYMBOL INTERNAL NAME
*	PRODUCES A 5-CHARACTER INTEGER STRING REPRESENTING THE NEXT
*	AVAILABLE INAM FOR PROGRAM SYMBOLS
*
NEWNAM	SNUMB	= NXTNAM
	NXTNAM	= NXTNAM + 1
	NEWNAM	= SNUMB	:(RETURN)
*	*	*	*	*	*	*	*	*
*		NEWLAB() NEW INTERNAL LABEL
*	PRODUCES A 6-CHARACTER STRING OF THE FORM 'QNNNNN' REPRESENTING
*	THE NEXT AVAILABLE INTERNAL LABEL
*
NEWLAB	SNUMB	= NXTLAB
	NXTLAB	= NXTLAB + 1
	NEWLAB	= 'Q' SNUMB	:(RETURN)
*	*	*	*	*	*	*	*	*
*		ERRMSG(MESG) ERROR MESSAGE
*	OUTPUTS APPRPRIATE MESSAGE AND INCREMENTS DIAGNOSTIC COUNT
*
ERRMSG	DIAGNO	= ?PRTOUT(SPLASH 'ERROR   **' LPAD(RPAD(MESG,SIZE(
. MESG) + (38 - SIZE(MESG)) / 2,' '),38,' ') '**' CRLCHR SPLASH,1)
. DIAGNO + 1	:(RETURN)
*	*	*	*	*	*	*	*	*
*		STXERR(MESG) SYNTAX ERROR
*	CALLS ERRMSG IF MESG IS NON-NULL, THEN OUTPUTS APPROPRIATE
*	SECTION OF STATEMENT WITH POINTER INDICATING POSITION OF ERROR
*	EXPECTS STATEMENT IN C AND POINTER IN P
*
STXERR	(?DIFFER(MESG) ?ERRMSG(MESG))
	I	= P
	STXERR	= C
	STXERR	BREAK(CRCHR)  @J	:S(STXER2)
STXER1	PRTOUT(STXERR CRLCHR REPLACE(SUBSTR(STXERR,I),&ALPHABET,ERRCHR)
. '^',1)	:(RETURN)
STXER2	K	=
STXER3	STXERR	= ?ILE(I,J) SUBSTR(STXERR,J - K,K)	:F(STXER4)
	I	= I - K	:(STXER1)
STXER4	K	= J + 1
	STXERR	LEN(*K)  (BREAK(CRCHR) ! REM)  @J	:(STXER3)
*	*	*	*	*	*	*	*	*
*		GETSTA() GET NEXT STATEMENT
*	RETURNS STRING CORRESPONDING TO NEXT STATEMENT, WHICH IS NOT
*	A COMMENT OR CONTROL LINE, OR FAILS IF SOURCE END-OF-FILE
*	CARRIAGE RETURN CHARACTERS ARE SUBSTITUTED FOR CONTINUATION
*	CHARACTERS IN MULTI-LINE STATEMENTS
*
GETSTA	?IEQ(MSLI,0)	:F(GETST2)
GETST1	MSLI	=
	CURLIN	= ?DIFFER(NXTLIN,1) NXTLIN	:F(FRETURN)
	NXTLIN	= SRCLIN	:S(GETST2)
	NXTLIN	= 1
* CHECK FOR COMMENT, CONTROL, PAGE EJECT
GETST2	CURLIN	COMSPT $ STR1	:F(GETST5)
* PAGE EJECT
	CURLIN	= ?IDENT(STR1,FFCHR) ?PRTOUT(FFCHR,'',1) SUBSTR(CURLIN,
.SIZE(CURLIN) - 1,1)	:S(GETST2)
	(?IEQ(MSLI,0) ?PUTOUT(';' CURLIN) ?INE(LISTSR,0) ?PRTOUT(
.INDENT INDENT CURLIN))
* COMMENT
	DIFFER(STR1,'*')	:F(GETST1)
* CONTROL
	INTGER	=
	CURLIN	LEN(1)  OPBLPT  SPAN('ABCDEFGHIJKLMNOPQRSTUVWXYZ') $
. STR1  OPBLPT  FENCE  (RPOS(0) ! INTGPT  OPBLPT  RPOS(0))
.	:F(GETST4)
	STR1	= CTRLTB[STR1]
	IDENT(STR1)	:F($STR1)
GETST4	ERRMSG('BAD CONTROL LINE')	:(GETST1)
* NEXT STATEMENT
GETST5	STNO	= ?DIFFER(CURLIN) STNO + 1	:F(GETST1)
	(?IEQ(MSLI,0) ?PUTOUT(';' CURLIN) ?INE(LISTSR,0) ?PRTOUT(INDENT
. LPAD(STNO,7,' ') ' ' CURLIN))
GETST6	(GETSTA CURLIN)	BREAKQ(';') $ GETSTA  LEN(1)  REM $ CURLIN
.	:F(GETST7)
* MULTI-STATEMENT LINE
	MSLI	= 1	:(RETURN)
GETST7	GETSTA	= GETSTA CURLIN
* CONTINUATION CHECK
	NXTLIN	ANY('.+')  REM $ STR1	:F(GETST8)
	(?PUTOUT(';' NXTLIN) ?INE(LISTSR,0) ?PRTOUT(INDENT LPAD(STNO,
.7,' ') ' ' NXTLIN))
	CURLIN	= CRCHR STR1
	NXTLIN	= SRCLIN	:S(GETST6)
	NXTLIN	= 1	:(GETST6)
GETST8	MSLI	=	:(RETURN)
*	CONTROL ACTIONS
* LIST
CTL1	LISTSR	= 1	:(GETST1)
* UNLIST
CTL2	LISTSR	=	:(GETST1)
* NOCODE
CTL3	LISTOB	=	:(GETST1)
* CODE
CTL4	LISTOB	= 1	:(GETST1)
* EJECT
CTL5	(?PRTOUT(FFCHR,'',1) ?PUTOUT(FFCHR,1))	:(GETST1)
* SPACE N
CTL6	PRTOUT(DUPL(CRLCHR,INTGER),'',1)	:(GETST1)
* FAIL
CTL7	NOFAIL	=	:(GETST1)
* NOFAIL
CTL8	NOFAIL	= GOTOAR<1>	:(GETST1)
* NOCROSS
CTL9	CRSFLG	=	:(GETST1)
* CROSREF
CTL10	CRSFLG	= 1
	CROSTB	= ?IDENT(CROSTB) TABLE(15,7)	:(GETST1)
*	*	*	*	*	*	*	*	*
*		PARLIT(QTYP,BRKPAT) PARSE LITERAL
*	PARSES LITERAL AND RETURNS STRING WITH CR'S EXTRACTED AND PAIRS
*	OF QUOTES OF QTYP REDUCED TO ONE QUOTE
*	EXPECTS P TO POINT IMMEDIATELY AFTER THE STARTING QUOTE, AND
*	LEAVES P POINTING TO JUST BEFORE THE CLOSING QUOTE OR ANY OTHER
*	CHARACTER (OTHER THAN CR) INCLUDED IN BRKPAT (A BREAK PATTERN)
*
PARLIT	C	LEN(*P)  BRKPAT $ STR1  @P  LEN(1) $ STR2
.	:F(FRETURN)
	PARLIT	= PARLIT STR1
	P	= ?IDENT(STR2,CRCHR) P + 1	:S(PARLIT)
	STR2	= ?IDENT(STR2,QTYP) SUBSTR(C,1,P + 1)	:F(RETURN)
	PARLIT	= ?IDENT(STR2,QTYP) PARLIT QTYP	:F(RETURN)
	P	= P + 2	:(PARLIT)
*	*	*	*	*	*	*	*	*
*		SUBS(SKEL,P1,P2,P3,P4,P5) SUBSTITUTE PARAMETERS
*	FORMS STRING BY SUBSTITUTING PARAMETERS P1 THROUGH P5 IN
*	SKELETON TREE SKEL. DOES NOTHING IF BOTH OBJECT CODE AND LISTING
*	OF IT ARE TURNED OFF
*
SUBS	SUBS	= ?INE(OBJFLG + LISTOB,0) SUB1(SKEL)	:(RETURN)
*	*	*	*	*	*	*	*	*
*		SUB1(SKEL) WALK TREE AND SUBSTITUTE
*	WALKS OVER SKELETON TREE FROM LEFT TO RIGHT AND BOTTOM TO TOP
*	PRODUCING STRING RECURSIVELY
*
SUB1	SUB1	= DATATYPE(SKEL)
	SUB1	= ?IDENT(SUB1,'STRING') SKEL	:S(RETURN)
	SUB1	= ?IDENT(SUB1,'NAME') $SKEL	:S(RETURN)
	SUB1	= SUB1(FRNT(SKEL)) SUB1(BACK(SKEL))	:(RETURN)
*	*	*	*	*	*	*	*	*
*		GETITM() GET ITEM FROM SYMBOL TABLE
*	EXPECTS ITTYP, ITATR, AND ITNAM SET TO THE TYPE, ATTRIBUTES,
*	AND NAME OF THE SYMBOL, AND DOES LOOKUP TO GET ITENT. CREATES
*	NEW SYM DATATYPE FOR NEW ENTRIES, OR RESETS ITATR FOR OLD ONES
*	CALLS GETATR TO SET ALL THE APPROPRIATE INDIVIDUAL ATTRIBUTES
*	AND MAKES A CROSS-REFERENCE ENTRY IF THE FLAG IS ON
*
GETITM	ITPTR	= .SYMBTB[ITNAM]
	ITENT	= $ITPTR
	$ITPTR	= ?IDENT(ITENT) SYM(NEWNAM(),ITATR)	:F(GETIT2)
	ITENT	= $ITPTR
GETIT1	(?GETATR() ?INE(CRSFLG,0))	:F(RETURN)
	ITPTR	= .CROSTB[ITNAM]
	$ITPTR	= CRS($ITPTR,LSHIFT(STNO,3) + ITTYP)	:(RETURN)
GETIT2	ITATR	= ATRB(ITENT)	:(GETIT1)
*	*	*	*	*	*	*	*	*
*		GETATR() GET ATTRIBUTES
*	ENTER WITH ITTYP AND ITATR SET, AND SETS THE INDIVIDUAL 'XXATRB'
*	ATTRIBUTES FOR THE GIVEN TYPE
*
GETATR	?INE(ITTYP,0)	:F(GETAVR)
	?INE(ITTYP,1)	:F(GETALB)
	?INE(ITTYP,2)	:F(GETAFN)
	?INE(ITTYP,3)	:F(GETAST)
	?INE(ITTYP,4)	:F(GETABT)
	?INE(ITTYP,5)	:F(GETAVX)
	?INE(ITTYP,6)	:F(GETALX)
* EXTENDED FUNCTION
	FXATRB	= AND(ITATR,FXXMSK)
	FGATRB	= AND(ITATR,FGGATR)
	FIATRB	= AND(ITATR,FIPATR)
* NORMAL FUNCTION
GETAFN	FTATRB	= AND(ITATR,FTFATR)
	FDATRB	= AND(ITATR,FDDMSK)	:(GETATX)
* EXTENDED LABEL
GETALX	LGATRB	= AND(ITATR,LGGATR)
	LIATRB	= AND(ITATR,LIPATR)
* NORMAL LABEL
GETALB	LTATRB	= AND(ITATR,LTTMSK)	:(GETAXN)
* EXTENDED VARIABLE
GETAVX	VXATRB	= AND(ITATR,VXXATR)
	VGATRB	= AND(ITATR,VGGATR)
	VIATRB	= AND(ITATR,VIPATR)
	VNATRB	= AND(ITATR,VNNATR)
* NORMAL VARIABLE
GETAVR	VTATRB	= AND(ITATR,VTVATR)
	VDATRB	= AND(ITATR,VDDMSK)
GETATX	TXATRB	= AND(ITATR,TXTMSK)
GETAXN	XNATRB	= AND(ITATR,XNXMSK)	:(RETURN)
* STRING
GETAST	SKATRB	= AND(ITATR,SKRATR)
	SDATRB	= AND(ITATR,SDRATR)	:(RETURN)
* BREAK TABLE
GETABT	BTATRB	= AND(ITATR,BTRATR)	:(RETURN)
*	*	*	*	*	*	*	*	*
END