Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/comp/ls.mac
There are 2 other files named ls.mac in the archive. Click here to see a list.
	SEARCH	SIMMC1,SIMMAC
	CTITLE	LS
	SUBTTL	LS
	COMMENT;
	AUTHOR:	I WENNERSTR@M
	VERSION:	4 [14,15,101,144,164,262]
	PURPOSES:
		LS, LEXICAL SCANNER, IS A SUBROUTINE THAT IS CALLED FROM SR,
		SYNTAX RECOGNITION.
		LEXICAL SCANNER INPUTS CHARACTERS ONE BY ONE AND
		RECOGNIZES THE BASIC SYMBOLS WHICH
		IT RETURNS TO THE CALLING ROUTINE.
		AT THE END OF A LINE THE LC, LINE CONTROL
		ROUTINE IS CALLED.

		LS PERFORMS THE FOLLOWING FUNCTIONS:
		1) NON-SIGNIFICANT SPACES,TABS AND
		   LINE CONTROL CHARACTERS ARE REMOVED.
		2) COMMENTS ARE REMOVED.
		3) OPTIONS STATEMENTS ARE HANDLED AND REMOVED.
		4) SINGLE CHARACTER AND COMPOUND CHARACTERS
		   DELIMITERS ARE REPLACED BY THE BASIC SYMBOLS.
		5) THE RESERVED WORDS OF THE LANGUAGE ARE REPLACED
		   BY THE BASIC SYMBOLS.
		6) THE CHARACTERS OF A TEXT CONSTANT ARE DIRECTLY
		   OUTPUT ON THE BINARY CODE FILE NNNREL.TMP.
		   THE TEXT CONSTANT SYMBOL IS RETURNED TOGETHER WITH
		   THE VALUE  THAT IS THE RELATIVE ADDRESS PLUS LENGTH.
		7) A CHARACTER CONSTANT IS REPLACED BY THE
		   CHARACTER SYMBOL AND THE VALUE, THAT IS THE
		   INTERNAL REPRESENTATION, IS RETURNED.
		8) NUMBERS ARE CONVERTED INTO THE INTERNAL FORMAT
		   AND RETURNED TOGETHER WITH THE
		   CORRESPONDING BASIC SYMBOL.
		9) EACH NEW IDENTIFIER IS ENTERED INTO THE SYMBOL TABLE
		   AND REPLACED BY THE INTERNAL NUMBER. AN IDENTIFIER
		   THAT HAS ALREADY APPEARED IS REPLACED BY THE EXISTING
		   INTERNAL NUMBER. TO DO THIS THE SH, SYMBOL HASH,
		   ROUTINE IS CALLED.
		
	ENTRIES:	LS	NORMAL ENTRY FROM SR
			LSIPAG	ENTRY FROM I1SW

	NORMAL EXIT:	RETURN
	ERROR EXIT:	-
	INPUT ARGUMENTS ARE: X1LBP BYTE POINTER TO THE INPUT BUFFER AND 
			     X1NXT LAST SYNTAX SYMBOL
	OUTPUT ARGUMENTS ARE:   X1NXT NEXT SYNTAX SYMBOL
			        X1CUR PREVIOUS  X1NXT VALUE
				YLSVAL VALUE OF X1NXT SYMBOL IF CHARACTER
				     TEXT,INTEGER OR REAL CONSTANT
				YLSNLS,YLSCLS,YLSLLS VARIABLES FOR LINE NUMBERS
					AND SEMICOLON COUNTERS TO BE USED IN ERROR
					MESSAGES
	CONTENTS:

		LSIS,LSIOSC,LSSEM,LSCHIG,LSCHBL,LSCHNP,LSCHGR,LSXTXT,LSTNXT,
		LSNSM,LSNDL,LSNCO,LSNEXP,LSNSCE,LSNRD AND LSNKEY
		ALL SUBROUTINES USED LOCALLY BY LS
		AND
		LS MAIN PART  A SUBROUTINE CALLED FROM SR
		AND
		LSIPAG A SUBROUTINE CALLED FROM I1SW
	ERRORS GENERATED:
		WARNINGS:SIM034,SIM035,SIM036,SIM037,SIM040,SIM041,SIM042,SIM043,SIM044
		ERRORS:  SIM063,SIM064,SIM065,SIM066,SIM067,SIM070,SIM071,SIM072,
		         SIM073,SIM074,SIM075,SIM076,SIM077,SIM100,SIM101,SIM102,
			 SIM103,SIM104,SIM105

	;
	SALL
	TWOSEG
	RELOC	400000
	MACINIT

IFG QDEBUG,<EXTERN LSTRAC>
	EXTERN	LCLS1
	EXTERN	LCEOF,SH,LC,O1LS1,I1SW,O1IC1,O1RL  	;EXTERNAL ROUTINES
	EXTERN	YELIN1,YELIN2,YESEM,YLSNSD,YLSNPM,YREL  ;EXTERNAL VARIABLES
	EXTERN	YLSVAL,YENDNO,YBEGNO			;EXTERNAL VARIABLES
				edit(144)
	EXTERN	YSFDSW		;[144] -1 when SFD list parsed by SR

	ENTRY	LS		;ENTRY FROM SR
	ENTRY	LSIPAG		;ENTRY FROM I1SW WHEN A TEXT STRING IN A PAGE SWITCH 
				;IS LOCATED IN AN OPTION STATEMENT
	SUBTTL	LOCAL REGISTER, OPDEF'S AND MACRO DEFINITIONS


	;GENERAL ACCUMULATOR ALLOCATION IN MODULE MC1
	X1CN=10
	;ACCUMULATORS USED IN THE NUMBER HANDLING ROUTINES ARE NAMED SPECIALLY IN  
	;ORDER TO FACILITATE THE CONVERSION OF THE CORRESPONDING ALGOL ROUTINES.
	X1RA=X1ID1
	X1RB=X1ID2
	X1RD=X1R3


	OPDEF	RFAI[OUTSTR]
	OPDEF	SCAN[ILDB X1BYTE,X1LBP]
	OPDEF	SCANNO[LDB  X1BYTE,X1LBP]
	DEFINE	SCANLC	<SCAN
		L	X1LEX,Z1CH(X1BYTE) >
	DEFINE	SCANIG	<EXEC	LSCHIG	>
	DEFINE	SCANBL	<EXEC	LSCHBL	>
	DEFINE	RETIBP	<IBP	X1LBP
		RETURN>
	DEFINE	BIFCHA	(FPV,FPL)
		<CAIN	X1BYTE,FPV
		GOTO	FPL>

	DEFINE	BIFNCHA	(FPV,FPL)
		<CAIE	X1BYTE,FPV
		GOTO	FPL>

	DEFINE	BIFLEX	(FPV,FPL)
		<CAIN	X1NXT,FPV
		GOTO	FPL>

	DEFINE	BIFNLEX	(FPV,FPL)
		<CAIE	X1NXT,FPV
		GOTO	FPL>
	;MACROS USED TO GENERATE CALL OF THE ERROR ROUTINES

	DEFINE	MERRO (FTXT)	 <
		IFG	QDEBUG,<
;		OUTSTR	[ASCIZ	%
; FTXT %]
	>
		>

DEFINE MERRT(TP,NO,T,FTXT)
<	EXEC	LSLNSM
.X="X"
.N=-1
IRPC T<.N=.N+1
	IFIDN<T><X>,<STOPI>
	>
.A=ASCII %'T'%
.A=.A-<.X>B<6+.N*7>
	MOVE	X1,X1BYTE
	LSH	X1,7*<4-.N>+1
	IOR	X1,[.A]
	ERRT	Q'TP,<NO+Q1LS.'TP>
	MERRO	<FTXT>
>


DEFINE	MERR	(TP,NO,FTXT)
		<
		EXEC	LSLNSM
		ERR	Q'TP,<NO+Q1LS.'TP>
		MERRO	<FTXT>
			>

DEFINE	MERRI1	(TP,NO,FTXT)
		<
		EXEC	LSLNSM
		ERRI1	Q'TP,<NO+Q1LS.'TP>
		MERRO	<FTXT>
		>
	SUBTTL	LOCAL DECLARATIONS
	;THE Z1CH TABLE HAS ONE ENTRY FOR EACH OF THE 128 POSSIBLE INPUT CHARACTERS.
	;THE FIRST SIX BITS HOLD THE SIXBIT VALUE OF A LETTER OR DIGIT OR
	;			  AN INDEX VALUE FOR ALL OTHER CHARACTERS.
	;THE MIDDLE BITS (6-12) HOLD BIT SWITCHES.
	;AND THE LAST BITS (13-35) GIVE THE ADDRESS OF THE LS ROUTINE THAT
	;			   HANDLES A SYNTACTIC UNIT STARTING WITH
	;			   THIS CHARACTER.

	;BIT AND INDEX DEFINITIONS USED IN Z1CH TABLE

	Z1CHBL=^D24		; BIT 6 LETTER
	Z1CHBD=^D25		; BIT 7 DIGIT
	Z1CHBI=^D26		; BIT 8 INSIDE IDENTIFIER
	Z1CHBE=^D27		; BIT 9 MARKED IN END COMMENT
	Z1CHBT=^D28		; BIT 10 MARKED IN TEXT CONSTANT
	Z1CHBC=^D29		; BIT 11 MARKED IN COMMENT
	Z1CHBS=^D30		; BIT 12 IGNORED ON INPUT OR NONPRINTABLE CHARACTERS

	Z1CHVL=1B<Z1CHBL>+1B<Z1CHBI>
	Z1CHVD=1B<Z1CHBD>+1B<Z1CHBI>	;
	Z1CHVI=1B<Z1CHBI>
	Z1CHVE=1B<Z1CHBE>
	Z1CHVT=1B<Z1CHBT>
	Z1CHVC=1B<Z1CHBC>
	Z1CHVS=1B<Z1CHBS>
	Z1CHVG=Z1CHVE+Z1CHVT+Z1CHVC	;GROUP OF BITS

	Z1CHIR=0		;INDEX REST OF CHAR
	Z1CHIB=1		;INDEX BLANKS
	Z1CHIP=2		;INDEX CHAR .
	Z1CHIA=3		;INDEX CHAR &
	Z1CHIG=4		;INDEX LINE CONTROL(NOT EOT TAB [14] CR )
				; TEST CHAR AND ALL CHAR's THAT ARE NONPRINTABLE
	Z1CHII=5		;INDEX ILLEGAL CHAR
	Z1CHIT=6		;INDEX TAB, [14] CR
	Z1CHIE=7		;INDEX EOT


	;DEFINE THE SWITCHES THAT ARE PRESENT IN Z1CH TABLE
	DSW	(Z1CHSL,Z1CH,6,X1BYTE)
	DSW	(Z1CHSD,Z1CH,7,X1BYTE)
	DSW	(Z1CHSI,Z1CH,8,X1BYTE)
	DSW	(Z1CHSE,Z1CH,9,X1BYTE)
	DSW	(Z1CHST,Z1CH,10,X1BYTE)
	DSW	(Z1CHSC,Z1CH,11,X1BYTE)
	DSW	(Z1CHSS,Z1CH,12,X1BYTE)

	;LOCAL FIELDS


	DF	(Z1CHI,Z1CH,6,5)		;INDEX FIELD
	;CREATE Z1CH TABLE
	DEFINE	CRZ1CH	(MPROUT,MPINDX,MPBITV<0>)
	<
	IFIDN	<MPROUT> <LSF>,
		<XWD	<MPINDX>B23+MPBITV+Z1CHVE+Z1CHVT+Z1CHVC+Z1CHVS,MPROUT>
	IFDIF	<MPROUT> <LSF>,
		<XWD	<MPINDX>B23+MPBITV,MPROUT>
	>

Z1CH:	;ENTRY LABEL 
	CRZ1CH	LSNU,Z1CHIB,Z1CHVS	;  0 NULL IGNORED ON INPUT
	CRZ1CH	LSF,Z1CHIG		;  1 ^A
	CRZ1CH	LSF,Z1CHIG		;  2 ^B
	CRZ1CH	LSF,Z1CHIG		;  3 ^C
	CRZ1CH	LSE,Z1CHIE,Z1CHVG	;  4 ^D EOT
	CRZ1CH	LSF,Z1CHIG		;  5 ^E WRU
	CRZ1CH	LSF,Z1CHIG		;  6 ^F
	CRZ1CH	LSF,Z1CHIG		;  7 ^G
	CRZ1CH	LSF,Z1CHIG		; 10 ^H BACKSPACE
	CRZ1CH	LSB,Z1CHIT,Z1CHVT	; 11 ^I TAB
	CRZ1CH	LSL,Z1CHIG,Z1CHVG	; 12 ^J LINE FEED
	CRZ1CH	LSL,Z1CHIG,Z1CHVG	; 13 ^K VERT TAB
	CRZ1CH	LSL,Z1CHIG,Z1CHVG	; 14 ^L FORM FEED
					edit(14)
	CRZ1CH	LSB,Z1CHIT,Z1CHVT	; 15 ^M CARRIAGE RETURN	;[14]
	CRZ1CH	LSF,Z1CHIG		; 16 ^N
	CRZ1CH	LSF,Z1CHIG		; 17 ^O
	CRZ1CH	LSF,Z1CHIG		; 20 ^P
	CRZ1CH	LSF,Z1CHIG		; 21 ^Q XON
	CRZ1CH	LSF,Z1CHIG		; 22 ^R TAPE
	CRZ1CH	LSF,Z1CHIG		; 23 ^S XOFF
	CRZ1CH	LSF,Z1CHIG		; 24 ^T NOTAPE
	CRZ1CH	LSF,Z1CHIG		; 25 ^U
	CRZ1CH	LSF,Z1CHIG		; 26 ^V
	CRZ1CH	LSF,Z1CHIG		; 27 ^W
	CRZ1CH	LSF,Z1CHIG		; 30 ^X
	CRZ1CH	LSF,Z1CHIG		; 31 ^Y
	CRZ1CH	LSF,Z1CHIG		; 32 ^Z
	CRZ1CH	LSF,Z1CHIG		; 33 ^LBRAC ESC
	CRZ1CH	LSF,Z1CHIG		; 34 ^SLASH
	CRZ1CH	LSF,Z1CHIG		; 35 ^RBRAC 
	IFN	QDEBUG<
	CRZ1CH	LST,Z1CHIG,Z1CHVG	; 36 ^^ USED FOR TESTING
		    >
	IFE	QDEBUG<
	CRZ1CH	LSF,Z1CHIG		; 36 ^^ PRODUCTION ENTRY
		    >
	CRZ1CH	LSF,Z1CHIG		; 37 ^LEFT ARROW
	CRZ1CH	LSB,Z1CHIB		; 40 SPACE
	CRZ1CH	LSK,Z1CHIR		; 41 !
	CRZ1CH	LSX,Z1CHIR,Z1CHVT	; 42 "
	CRZ1CH	LSI,'#',Z1CHVL		; 43 #
	CRZ1CH	LSI,'$',Z1CHVL		; 44 $
	CRZ1CH	LSFP,Z1CHII		; 45 %
	CRZ1CH	LSNPR,Z1CHIA		; 46 &
	CRZ1CH	LSC,Z1CHIR,Z1CHVT	; 47 '
	CRZ1CH	LSDC,Z1CHIR,Z1CHVE	; 50 (
	CRZ1CH	LSDD,Z1CHIR		; 51 )
	CRZ1CH	LSDS,Z1CHIR		; 52 *
	CRZ1CH	LSDG,Z1CHIR		; 53 +
	CRZ1CH	LSDA,Z1CHIR		; 54 ,
	CRZ1CH	LSDH,Z1CHIR		; 55 -
	CRZ1CH	LSDK,Z1CHIP		; 56 .
	CRZ1CH	LSDR,Z1CHIR		; 57 /
	CRZ1CH	LSN,'0',Z1CHVD		; 60 0
	CRZ1CH	LSN,'1',Z1CHVD		; 61 1
	CRZ1CH	LSN,'2',Z1CHVD		; 62 2
	CRZ1CH	LSN,'3',Z1CHVD		; 63 3
	CRZ1CH	LSN,'4',Z1CHVD		; 64 4
	CRZ1CH	LSN,'5',Z1CHVD		; 65 5
	CRZ1CH	LSN,'6',Z1CHVD		; 66 6
	CRZ1CH	LSN,'7',Z1CHVD		; 67 7
	CRZ1CH	LSN,'8',Z1CHVD		; 70 8
	CRZ1CH	LSN,'9',Z1CHVD		; 71 9
	CRZ1CH	LSDM,Z1CHIR,Z1CHVE	; 72 :
	CRZ1CH	LSDB,Z1CHIR,Z1CHVG	; 73 ; 
	CRZ1CH	LSDN,Z1CHIR		; 74 LESS THAN
	CRZ1CH	LSDL,Z1CHIR		; 75 =
	CRZ1CH	LSDO,Z1CHIR		; 76 GREATER THAN
	CRZ1CH	LSFP,Z1CHII		; 77 ?
	CRZ1CH	LSI,'@',Z1CHVL		;100 @
	CRZ1CH	LSI,'A',Z1CHVL		;101 A
	CRZ1CH	LSI,'B',Z1CHVL		;102 B
	CRZ1CH	LSI,'C',Z1CHVL		;103 C
	CRZ1CH	LSI,'D',Z1CHVL		;104 D
	CRZ1CH	LSI,'E',Z1CHVL		;105 E
	CRZ1CH	LSI,'F',Z1CHVL		;106 F
	CRZ1CH	LSI,'G',Z1CHVL		;107 G
	CRZ1CH	LSI,'H',Z1CHVL		;110 H
	CRZ1CH	LSI,'I',Z1CHVL		;111 I
	CRZ1CH	LSI,'J',Z1CHVL		;112 J
	CRZ1CH	LSI,'K',Z1CHVL		;113 K
	CRZ1CH	LSI,'L',Z1CHVL		;114 L
	CRZ1CH	LSI,'M',Z1CHVL		;115 M
	CRZ1CH	LSI,'N',Z1CHVL		;116 N
	CRZ1CH	LSI,'O',Z1CHVL		;117 O
	CRZ1CH	LSI,'P',Z1CHVL		;120 P
	CRZ1CH	LSI,'Q',Z1CHVL		;121 Q
	CRZ1CH	LSI,'R',Z1CHVL		;122 R
	CRZ1CH	LSI,'S',Z1CHVL		;123 S
	CRZ1CH	LSI,'T',Z1CHVL		;124 T
	CRZ1CH	LSI,'U',Z1CHVL		;125 U
	CRZ1CH	LSI,'V',Z1CHVL		;126 V
	CRZ1CH	LSI,'W',Z1CHVL		;127 W
	CRZ1CH	LSI,'X',Z1CHVL		;130 X
	CRZ1CH	LSI,'Y',Z1CHVL		;131 Y
	CRZ1CH	LSI,'Z',Z1CHVL		;132 Z
	CRZ1CH	LSDE,Z1CHIR		;133 LBRAC
	CRZ1CH	LSDP,Z1CHIR		;134 \
	CRZ1CH	LSDF,Z1CHIR		;135 RBRAC
	CRZ1CH	LSDI,Z1CHIR		;136 ^
	CRZ1CH	LSFP,'_',Z1CHVI		;137 UNDERLINE 
 	CRZ1CH	LSI,'@',Z1CHVL		;140 LOW @
	CRZ1CH	LSI,'A',Z1CHVL		;141 LOW A
	CRZ1CH	LSI,'B',Z1CHVL		;142 LOW B
	CRZ1CH	LSI,'C',Z1CHVL		;143 LOW C
	CRZ1CH	LSI,'D',Z1CHVL		;144 LOW D
	CRZ1CH	LSI,'E',Z1CHVL		;145 LOW E
	CRZ1CH	LSI,'F',Z1CHVL		;146 LOW F
	CRZ1CH	LSI,'G',Z1CHVL		;147 LOW G
	CRZ1CH	LSI,'H',Z1CHVL		;150 LOW H
	CRZ1CH	LSI,'I',Z1CHVL		;151 LOW I
	CRZ1CH	LSI,'J',Z1CHVL		;152 LOW J
	CRZ1CH	LSI,'K',Z1CHVL		;153 LOW K
	CRZ1CH	LSI,'L',Z1CHVL		;154 LOW L
	CRZ1CH	LSI,'M',Z1CHVL		;155 LOW M
	CRZ1CH	LSI,'N',Z1CHVL		;156 LOW N
	CRZ1CH	LSI,'O',Z1CHVL		;157 LOW O
	CRZ1CH	LSI,'P',Z1CHVL		;160 LOW P
	CRZ1CH	LSI,'Q',Z1CHVL		;161 LOW Q
	CRZ1CH	LSI,'R',Z1CHVL		;162 LOW R
	CRZ1CH	LSI,'S',Z1CHVL		;163 LOW S
	CRZ1CH	LSI,'T',Z1CHVL		;164 LOW T
	CRZ1CH	LSI,'U',Z1CHVL		;165 LOW U
	CRZ1CH	LSI,'V',Z1CHVL		;166 LOW V
	CRZ1CH	LSI,'W',Z1CHVL		;167 LOW W
	CRZ1CH	LSI,'X',Z1CHVL		;170 LOW X
	CRZ1CH	LSI,'Y',Z1CHVL		;171 LOW Y
	CRZ1CH	LSI,'Z',Z1CHVL		;172 LOW Z
	CRZ1CH	LSI,'#',Z1CHVL		;173 LOW #
	CRZ1CH	LSFP,Z1CHII		;174 VERTICAL BAR 
	CRZ1CH	LSI,'$',Z1CHVL		;175 LOW $
	CRZ1CH	LSFP,Z1CHII		;176 NOT
	CRZ1CH	LSNU,Z1CHIB,Z1CHVS	;177 DELETE IGNORE ON INPUT
	;GENERATE RESERVED WORD TABLE WITH SYNTAX SYMBOLS AND SWITCHES
	;
	;RESWORD MACRO DEFINED IN SIMMAC
	;GENERATE Z1RW



	DEFINE	RESW$	(A,B,C<0>)<
		IFB<B>  <XWD	C,%'A>
		IFNB<B> <XWD	C,%'B>

	>

Z1RW:	RESWORD
	DSW	(Z1RWSE,0,0,X1R0)	;RESERVED WORD THAT IS RECOGNIZED IN AN END
					; COMMENT
	DSW	(Z1RWSM,0,1,X1R0)	;RESERVED WORD THAT IS RECOGNIZED IN LS



	DF	(Z1RWKL,<Z1RW>,18,35)
;ASSEMBLY TIME CONSTANTS



QLRESW=QLOWID-1		;LAST RESERVED WORD IN DICTIONARY (INDEX)

QLSRT2="B"B24		;BEGIN RECORD CONSTANT LS1
QLSRT3="E"B24		;END RECORD CONSTANT LS1

QTEXTQ=42		;ASCII CONSTANT
QSEM=73			;SEMICOLON
QTAB=11
QTST=36
IFNDEF Q1LS.W	<Q1LS.W=0	>
IFNDEF	Q1LS.E	<Q1LS.E=0	>




LSNFT:	;FLOATING NUMBERS
	XWD	000000,0	;0
	XWD	201400,0	;1
	XWD	202400,0	;2
	XWD	202600,0	;3
	XWD	203400,0	;4
	XWD	203500,0	;5
	XWD	203600,0	;6
	XWD	203700,0	;7
	XWD	204400,0	;8
	XWD	204440,0	;9
	IFN	QKA10,<;THESE NUMBERS ARE DEPENDENT ON THE DOUBLE FLOATING POINT 
			;INSTRUCTIONS IN KI10

>
LSNHTEN:	;FLOATING POINT SCALE FACTORS ,HIGH ORDER WORDS
	XWD	201400,000000	;1.0
	XWD	204500,000000	;1.0&&1
	XWD	207620,000000	;1.0&&2
	XWD	212764,000000	;1.0&&3
	XWD	216470,400000	;1.0&&4
	XWD	221606,500000	;1.0&&5
	XWD	224750,220000	;1.0&&6
	XWD	230461,132000	;1.0&&7
	XWD	233575,360400	;1.0&&8
	XWD	236734,654500	;1.0&&9
	XWD	242452,013710	;1.0&&10
	XWD	245564,416672	;1.0&&11
	XWD	250721,522450	;1.0&&12
	XWD	254443,023471	;1.0&&13
	XWD	257553,630407	;1.0&&14
	XWD	262706,576511	;1.0&&15
	XWD	266434,157115	;1.0&&16
	XWD	271543,212741	;1.0&&17
	XWD	274674,055531	;1.0&&18
	XWD	300425,434430	;1.0&&19
	XWD	303532,743536	;1.0&&20
	XWD	306661,534465	;1.0&&21
	XWD	312417,031701	;1.0&&22
	XWD	315522,640261	;1.0&&23
	XWD	320647,410336	;1.0&&24
	XWD	324410,545213	;1.0&&25
	XWD	327512,676455	;1.0&&26
	XWD	332635,456171	;1.0&&27
	XWD	336402,374713	;1.0&&28
	XWD	341503,074076	;1.0&&29
	XWD	344623,713116	;1.0&&30
	XWD	347770,675742	;1.0&&31
	XWD	353473,426555	;1.0&&32
	XWD	356612,334310	;1.0&&33
	XWD	361755,023372	;1.0&&34
	XWD	365464,114134	;1.0&&35
	XWD	370601,137163	;1.0&&36
	XWD	373741,367020	;1.0&&37
	XWD	377454,732312	;1.0&&38
	IFN	QKA10,<;THESE NUMBERS ARE DEPENDENT ON THE DOUBLE FLOATING POINT
			;INSTRUCTIONS IN KI10

>
LSNLTEN:	;FLOATING POINT SCALE FACTORS ,LOW ORDER WORDS
	XWD	000000,000000	;1.0
	XWD	000000,000000	;1.0&&1
	XWD	000000,000000	;1.0&&2
	XWD	000000,000000	;1.0&&3
	XWD	000000,000000	;1.0&&4
	XWD	000000,000000	;1.0&&5
	XWD	000000,000000	;1.0&&6
	XWD	000000,000000	;1.0&&7
	XWD	000000,000000	;1.0&&8
	XWD	000000,000000	;1.0&&9
	XWD	000000,000000	;1.0&&10
	XWD	000000,000000	;1.0&&11
	XWD	200000,000000	;1.0&&12
	XWD	120000,000000	;1.0&&13
	XWD	244000,00000	;1.0&&14
	XWD	215000,000000	;1.0&&15
	XWD	370100,000000	;1.0&&16
	XWD	166120,000000	;1.0&&17
	XWD	323544,000000	;1.0&&18
	XWD	044236,400000	;1.0&&19
	XWD	055306,100000	;1.0&&20
	XWD	270567,520000	;1.0&&21
	XWD	223352,622000	;1.0&&22
	XWD	370245,366400	;1.0&&23
	XWD	166316,664100	;1.0&&24
	XWD	012001,220450	;1.0&&25
	XWD	314401,464562	;1.0&&26
	XWD	077502,001717	;1.0&&27
	XWD	307611,201141	;1.0&&28
	XWD	271553,441371	;1.0&&29
	XWD	150106,351670	;1.0&&30
	XWD	002130,044246	;1.0&&31
	XWD	101267,026547	;1.0&&32
	XWD	221544,634301	;1.0&&33
	XWD	266076,003362	;1.0&&34
	XWD	261646,602127	;1.0&&35
	XWD	336220,342555	;1.0&&36
	XWD	325664,433310	;1.0&&37
	XWD	205520,661075	;1.0&&38
	
	SUBTTL	SUBROUTINES


	
LSSEM:	PROC
				;UPDATE SEMICOLON COUNTER (WITHIN LINE)
	LF	(X1R0)  YLSNSEM
	AOJ	X1R0,
	SF	(X1R0)  YLSNSEM	
	RETURN
	EPROC
	




LSCHIG:PROC
		;SCAN PAST ALL CHARACTERS THAT ARE TO BE IGNORED
		;AND GIVE ERROR MESSAGES FOR ALL ILLEGAL CHARACTERS.
	LOOP	SCAN
	AS	IFOFF	Z1CHSS
		RET			;ORDINARY CHAR
		EXEC	LSCHNP		;HANDLE NONPRINTABLE CHAR.
					;IGNORE CHAR.
		GOTO	TRUE
	SA
	EPROC



LSCHBL:	PROC
		;SCAN TO NEXT NONBLANK CHARACTER
	LOOP	SCAN
LSCHBE:		;ENTRY IF TEST BEFORE SCAN NEEDED
	AS	BIFCHA	" ",TRUE
		IFOFF	Z1CHSS
		RET			;NONBLANK CHARACTER FOUND
		EXEC	LSCHNP		;HANDLE NONPRINTABLE CHAR.
					;IGNORE CHAR
		GOTO	TRUE
	SA
	EPROC
LSCHNP:	PROC
		;CREATE ERROR IF NONPRINTABLE CHAR.

	IFOFF	Z1CHSE
	RETURN

LSCHN1:		;ENTRY IF NO TEST NEEDED

	STACK	X1
	MERR	E,1,<NONPRINTABLE CHAR.>
	UNSTK	X1
	RETURN

	EPROC
LSIS:	PROC
	COMMENT;
	PURPOSES:FIND END OF IDENTIFIER.
		IF YSFDSW is zero, CALL SH TO FIND KEYWORD OR
		IDENTIFIER IN THE DICTIONARY.
	ENTRY: LSIS
	INPUT ARGUMENTS: X1LBP POINTS AT FIRST LETTER IN IDENTIFIER
			  SWITCH YZSE IS ON WHEN NO ADDITION IS TO BE
			  MADE  IN SH TO THE DICTIONARY.
	NORMAL EXITS:	RETURN WHEN USER IDENTIFIER
		        SKIP RETURN WHEN KEYWORD FOUND
	OUTPUT ARGUMENTS: X1LBP POINTS AT FIRST CHARACTER THAT IS NOT
			   PART OF IDENTIFIER
			  X1NXT CONTAINS VALUE SET BY SH WHICH IS BASIC
			  SYMBOL IF KEYWORD OTHERWISE THE INTERNAL IDENTIFIER NUMBER
			[144] If SH was not called, X1ID1-X1ID2 contain SIXBIT id.
	USED SUBROUTINES:SH SYMBOL HASH EXTERNAL ROUTINE AND
				   LSCHIG AND LSCHNP LS ROUTINES
	;
	L	X1LEX,Z1CH(X1BYTE)		;LOAD SIXBIT VALUE+SWITCHES
	LI	X1R1,6
	LOOP	LSHC	X1ID2,6		;SHIFT SIXBIT CODE FROM X1LEX REGISTER
L3():!			SCANLC		;NEXT CHARACTER
		IFOFFA	Z1CHSI
		 GOTO	L1		;TEST IF END OF IDENTIFIER
	
	AS

		DECR	X1R1,TRUE		
	SA
	L	X1ID1,X1ID2			;FIRST PART OF IDENTIFIER
	LI	X1R1,6
	LOOP	LSHC	X1ID2,6
L4():!			SCANLC
		IFOFFA	Z1CHSI
		 GOTO	L2
	AS
		DECR	X1R1,TRUE
	SA

;MORE THAN 12 LETTERS IN IDENTIFIER
;ALL STATEMENTS USED TO PRODUCE ERROR MESSAGE IDENTIFIER LONGER THAN 12 CHAR. REMOVED
; TWO ; PLACED BEFORE THESE STATEMENTS
;;	SETONA	YLSID		;INDICATE POSSIBLE ERROR
	LOOP	SCANIG		;SCAN TO END OF IDENTIFIER
	AS	IFON	Z1CHSI
		GOTO TRUE
	SA			;END FOUND
;;	EXEC	SH
;;	IF	IFOFFA	YLSID
;;		GOTO	FALSE	;IDENTIFIER NOT ADDED TO DICTIONARY
;;	THEN
;;		SETOFA	YLSID
;;		L	X1R1,X1NXT
;;				;FETCH IDENTIFIER NUMBER
;;		MERRI1	W,0,<IDENTIFIER TOO LONG>
;;	FI
;;	GOTO	L5		;RETURN FROM LSIS
	GOTO	LSIS1		;TO BE REMOVED IF ;; REMOVED
L1():!	IF
		IFOFFA	Z1CHSS
		GOTO	TRUE+1
		SCANNO	
		EXEC	LSCHNP
		GOTO	L3		;CONTINUE
	THEN	;END OF IDENTIFIER FOUND
		LSH	X1ID2,6
		DECR	X1R1,.-1
		L	X1ID1,X1ID2
		LI	X1ID2,0

	FI

LSIS1:		;IDENTIFIER IN X1ID1,X1ID2
	SCANNO
				edit(144)
	LI	X1NXT,2000	;[144] Identifier code indicated
	SKIPE	YSFDSW		;[144] No hash if SFD id
	 RET			;[144]
	EXEC	SH			;FIND IDENTIFIER IN DICTIONARY
L5():!	IF	CAILE	X1NXT,QLRESW
		RET				;IDENTIFIER IN DICTIONARY
		JUMPE	X1NXT,FALSE		;NEW IDENTIFIER OR OVERFLOW
	THEN					;KEYWORD
		ASSERT	<IF	CAIL	X1NXT,QLRESW-QNRESW+1
				GOTO	FALSE		;OK RESERVED WORD
			THEN	RFAIL	<LSI ERR  NOT RESERVED WORD>
			FI>
		AOS	,(XPDP)		;SKIP RETURN WHEN RESERVED WORD
	FI
	RET			;EXIT LSIS

L2():	IF	IFOFFA	Z1CHSS
		GOTO	TRUE+1
		SCANNO
		EXEC	LSCHNP		;HANDLE NONPRINTABLE CHAR.
		GOTO	L4		;CONTINUE
	THEN	; END OF IDENTIFIER
		LSH	X1ID2,6
		DECR	X1R1,.-1
		GOTO	LSIS1
	FI
	
	EPROC
LSIPAG:	PROC
	COMMENT;
	PURPOSE:SCAN THE PAGE SWITCH TEXT STRING IN AN OPTIONS STATEMENT.
	ENTRY:ENTRY FROM I1SW WHEN A PAGE SWITCH WITH TEXT STRING IS FOUND
	INPUT ARGUMENTS:X1R3 POINTS TO CURRENT CHARACTER WHICH MUST BE A :
	NORMAL EXITS:SKIP RETURN TO LSI OPTIONS ROUTINE WHICH IS ALWAYS 
					THE ROUTINE THAT CALLED I1SW.
		ERROR EXITS:RETURN TO LSI 
	OUTPUT ARGUMENTS:X1R3 POINTS AT CHARACTER FOLLOWING " OR
					AT EOF OR FIRST CHARACTER ON
					NEW LINE OR CHARACTER FOLLOWING :
	CALL FORMAT: BRANCH LSIPAG
	USED SUBROUTINES:LSXTXT AND LSCHIG
	;

	ST	X1R3,X1LBP		;RESTORE REGISTER FOR LS 
	SCANIG				;SCAN PAST : CHAR
	BIFNCH	QTEXTQ,L1			
	LI	X1NXT,%OPT
	HRROI	X1ID1,-^D60		;MAX 60 CHARACTERS
	EXEC	LSXTXT			;SCAN STRING
	IF	JUMPLE	X1ID1,FALSE	;LENGTH OK
	THEN	MERR	W,5,<PAGE STRING LONGER THAN 60 CHARACTERS>
		HRROI	X1ID1,-^D136	;SCAN NOT MORE THAN ONE LINE
		SETZ	X1NXT,		;INDICATE PAGE STRING OVERFLOW ENTRY
		EXEC	LSXTXT
					;SCAN TO NEXT " OR EOF OR END OF LINE
	L2():	;ENTRY AFTER ERROR
		LI	X1NXT,%OPT
		ST	X1LBP,X1R3
		RETURN		;RETURN IF ERROR FOUND
	FI
	SETONA	YLSENW		;RESET SWITCH FOUND SWITCH
	ST	X1LBP,X1R3	;RESTORE REGISTER FOR I1SW
	UNSTK	X1R1
	BRANCH	1(X1R1)		;RETURN IF NO ERROR
L1():	MERR	W,4,<PAGE STRING MISSING AFTER : IN OPTIONS>
	GOTO	L2
	EPROC
LSIOSC:	PROC
	;SCAN CHARACTERS IN OPTIONS STATEMENT
	;EXIT TO RETURN ADDRESS+2 IF / FOUND
	;EXIT TO RETURN ADDRESS+1 IF ; FOUND
	;EXIT TO RETURN ADDRESS   FOR REMAINING CHARACTERS
	;IF EOF FOUND BRANCH TO LSLOP
	;HANDLE AND SCAN PAST BLANKS,ILLEGAL CHAR.,TAB,END OF LINE CHARACTERS 
	; AND TEST CHAR.

LSIOS1:	;ENTRY IF SCAN BEFORE TEST
L8():	SCANBL
LSIOS2:	;ENTRY IF NO SCAN BEFORE TEST
	IFON	Z1CHSI
	RETURN			;RETURN IF LETTER ,DIGIT OR _
	LF	(X1R1) Z1CHI(X1BYTE)
	GOTO	@LSIT1(X1R1)	;TO RELEVANT ROUTINE
LSIT1:	;BRANCH TABLE FOR OPTIONS STATEMENT
	L4			;REST OF CHAR.
	L8			;BLANK
	L4			; .
	L4			; &
	L5			;TEST PLUS LINE CONTROL CHAR.
	L6			;ILLEGAL CHAR.
	L8			;TAB, [14] AND CR
	L7			;EOF

L6():	MERRT	E,2,<  X  >,<ILLEGAL PRINTABLE CHAR.>
	GOTO	L8

L7():	;EOF FOUND
	MERR	W,10,<END OF FILE IN OPTIONS STMT>
	UNSTK	X1R0
	BRANCH	LSLOP		;HANDLE EOF

L5():	EXEC	LSCHGR		;HANDLE TEST OR LINE CONTROL CHAR
	GOTO	L8

L4():	UNSTK	X1R1		;PREPARE RETURN
	BIFCHA	"/",<2(X1R1)>	;RETURN IF /
	BIFCHA	QSEM,L9
	BRANCH	0(X1R1)		;RETURN IF OTHER CHARACTER
L9():	EXEC	LSSEM		;UPDATE SEMICOLON COUNTER
	BRANCH	1(X1R1)		;RETURN IF ;

	EPROC
LSCHGR:	PROC
	;HANDLE SPECIAL CHARACTERS
	;TEST,FF,CR,LF,VT,
	;AND NONPRINTABLE CHARACTERS

	IFN	QDEBUG<		;ONLY IF TEST VERSION
	IF	BIFNCHA	QTST,FALSE
	THEN		;TEST CHARACTER
		EXEC	LSTPRO		;TREAT TEST CHARACTERS
		RET
	FI	>

	IF	IFOFF	Z1CHSS
		GOTO	FALSE		;MUST BE LINE CONTROL CHAR.
	THEN
		EXEC	LSCHN1		;NONPRINTABLE CHAR.
		RET
	FI

	EXEC	LC		;HANDLE END OF LINE
	ZF	YLSNSEM		;Clear SEMICOLON COUNTER

	RET

	EPROC				



	
LSLNSM:	PROC
		;PREPARE LINE AND SEMICOLON NUMBERS FOR ERROR ROUTINE
	LF	X0,YLSNSEM
	ST	X0,YESEM

	LF	X0,YLSNLIN
	ST	X0,YELIN1
	ST	X0,YELIN2
	RETURN

	EPROC
LSNDL:	PROC
	;NUMBER ROUTINE
	;CHECK THAT DECIMAL POINT WAS NOT LAST NONBLANK CHARACTER IN NUMBER
	IF	SKIPN	,YLSNPM
		GOTO 	FALSE		;DECIMAL POINT NOT PRESENT
		CAME	X1RD,YLSNPM
		GOTO 	FALSE		;DIGIT AFTER DEC.POINT
	THEN	MERR	E,14,<DIGIT MISSING AFTER DECIMAL POINT>
	FI 	RETURN
	EPROC

LSNCO:	PROC
	;NUMBER ROUTINE PROCEDURE
	;CONVERT FROM INTEGER TO DOUBLE FLOATING NUMBER
	IFN	QKA10,<;ROUTINE DEPENDENT ON DOUBLE FLOATING INSTRUCTIONS
>
	IF	IFONA	YLSNUM
		GOTO	FALSE		;ALREADY CONVERTED
	THEN	SETONA	YLSNUM		;INDICATE CONVERSION DONE
		SETZ	X1RB,
		LSHC	X1RA,-^D9	;SHIFT
		LSH	X1RB,-^D1	;SHIFT
		TLO	X1RA,(244B8) 	;OR IN AN EXPONENT TO LEFT PART
		DFAD	X1RA,[EXP	0,0]	;NORMALIZE NUMBER
		SETOFA	YLSENW		;SET FLAG TO INDICATE NO OVERFLOW
					; IN FLOATING NUMBER
	FI	RETURN
	EPROC
LSNEXP:	PROC
	COMMENT /
	PURPOSE:
			NUMBER ROUTINE PROCEDURE
			SCAN EXPONENT
	INPUT ARGUMENTS:YLSNPM DECIMAL POINT MARKER
			X1RD DECIMAL POINT COUNTER
			YLSNSD NUMBER OF DIGITS AFTER OVERFLOW
	OUTPUT ARGUMENTS:X1RD AND YLSNSD
	/
	SKIPE	,YLSNPM
	SUBM	X1RD,YLSNPM		;CALCULATE DECIMAL POINT SCALING
					;IF ANY
	IFOFFA	YLSENW
	GOTO	.+3			;NO OVERFLOW OF FLOATING NUMBER
	L	X1RD,YLSNSD		;FETCH NUMBER OF DIGITS AFTER OVERFLOW
	ADDM	X1RD,YLSNPM		;CORRECT SCALING
	SETZB	X1RD,YLSNSD		;ZERO TO EXPONENT AND SIGN
	SETOFA	YLSENW			;INDICATE NO DIGIT FOUND IN EXPONENT
	BIFCHA	"+",L1			;; FOUND
	BIFNCHA	"-",L2			;MUST BE DIGIT
	SETOM	YLSNSD			;SAVE MINUS SIGN
L1():!	SCANBL				;SCAN PAST ANY BLANKS
L2():!	IF	IFOFF	Z1CHSD
		GOTO	FALSE		;END OF NUMBER
	THEN	;DIGIT FOUND
	SETONA	YLSENW			;INDICATE DIGIT FOUND IN EXPONENT
		IMULI	X1RD,^D10
		ADDI	X1RD,-"0"(X1BYTE)	;ADD NEW DECIMAL VALUE
		GOTO	L1		;NEXT CHARACTER IN EXPONENT
	FI	;END OF EXPONENT
	IF	IFONA	YLSENW
		GOTO	FALSE		
	THEN				;NO DIGITS IN EXPONENT
		MERR	E,15,<NO DIGITS IN EXPONENT>
	FI
	SKIPE	,YLSNSD
	MOVN	X1RD,X1RD		;NEGATE EXPONENT IF SIGN WAS MINUS
	ADD	X1RD,YLSNPM		;ADD IN EXPONENT TO DECIMAL POINT COUNTER
	RETURN
	EPROC
LSNSCE:	PROC
	COMMENT /
	PURPOSE:
		;NUMBER ROUTINE
		;SCALE NUMBER ACCORDING TO DECIMAL POINT AND EXPONENT VALUE
	INPUT ARGUMENTS: X1RD SCALE FACTOR
			X1RA,X1RB DOUBLE FLOATING NUMBER
	OUTPUT ARGUMENTS:X1RA,X1RB DOUBLE FLOATING NUMBER
	/

	IFN	QKA10,<;ROUTINE DEPENDENT ON DOUBLE FLOATING INSTRUCTIONS
>

	JUMPE	X1RA,L1			;NUMBER IS 0
	JUMPE	X1RD,L1			;SCALE VALUE IS 0
	JFCL	17,.+1
	ST	X1RD,YLSNSD		;SAVE SCALE VALUE
	MOVM	X1RD,X1RD		;DELETE SIGN
	L	X1R0,LSNHTEN+^D38
	L	X1R1,LSNLTEN+^D38	;FILL IN MAX SCALE FACTORS
LOOP	IF	CAIL	X1RD,^D38
		GOTO	FALSE		;USE SCALE 38
	THEN	L	X1R0,LSNHTEN(X1RD)
		L	X1R1,LSNLTEN(X1RD)	;FILL IN SCALE FACTORS
	FI
	IF	SKIPG	,YLSNSD
		GOTO	FALSE		;DIVIDE
	THEN
		DFMP	X1RA,X1R0	;MULTIPLY WITH SCALE FACTOR
		JFOV	L2		;FLOATING OVERFLOW?
	ELSE
		DFDV	X1RA,X1R0	;DIVIDE WITH SCALE FACTOR
		JFOV	L3		;FLOATING UNDERFLOW?
	FI
AS
	SUBI	X1RD,^D38
	JUMPG	X1RD,TRUE		;SCALE VALUE NOT YET USED
L1():!	RETURN
SA
L2():!	;FLOATING OVERFLOW USE MAX NUMBER
	LD	X1RA,[	XWD	377777,777777
			XWD	377777,777777]
	MERR	E,16,<FLOATING OVERFLOW>
	GOTO	L1

L3():!	;FLOATING UNDERFLOW, USE ZERO
	SETZB	X1RA,X1RB
	MERR	E,17,<FLOATING UNDERFLOW>
	GOTO	L1
	EPROC
LSNRDD:	PROC	
	COMMENT /
	PURPOSE:
		;NUMBER ROUTINE PROCEDURE
		;PROCEDURE USED  WHILE SCANNING RADIX INTEGER NUMBER
	ENTRIES:LSNRDD,LSNRDN AND LSNRDS
	INPUT ARGUMENTS: X1RA INTEGER VALUE ,CURRENT 
			X1LBP INPUT CHAR. POINTER IF ENTRY LSNRDD
			X1BYTE INPUT DIGIT IF ENTRY LSNRDN
			X1RB BINARY VALUE OF INPUT  CHAR. IF ENTRY LSNRDS
	NORMAL EXIT: SKIP RETURN IF RADIX CONSTANT OK SO FAR
	ERROR EXIT: RETURN IF OVERFLOW OR INVALID DIGIT
	OUTPUT ARGUMENTS:X1RA  VALUE OF RADIX CONSTANT 			 
	/

L2():!	SCANIG
LSNRDN:	;ENTRY IF RADIX 16 NUMBER AND NOT LETTER
	IFOFF	Z1CHSD
	GOTO	L4				;RETURN IF NOT DIGIT
	LI	X1RB,-"0"(X1BYTE)		;FETCH BINARY VALUE OF DIGIT
LSNRDS:	; ENTRY IF RADIX 16 NUMBER AND LETTER
	IF	CAML	X1RB,YLSVAL
		GOTO	FALSE			;FOUND DIGIT NOT LESS THAN BASE
	THEN	;DIGIT ACCEPTED
		SETONA	YLSNUM			;VALID DIGIT FOUND
		L	X1R1,X1RA
		MUL	X1R1,YLSVAL		;OLD VALUE  *  BASE
		ADD	X1RA,X1RB
		JUMPE	X1R1,L2			;NO OVERFLOW
		CAIE	X1R1,1
		GOTO	L1			;OVERFLOW
		TLO	X1RA,400000		;IF NEGATIVE NUMBER 
		GOTO	L2
	FI	
	SCANNO
	MERRT	E,22,<  X  >,<DIGIT NOT LESS THAN RADIX BASE>
	RETURN
L1():!	;ERROR OVERFLOW
	HRLOI	X1RA,777777			;MAX INTEGER VALUE TO RESULT
	MERR	E,20,<INTEGER OVERFLOW IN RADIX CONS.>
	RETURN

L4():!	;NORMAL EXIT TO 1+RETURN ADDRESS
	POP	XPDP,X1RB
	BRANCH	1(X1RB)		;RETURN
	EPROC
LSNKEY:	PROC
	COMMENT /
	PURPOSE:
		;CALLED FROM LSNR ROUTINE WHEN A RADIX 16 CONSTANT IS SCANNED AND
		;FROM LSI WHEN AN ERROR IS FOUND IN AN OPTIONS STATEMENT
		;SCAN IDENTIFIER IF ANY FOUND AND SIGNAL IF IT IS A KEYWORD

	ENTRIES:LSNKEY SCAN INPUT BEFORE TEST
		LSNKY1 TEST BEFORE SCAN

	INPUT ARGUMENT: X1LBP

	NORMAL EXITS:
		;EXIT TO RETURN ADDRESS IF FIRST CHARACTER IS NOT A LETTER
		;EXIT TO RETURN ADDRESS +1 IF KEYWORD
		;EXIT TO RETURN ADDRESS +2 IF NORMAL IDENTIFIER

	OUTPUT ARGUMENTS:
			;AT EXIT REGISTER X1LBP IS UNCHANGED BUT
			;X1R0 POINTS TO CHAR. AFTER IDENTIFIER IF ONE FOUND

	USED SUBROUTINES: LSIS
	/

	SCANBL			;SCAN PAST BLANKS
LSNKY1:	;ENTRY IF X1LBP SHOULD BE UNCHANGED

	IFOFF	Z1CHSL
	RETURN			;NO LETTER FOUND
	SETZM	,YLSNSD		;PREPARE FOR EXIT
	STACK	X1RA		;SAVE REGISTERS
	STACK	X1LBP
	STACK	X1NXT
	SETONA	YZSE		;NO ADDITION TO DICTIONARY
	EXEC	LSIS		;FIND IDENTIFIER
	AOS	,YLSNSD		;RETURN IF NORMAL IDENTIFIER
	AOS	,YLSNSD		;RETURN IF KEYWORD
	SETOFA	YZSE
	UNSTK	X1NXT
	ST	X1LBP,X1R0	;SAVE NEW X1LBP
	UNSTK	X1LBP
	SCANNO			;RESTORE X1BYTE
	UNSTK	X1RA
	UNSTK	X1R1		;FIND RETURN ADDRESS
	ADD	X1R1,YLSNSD
	BRANCH	0(X1R1)		;RETURN

	EPROC
LSXTXT:	PROC
	COMMENT /
	PURPOSE:
		;CALLED FROM LSX AND LSIPAG 
		;SCAN TEXT CONSTANT
	INPUT ARGUMENTS:
			;X1NXT IS %CONT OR %OPT
			; -X1ID1 CONTAINS MAXIMUM LENGTH TO 
			; BE SCANNED BEFORE RETURN
			;AT ENTRY X1LBP POINTS TO CHARACTER " OR
			;LAST NOT YET TREATED CHAR.
	OUTPUT ARGUMENTS:
			;AT EXIT X1LBP POINTS AT CHAR. " PLUS ONE OR
			;AT EOT OR FIRST NOT YET HANDLED CHAR. IF
			;X1ID1 IS POSITIVE
	USED SUBROUTINES:O1RL OUTPUT TO REL FILE ,EXTERNAL SUBROUTINE
			O1LS1 OUTPUT TO LS1 FILE, EXTERNAL SUBROUTINE
			LSCHIG,LSCHGR 
	/

	STACK	X1CN
	LI	X1CN,5
	BIFNCH	QTEXTQ,L10	;SKIP SCAN PAST "
	SETOFA	YLSENW		;PREVENT SEVERAL WARNINGS FROM SAME TEXT CONSTANT
L1():!	LI 	X1CN,5		;5 CHARACTERS PER WORD
L7():!	SCAN			;NEXT CHAR.
	;SCANIG IS ONLY CALLED IF SPECIAL CHAR.FOUND
	IFON	Z1CHSS
	EXEC	LSCHIG+1	;CHAR ALREADY LOADED
L10():!	IFON	Z1CHST
	GOTO	L4		;CHECK CHARACTER
				;CHARACTER ACCEPTED
L5():!	ROT	X1BYTE,-7
	LSHC	X1ID2,7		;SHIFT SEVEN BIT CHARACTER TO X1ID2
	AOJG	X1ID1,L9	;INCREMENT COUNTER
				;MAXIMUM LENGTH REACHED?
	DECR	X1CN,L7		;CONTINUE
	LSH	X1ID2,1		;BIT35 TO ZERO WORD FILLED
	EXEC	LSXTX1		;OUTPUT WORD
	GOTO	L1		;NEXT WORD
L4():!	;			SPECIAL CHARACTERS TO BE HANDLED

	BIFCHA	QTEXTQ,L3		;END OF TEXT CONSTANT OR CHARACTER DOUBLE QUOTE

	BIFCHA	QCR,L7	;[14] IGNORE <CR> IN TEXT CONSTANTS

	BIFCHA	<";">,<[EXEC	LSSEM
		     GOTO	L5	;SEMICOLON ACCEPTED
		   ]>
	BIFCHA	"'",L5
	BIFCHA	QTAB,<[MERR	E,11,<TAB IN TEXT CONST.>	
		       LI	X1BYTE," "	
		       GOTO	L5		
		     ]>
			;ERROR TAB IN TEXT CONSTANT
			;REPLACE WITH BLANK
	BIFCHA	QEOT,<[MERR	E,6,<EOF IN TEXT CONST.>	
		      GOTO	L8
		     ]>
				;SPECIAL CHARACTERS LEFT
	IF
		IFN	QDEBUG <
		BIFCHA	QTST,FALSE
				>
	THEN	JUMPE	X1NXT,L2		;CALLED AFTER PAGE STRING OVERFLOW,
						;X1LBP MUST POINT TO FIRST CHAR.	
						; ON NEW LINE
						;RETURN WHEN END OF LINE FOUND
		IF
			IFONA	YLSENW
			GOTO	FALSE		;WARNING ALREADY CREATED
		THEN
			MERR	W,3,<END OF LINE IN TEXT CONST.>
			SETONA	YLSENW		;PREVENT MORE WARNINGS
		FI
	FI
	EXEC	LSCHGR
	JUMPE	X1NXT,L2
	GOTO	L7		;NEXT CHARACTER
L3():!	PUSH	XPDP,X1LBP	;SEARCH FOR 			
				;"" ,SAVE BYTE POINTER
	SCANIG
	BIFCHA	QTEXTQ,L6	;"" FOUND
		edit(101)
	SKIPA	;[101]
	LOOP	;[101]
		LOOP	;Skipping illegal char's, blanks, tabs and carr. returns
			SCANIG
		AS
			BIFCHA	" ",TRUE
			CAIE	X1BYTE,QTAB
			CAIN	X1BYTE,QCR
			GOTO	TRUE
		SA
		IF	;Line control character
			CAIE	X1BYTE,QLF
			CAIN	X1BYTE,QFF
			GOTO	TRUE
			BIFNCHA	QVT,FALSE
		THEN	;Handle end of line
			EXEC	LSCHGR
			ST	X1LBP,(XPDP)
		ELSE	;Exit from loop
			SKIPA
		FI
	AS	GOTO	TRUE	;Must be only one instr - see SKIPA above!!!
	SA	;[101]
	IF	;[101] text quote found now
		BIFNCHA	QTEXTQ,FALSE
	THEN	;Go on with text constant
					edit(164)
		POP	XPDP,X1R0	;[164] DUMMY POP
		GOTO 	L7		;[164] CHECK CHARACTER
	FI	;[101]
	UNSTK	X1LBP	;RESTORE
	SCANNO
	GOTO	L2		;TRUE END OF TEXT CONSTANT
L6():!	LI	X1BYTE,QTEXTQ	;REPLACE "" WITH "
	POP	XPDP,X1R0	;DUMMY POP
	GOTO	L5
L2():!	;			END OF TEXT CONSTANT FOUND
	SCAN			;POINT TO NEXT CHARACTER
L8():!	;			;EOT EXIT
L9():!	;MAX LENGTH EXIT
	IF	CAIN	X1CN,5
		GOTO	FALSE		;LAST WORD FILLED
	THEN	LSH	X1ID2,7		;FILL WITH ASCII NULLS
		DECR	X1CN,TRUE
		LSH	X1ID2,1		;BIT 35 TO 0
		EXEC	LSXTX1		;OUTPUT LAST WORD

	FI
	UNSTK	X1CN
	RETURN
	EPROC
	
LSXTX1:	PROC
	;ONLY CALLED FROM LSXTXT
	;OUTPUT WORD TO REL FILE OR LIST FILE

	L	XLSTXT,X1ID2		;OUTPUT ARGUMENT IN PARAMETER ACC.
	IF	BIFLEX	%CONT,FALSE		;TEXT CONSTANT HANDLED?
	THEN	;PAGE SWITCH STRING
		IF	JUMPE	X1NXT,FALSE	;NO OUTPUT AFTER LENGTH OVERFLOW
		THEN	PUTLS1			;WORD TO LIST FILE
		FI
	ELSE
		EXEC	O1RL			;WORD TO REL FILE
	FI
	RETURN
	EPROC
	SUBTTL	LS MAIN ,CHARACTER ROUTINES


	COMMENTS ;
	PURPOSE:
		LS IS THE ENTRY POINT TO THE LEXICAL SCANNER SUBROUTINE
		LS SCANS THE INPUT CHARACTERS AND USES THE Z1CH TABLE AS A
		BRANCH TABLE. Z1CH HAS ONE ENTRY FOR EACH CHARACTER AND THE
		LSLOP AND LSB ENTRIES ARE USED WHEN AN INPUT CHARACTER
		STARTS A NEW SYNTACTICAL UNIT.
		LS MAIN IS DIVIDED INTO:
		CHARACTER ROUTINES LSNU,LSB,LSDA,LSDB,LSDC,LSDD,LSDE,LSDF,LSDG,LSDH,
				   LSDI,LSDL,LSDM,LSDN,LSDO,LSDP,LSDR,LSDF,LSDS,LSE,
				   LSL,LSF,LSFP AND LST
		IDENTIFIER ROUTINE LSI
		COMMENT ROUTINES LSEND AND LSK
		CONSTANT ROUTINES  LSC AND LSX
		NUMBER ROUTINES LSN, LSDT, LSNPR AND LSDK
		
	;
;START LEXICAL SCANNER

LS:	PROC
IFN	QDEBUG<
				;CREATE DEBUG OUTPUT ,OUTPUT X1NXT RESULTING SYMBOL
	EXEC	LSDEB

	IFONA	TRLS
	EXEC	LSTRAC
	RETURN
	EPROC
LSDEB:	PROC
	>

	;ENTRY POINT.AT ENTRY BUFFER POINTER X1LBP POINTS AT A CHARACTER
	;THAT HAS NOT YET BEEN TREATED BY  LS.
	L	X1CUR,X1NXT	;CURRENT SYMBOL IS NOW PREVIOUS NEXT SYMBOL
	;UPDATE LINE NUMBER AND SEMICOLON COUNTERS
	LD	X1R0,YLSNLS	;NEXT + CURRENT TO 
	STD	X1R0,YLSCLS	;CURRENT + LAST

	IFONA	YLSEND	
	GOTO LSEND		;SCAN REST OF END COMMENT
				;OR HANDLE EOF
				;OR HANDLE GO TO
LSLOP:
				;START NEW SYNTACTIC ENTITY, X1LBP ALREADY MOVED
	SCANNO
	GOTO	@Z1CH(X1BYTE)	;GOTO CHARACTER ROUTINE

LSNU:	;			NULL AND DELETE CHARACTERS
LSB:	;			SPACE AND TAB CHARACTERS
				;START NEW SYNTACTIC ENTITY, SKIP CURRENT CHARACTER
	SCAN
				edit(262)	;[262]
LSB1:	GOTO	@Z1CH(X1BYTE)	;GO TO CHARACTER ROUTINE


LSDA:	; , FOUND
	LI	X1NXT,%COMMA
	RETIBP			;EXIT  LS
	
LSDB:	;SEMICOLON FOUND
	LI	X1NXT,%SEMIC
	EXEC	LSSEM		;UPDATE SEMICOLON COUNTER
	RETIBP			;EXIT LS

LSDC:	; ( FOUND
	LI	X1NXT,%LP
	RETIBP			;EXIT LS

LSDD:	; )FOUND
	LI	X1NXT,%RP
	RETIBP			;EXIT LS

LSDE:	; LBRAC FOUND
	LI	X1NXT,%LB
	RETIBP			;EXIT LS
 
LSDF:	; RBRAC FOUND
	LI X1NXT,%RB
	RETIBP			;EXIT LS

LSDG:	; + FOUND
	LI	X1NXT,%PLUS
	RETIBP			;EXIT LS

LSDH:	; - FOUND
	LI	X1NXT,%MINUS
	RETIBP			;EXIT LS

LSDI:	; ^ FOUND
	LI	X1NXT,%POW
	RETIBP			;EXIT LS

LSDL:	; =FOUND
	SCANIG
	IF	BIFNCHA	"=",FALSE
	THEN	LI	X1NXT,%DEQ	; == FOUND
		RETIBP			;EXIT LS
	FI
	IF	BIFNCHA	"/",FALSE
	THEN	SCANIG
		LI	X1NXT,%NDEQ	;ASSUME =/=
		IF	BIFNCHA	"=",FALSE
		THEN
			RETIBP		;EXIT LS
		FI	;CREATE ERROR = MUST FOLLOW =/
		MERR	E,0,<= MUST FOLLOW =/>
		RETURN			;EXIT LS  WITH =/=
	FI	LI	X1NXT,%EQ	; = FOUND
		RETURN			; EXIT LS

LSDM:	; : FOUND
	SCANIG
	IF	BIFNCHA	"=",FALSE
	THEN	LI	X1NXT,%BECOM	;ASSIGN FOUND
		RETIBP			;EXIT LS  WITH ==
	FI
	IF	BIFNCHA	"-",FALSE
	THEN	LI	X1NXT,%DENOT	;DENOTES FOUND
		RETIBP			;EXIT LS
	FI	LI	X1NXT,%COLON	;COLON FOUND
		RETURN			;EXIT LS

LSDN:	;< FOUND
	SCANIG
	IF	BIFNCHA	"=",FALSE
	THEN	LI	X1NXT,%NGRT	; <= FOUND
		RETIBP			;EXIT LS
	FI	LI	X1NXT,%LESS	; < FOUND
		RETURN			;EXIT LS

LSDO:	; > FOUND
	SCANIG
	IF	BIFNCHA	"=",FALSE
	THEN	LI	X1NXT,%NLESS	; >= FOUND
		RETIBP			;EXIT LS
	FI	LI	X1NXT,%GRT	; > FOUND
		RETURN			; EXIT LS

LSDP:	; \ FOUND,BACKSLASH
	SCANIG
	IF	BIFNCHA	"=",FALSE
	THEN	LI	X1NXT,%NEQ	;\= FOUND
		RETIBP			;EXIT LS
	FI	LI	X1NXT,%NOT	; SINGLE \ FOUND
		RETURN			;EXIT LS

LSDR:	; / FOUND
	SCANIG
	IF	BIFNCHA	"/",FALSE
	THEN	LI	X1NXT,%IDIV	; // FOUND
		RETIBP			;EXIT LS
	FI	LI	X1NXT,%DIV	; SINGLE / FOUND
		RETURN			;EXIT LS

LSDS:	; * FOUND
	SCANIG
	BIFCHA	"*",LSDI		; ** FOUND
	LI	X1NXT,%MULT		; SINGLE * FOUND
	RETURN				;EXIT LS

LSE:	; EOT FOUND
	EXEC	LCEOF		;CALL LC TO SHOW EOF
	GOTO	LSF		; IF UNKNOWN EOF
	SKIPA			;TRUE EOF
	GOTO	LSLOP		; IF MORE SOURCE FILES
				;CONTINUE SCANNING

	LI	X1NXT,%EOF	;RETURN EOT
	SETONA	YLSEND		;INDICATE EOF RETURNED TO ENABLE LS
				;TO FIND ONE EXTRA ENTRY FROM SR AFTER EOF
	RETURN			;EXIT LS

LSL:	; VT,LF OR FF FOUND
	EXEC	 LC		;HANDLE  NEW  LINE
	ZF	YLSNSEM
	edit(262)
	LOOP	;[262]
		SCAN
	AS	JUMPE	X1BYTE,TRUE
	SA
	CAIE	X1BYTE,"%"
	 BRANCH	 LSB1	;Handle first char of line proper

LSLPRC:	;[262] Percent found at start of line, ignore the line!

	MERR	W,23,<% at start of line>

	LOOP	;Over characters in line
		SCAN
	AS	;Long as no end-of-line char is found
		HRRZ	Z1CH(X1BYTE)
		CAIE	LSL
		 GOTO	 TRUE
	SA

	GOTO	LSL

LSF:
				;CREATE ERROR
	EXEC	LSCHN1		;NONPRINTABLE CHAR
	GOTO	LSB	

LSFP:				;ILLEGAL CHARACTER 
		edit(262)
	IF	;[262] Percent (%)
		CAIE	X1BYTE,"%"
		GOTO	FALSE
	THEN	;Check for start of line
		L	YLCLBS##
		ADDI	1
		LOOP
			ILDB	X1BYTE,
		AS
			JUMPE	X1BYTE,TRUE
		SA
		CAMN	X1LBP
		 GOTO	 LSLPRC
	FI
	MERRT	E,2,<  X  >,<ILLEGAL PRINTABLE CHAR.>
	GOTO	LSB		;SCAN NEXT CHARACTER
	IFN	QDEBUG<		;ONLY IF TEST VERSION
		BEGIN

LST:	; ^^ USED FOR TESTING PURPOUSES
	EXEC	LSTPRO		;CALL  TEST HANDLING  ROUTINE
	BRANCH	LSB		;HANDLE NEXT CHARACTER
LSTPRO:	;PROC		;LOCAL SUBROUTINE

	STACK	X1R1
	STACK	X1ID1
	STACK	X1ID2

	LI	X1ID2,0		;TEST VALUE REGISTER
	EXEC	LSTNXT		;FIND NEXT CHARACTER
	LSHC	X1ID2,6
	EXEC	LSTNXT		;FIND SECOND CHARACTER  LETTER
	LSHC	X1ID2,6		;SIXBIT FROM SECOND CHARACTER
	EXEC	LSTNXT		;FIND SIXBIT DIGIT
	LSHC	X1ID2,6		;SIXBIT  FROM DIGIT

;HANDLE TEST TABLES TEST VALUE IN X1ID2
	;HANDLE LSTT1
	LI	X1R1,LSTT1E-LSTT1
L2():	IF	HLRZ	X1ID1,LSTT1(X1R1)		;FETCH TABLE VALUE
		CAME	X1ID1,X1ID2
		GOTO	FALSE		;NO MATCH CONTINUE
	THEN	HRLZ	X1R1,LSTT1(X1R1)	;FETCH MASK FROM TABLE
		IORM	X1R1,X1MASK		;SET BITS ON IN X1MASK 
		GOTO	L10		;EXIT 
	FI	SOJGE	X1R1,L2		;CONTINUE
	;HANDLE LSTT2
	LI	X1R1,LSTT2E-LSTT2
L3():	IF	HLRZ	X1ID1,LSTT2(X1R1)		;FETCH TABLE VALUE
		CAME	X1ID1,X1ID2
		GOTO	FALSE	;NO MATCH
	THEN	HRLO	X1R1,LSTT2(X1R1)	;FETCH MASK FROM TABLE
		ANDM	X1R1,X1MASK		;SET BITS OFF IN X1MASK
		GOTO	L10
	FI	SOJGE	X1R1,L3

	;HANDLE LSTT3
	LI	X1R1,LSTT3E-LSTT3
L4():	IF	HLRZ	X1ID1,LSTT3(X1R1)
		CAME	X1ID1,X1ID2
	GOTO	FALSE
	THEN	HRRZ	X1R1,LSTT3(X1R1)
	PUSHJ	XPDP,0(X1R1)		;EXEC	DEBUG ROUTINE
	GOTO	L10
	FI	SOJGE	X1R1,L4

;	NO MATCH FOUND 
	LI	X1SR0,%DEBUG
	PUTIC1	X1SR0
	PUTIC1	X1ID2
	
L10():	UNSTK	X1ID2
	UNSTK	X1ID1
	UNSTK	X1R1
	RETURN

	;DUMMY EPROC


;LOCAL SUBROUTINE
LSTNXT:	;	PROC
;		RETURNS SIXBIT VALUE IN X1LEX
	SCANIG
	IFOFF	Z1CHSI
	GOTO	L1
	L	X1LEX,Z1CH(X1BYTE)	;SIXBIT VALUE TO REGISTER
	RETURN
L1():	MERRT	W,11,<  X  >,<CHAR. AFTER TEST NOT VALID>
	LI	X1LEX,0		;0 ASSUMED
	RETURN
	;	EPROC

;TEST TABLES
ZLSTT1:	;DOCUMENTATION NAME
LSTT1:	;SET SWITCH IN X1MASK ON IF MATCH
	XWD	'LS1',20
				;NOTE !
				;ENTRIES SD1,SR1,O11 SHOULD BE DELETED
				;THESE SWITCHES ARE NEVER USED 
	XWD	'SD1',100
	XWD	'SR1',1
	XWD	'O11',2
	XWD	'IC1',4
	XWD	'DF1',10
LSTT1E:	0			;LAST ENTRY
ZLSTT2:	;DOCUMENTATION NAME
LSTT2:	;SET OFF SWITCH IN X1MASK
				;NOTE !
				;ENTRIES SR0,SD0,O10 SHOULD BE DELETED
				;THESE ENTRIES ARE NEVER USED
	XWD	'SR0',-1-1
	XWD	'SD0',-1-100
	XWD	'O10',-1-2
LSTT2E:	XWD	'LS0',-1-20
				;LAST ENTRY
ZLSTT3:		;NAME IN DOCUMENTATION
LSTT3:	;EXECUTE DEBUG ROUTINE
	XWD	-1,-1		;DUMMY ENTRY
LSTT3E:	XWD	-1,-1
	ENDD
>
	SUBTTL	LS MAIN,IDENTIFIER ROUTINE

	BEGIN
	COMMENTS ;
	PURPOSES:
		THE ROUTINE LSI HANDLES AN IDENTIFIER
		IT IS ENTERED WHEN LETTER IS FOUND
		THE SPECIAL KEYWORDS BEGIN,END,COMMENT,GO,TO AND OPTIONS ARE RECOGNIZED
		LSI RETURNS THE IDENTIFIER NUMBER OR KEYWORD SYMBOL TO SR EXCEPT FOR
		 TO,COMMENT AND THE OPTIONS KEYWORDS WHICH ARE NOT KNOWN TO SR
	USED ROUTINES: LSIS,LSIOS2,LSIOS1,LSNKY1 AND LSLOP (INTERNAL LS SUBROUTINES)
			I1SW SWITCH ROUTINE IN I1 (EXTERNAL ROUTINE)


	;

LSI:	EXEC	LSIS		;LOCATE IDENTIFIER
	RETURN			;FROM LSIS IF IDENTIFIER , EXIT LS
				;FROM LSIS IF KEYWORD
	SUBI	X1NXT,QLRESW-QNRESW+1
	WLF	(X1R0)  Z1RWKL(X1NXT)	;LOAD BOTH SYNTAX SYMBOL AND SWITCHES
	LF	(X1NXT)  Z1RWKL(X1NXT)	;LOAD RETURN SYMBOL
LSI1:	;ENTRY FROM END COMMENT HANDLING
	; WHEN TERMINATING KEYWORD FOUND
	IFOFFA	Z1RWSM
	RETURN				;EXIT LS IF NO SPECIAL LS PROCESSING


;SPECIAL RESERVED WORD FOUND BEGIN,END,COMMENT,GO,TO,OPTIONS

	IF	BIFNLEX	%BEGIN,FALSE
	THEN	;BEGIN 
		HRLZI	X0,QLSRT2	;BEGIN RECORD
		EXEC	LCLS1

		AOS	,YBEGNO		;COUNT NUMBER OF BEGINS
					;USED IN PASS 3
		RETURN			;EXIT LS
	FI
	IF	BIFNLEX	%END,FALSE
	THEN	;END 
		HRLZI	X0,QLSRT3	;END RECORD
		EXEC	LCLS1		;CREATE LS1 RECORD

		SETONA	YLSEND		;SET ON SWITCH FOR END COMMENT HANDLING
		RETURN			;EXIT LS
	FI

	BIFLEX	%COMM,LSK1		;HANDLE COMMENT
	IF	BIFNLEX	%OPT,FALSE
	THEN	;HANDLE OPTIONS STATEMENT
	
		BEGIN
		SETOFA	YLSENW			;NO SWITCH FOUND
		EXEC	LSIOS2			;SCAN
		IF	GOTO	TRUE		;RETURN REST OF CHAR.
			GOTO	FALSE		; ; FOUND
			GOTO	FALSE		; / FOUND
		THEN
			BIFCHA	"(",L1	
		FI
	
		MERRT	W,6,< X, (>,<INVALID CHAR. X,( EXPECTED IN OPTION>
		GOTO	L9		;SCAN UNTIL / OR ;OR KEYWORD
	L1():
		SCANBL
	L3():	EXEC	LSIOS2		;SCAN 
		GOTO	L6		;RETURN REST OF CHAR.
		GOTO	L4		;RETURN IF ; FOUND
					;RETURN IF / FOUND
	L8():	SETONA	YLSENW		;INDICATE START OF SWITCH FOUND
		
		ST	X1LBP,X1R3		;PREPARE POINTER 
		SETONA	YI1OPT		;FLAG OPTIONS TO I1SW
		EXEC	I1SW		;CALL I1SW TO TREAT ONE SWITCH

					;ERROR RETURN FROM I1SW OR LSIPAG
		GOTO	[	ST	X1R3,X1LBP
				SCANNO
				GOTO	L9				
			]

					;NORMAL RETURN FROM I1SW OR LSIPAG
		ST	X1R3,X1LBP	;UPDATE POINTER
		SCANNO
		GOTO	L3		;SCAN AND TEST NEXT CHARACTER

	L4():	MERRT	W,6,< X, )>,<INVALID CHAR. X, ) EXPECTED IN OPTION>
		BRANCH	L9		;END OF OPTION STMT CONTINUE
	L6():	IF	BIFNCH	")",FALSE
		THEN	EXEC	LSIOS1
			IF	GOTO	FALSE		;REST OF CHAR.
				GOTO	TRUE		; ; FOUND
				GOTO	FALSE		; / FOUND
			THEN
				IFONA	YLSENW
				BRANCH	LSB		;NORMAL RETURN FROM OPTIONS 
							;STATEMENT, NO ERRORS
				MERR	W,7,<SWITCH MISSING FROM OPTIONS STMT>
				BRANCH	LSB
			FI
			MERRT	W,6,< X, ;>,<INVALID CHAR. X,; EXPECTED IN OPTION>
			GOTO	L9
		FI

		MERRT	W,6,< X, />,<INVALID CHAR. X,/ EXPECTED IN OPTION>
	L9():	;SCAN TO / OR ; OR KEYWORD
		EXEC	LSIOS2
		GOTO	L7			;CHAR. NOT RECOGNIZED
		BRANCH	LSB			;RETURN IF ;
		GOTO	L8			;RETURN IF / ,CONTINUE NEW SWITCH

	L7():	;CHECK IF KEYWORD
		EXEC	LSNKY1		
		GOTO	L5			;RETURN IF NOT LETTER
		BRANCH	LSLOP			;RETURN IF KEYWORD
						;STOP SCANNING OPTION AND
						;FIND KEYWORD AGAIN
		ST	X1R0,X1LBP		;RETURN IF IDENTIFIER
						;SKIP IDENTIFIER
		SCANNO				;RESTORE X1BYTE
		GOTO	L9			;CONTINUE SCANNING
	L5():	SCANBL
		GOTO	L9
		ENDD
	FI

	;HANDLE GO AND TO

	IF	BIFLEX	%GO,FALSE
	THEN	;TO FOUND
	ASSERT	<IF	BIFLEX	%TO,FALSE
		THEN	RFAIL	(LSI NOT TO )
		FI>
	
		POP	XPDP,X1R0	;FIND RETURN FROM LS ADDRESS
		HRRZ	X1R0,X1R0	;ZERO LEFT PART
		CAIN	X1R0,LSI3
		GOTO	LSLOP		;GO WAS JUST FOUND
					;DUMMY RETURN DELETED
		PUSH	XPDP,X1R0	;RESTORE TRUE RETURN ADDRESS
		MERR	E,4,<GO MISSING BEFORE TO>
		BRANCH	LSLOP		;IGNORE TO AND CONTINUE
	FI	
	
	
	; GO FOUND ,RETURN GOTO SYMBOL

	LI	X1NXT,%GOTO	;GOTO ASSUMED
	SETONA	YLSEND		;INDICATE THAT TO MUST FOLLOW
	RETURN			;EXIT LS

LSI2:	;ENTRY WHEN TO MUST FOLLOW
	;BRANCH FROM LSEND VIA LS START
	SETOFA	YLSEND
	EXEC	LSLOP		;DUMMY CALL TO FORCE RETURN 
				;HERE AFTER NEXT LEXEME FOUND
				;IF TO WAS FOUND THIS DUMMY RETURN
				;HAS BEEN DELETED
LSI3:	;RETURN ADDRESS IN STACK
	MERR	E,3,<GO NOT FOLLOWED BY TO>
	RETURN			;EXIT LS


	ENDD
	SUBTTL	LS MAIN,COMMENT ROUTINES

LSEND:	;HANDLE END COMMENT

	IF
		BIFLEX	%END,FALSE		;TRUE END COMMENT
	THEN
		BIFLEX	%GOTO,LSI2		;TO MUST FOLLOW

		CAIN	X1NXT,%EOF
		RETURN				;EXIT LS IF EOF WAS RETURNED LAST TIME
	FI


	SETOFA	YLSEND
	BEGIN
	SETOFA	YLSENW		;ONLY ONE WARNING PER ENDCOMMENT
	SCANNO			;LOAD X1BYTE
	SKIPA			;X1BYTE ALREADY LOADED
    LOOP
	SCAN
L5():AS
	IFOFF	Z1CHSL
	GOTO	L1		;NOT START OF IDENTIFIER
	SETONA	YZSE		;INDICATE NO ADDITION TO DICTIONARY

	EXEC	LSIS		;FIND IDENTIFIER
	GOTO	L5		;NO RESERVED WORD CONTINUE

	;RESERVED WORD FOUND

	SUBI	X1NXT,QLRESW-QNRESW+1
	WLF	(X1R0) Z1RWKL(X1NXT)	;LOAD SWITCHES
	LF	(X1NXT) Z1RWKL(X1NXT)	;LOAD LEXEME
	IFOFFA	Z1RWSE
	GOTO	L5		;RESERVED WORD NOT RECOGNIZED IN END COMMENT
	BIFLEX	%GOTO,L3+1	;WARNING IF GOTO FOUND
	SETOFA	YZSE
	GOTO	LSI1		;END COMMENT TERMINATED HANDLE RESERVED WORD FOUND
				;EXIT LSEND
L1():	; ANY CHAR BUT LETTER

	IFOFF	Z1CHSE		
	GOTO	TRUE			;CONTINUE IF NOT MARKED IN END COMMENT
	SETOFA	YZSE
	BIFCHA	<";">,<LSDB	>	;SEMICOLON FOUND END OF COMMENT
					;EXIT LSEND AND SKIP  ;

	BIFCHA	QEOT,LSE		;EOT IN END COMMENT
					;EXIT LSEND  AND TREAT EOT
	BIFCHA	"(",L3		;PRODUCE WARNING IF ( FOUND
	BIFCHA	":",L4		;MAY BE WARNING
	EXEC	LSCHGR		;TREAT SPECIAL CHARACTERS
	GOTO	TRUE		;CONTINUE
L4():	SCANIG	
	BIFCHA	"=",L3		;:= PRODUCE WARNING
	BIFCHA	"-",L3		;:- FOUND WARNING
	GOTO L5			; CONTINUE SCAN ALREADY DONE
L3():	;GENERATE WARNNING IF  FIRST ENTRY
	SCAN				;SKIP SCAN IF GOTO FOUND
	IFONA	YLSENW
	GOTO L5				;CONTINUE
	MERR	W,2,<END COMMENT WARNING>
	SETONA	YLSENW		;NO MORE WARNINGS
	GOTO L5
    SA
	ENDD


	;COMMENT ROUTINE

LSK:	; ! FOUND
	LOOP SCAN
	AS
LSK1:	;HANDLE COMMENT KEYWORD X1BYTE ALREADY LOADED
	IFOFF	Z1CHSC
	GOTO	TRUE		;CHARACTER NOT RECOGNIZED IN COMMENT
	BIFCHA	<";">,<[	EXEC	LSSEM
			BRANCH	LSB	;END OF COMMENT FOUND , EXIT LSK
		    ]>
	;SPECIAL CHARACTERS
	BIFCHA	QEOT,<[	MERR	E,5,<EOF IN COMMENT>
			GOTO	LSE		
		     ]>
	EXEC	LSCHGR	;HANDLE SPECIAL CHARACTERS
	GOTO TRUE
	SA
	SUBTTL	LS MAIN,CONSTANT ROUTINES


	BEGIN
LSC:			;HANDLE CHARACTER CONSTANT
	SCANIG
	LI	X1NXT,%CONC		;RETURN SYMBOL
L1():	IF	IFOFF	Z1CHST
		GOTO	FALSE		;ACCEPT CHARACTER
	THEN	BIFCHA	QTAB,L2
		IFOFF	Z1CHSE
		GOTO	FALSE		;IS IT ' OR "  ,YES CONTINUE
		BIFCHA	<";">,<[EXEC	LSSEM
			     GOTO	FALSE]>		;ACCEPT SEMICOLON
		BIFCHA	QEOT,<[
				MERR	E,7,<CHARACTER QUOTE MISSING>
				BRANCH	LSLOP
				]>
					;ERROR 	CHARACTER QUOTE MISSING

		EXEC	LSCHGR		;HANDLE TEST AND LINE CONTROL
					;CHARACTERS
	L2():	MERR	E,10,<LC CHAR. IN CONSTANT>
		LI	X1BYTE," "	;BLANK CHARACTER
	FI				;ACCEPT CHARACTER

	ST	X1BYTE,YLSVAL		;RETURN VALUE
	SCANIG
	IF	BIFCHA	"'",FALSE
	THEN	MERR	E,7,<CHARACTER QUOTE MISSING>
		RETURN
	FI	RETIBP			;EXIT LS
	ENDD
LSX:		;HANDLE TEXT CONSTANT



	L	X1R1,YREL	
	SUBI	X1R1,2			;TEXT CONSTANT ADDRESS
	HRLM	X1R1,YLSVAL		;STORE ADDRESS IN RETURN VALUE
	LI	X1NXT,%CONT		;RETURN TEXT CONSTANT
LSX001:	HRROI	X1ID1,-1B20		;MAX LENGTH IS 2^15
	EXEC	LSXTXT			;SCAN UNTIL END OF TEXT STRING
	IF	JUMPG	X1ID1,[MERR	E,12,<TEXT CONSTANT LONGER THAN 2^15>
				GOTO	LSX001	;CONTINUE SCANNING
				]
	THEN	ADDI	X1ID1,1B20
		HRRM	X1ID1,YLSVAL		;STORE TEXT LENGTH  IN RETURN VALUE 
						;VARIABLE
		RETURN				;EXIT LS

	FI
	
	SUBTTL	LS MAIN, ARITHMETIC CONSTANTS ROUTINES

	COMMENTS ;
	PURPOSES:SCAN THE ARITHMETIC CONSTANTS AND CONVERT THEM TO
		INTERNAL FORM : FIXED BINARY, FLOATING NUMBER OR DOUBLE FLOATING NUMBER
	METHOD:
		THE NUMBER CONSTANT IS SCANNED WITH ABOUT THE SAME METHOD THAT IS USED
		IN THE ALGOL COMPILER.
		THE NUMBER IS TREATED AS AN INTEGER UNTIL EITHER AN OVERFLOW OCCURS
		OR  AN EXPONENT IS FOUND.
		THEN IT IS CONVERTED TO A DOUBLE FLOATING NUMBER.
		AFTER THE END OF THE NUMBER IS FOUND (ANY CHARACTER EXCEPT BLANK, DIGIT
		POINT OR & ) ANY INTEGER IS CONVERTED TO A FLOATING NUMBER (SHORT REAL)
		IF IT CONTAINED A DECIMAL POINT AND ALL DOUBLE FLOATING VALUES ARE
		CONVERTED TO FLOATING NUMBERS (SHORT REAL) EXCEPT TRUE ONES (LONG REAL),
		WHICH CONTAINED A DOUBLE EXPONENT ( && ).
		THE VALUE IS PLACED IN YLSVAL AND
		THE SYMBOL CONI, CONR, CONLR IS RETURNED IN X1NXT
		BEFORE RETURNING AN INTEGER TO SR A CHECK IS MADE TO DETECT IF IT IS A 
		RADIX CONSTANT. LSNR HANDLES  A RADIX CONSTANT.

	;


LSDK:	; . FOUND ,START OF NUMBER OR SINGLE .
	SCANIG
	IFON	Z1CHSD
	GOTO 	LSNDT		;DECIMAL POINT IF DIGIT FOLLOWS


	LI	X1NXT,%DOT	;RETURN DOT
	RETURN			;EXIT LS


LSNDT:	LI	X1RD,^D10	
	ST	X1RD,YLSNPM		;SET DECIMAL POINT MARKER
	GOTO	LSN+1			;SKIP SET ZERO TO YLSNPM

LSN:	;DIGIT FOUND PROCESS NUMBER

	SETZM	YLSNPM			;CLEAR DECIMAL POINT
	LI	X1RD,^D9		;READ FIRST 9 DIGITS WITHOUT OVERFLOV CHECK
	LI	X1RA,-"0"(X1BYTE)	;CONVERT FIRST CHARACTER TO BINARY VALUE
	ST	X1RA,YLSNSD		;SAVE FIRST DIGIT ,USED FOR CHECKING RADIX
					; CONSTANTS


	SETOFA	YLSNUM			;NUMBER NOT YET CONVERTED TO LONG REAL
	BEGIN	;MAIN LOOP FOR SCANNING NUMBER


	;SCAN FIRST TEN DIGITS WITH FAST LOOP
L1():	SCAN
	IF	IFON	Z1CHSD
		GOTO	FALSE		;DIGIT?
	THEN	IFON	Z1CHSI
		GOTO	L4		;IF LETTER
		LF	(X1LEX) Z1CHI(X1BYTE)	;LOAD INDEX
		GOTO	@LSNT1(X1LEX)		;TO RELEVANT ROUTINE
	FI				;DIGIT FOUND
	IMULI	X1RA,^D10		;MULTIPLY PREVIOUS VALUE BY 10
	ADDI	X1RA,-"0"(X1BYTE)	;ADD NEW DIGIT
	DECR	X1RD,L1			;NEXT CHARACTER

;	NUMBER IS LONGER THAN TEN DIGITS OVERFLOW CHECK NECESSARY
	LI	X1RD,30000		;SET NEW INDEX ,USED FOR DECIMAL POINT
					; CALCULATIONS
	SKIPE	,YLSNPM			;
	ADDM	X1RD,YLSNPM		;UPDATE MARKER IF DECIMAL POINT FOUND

L8():	;LOOP  THAT COLLECTS DIGITS IN INTEGER VALUE FORM UNTIL OVERFLOW
	;AND AFTER THAT IN DOUBLE FLOTING FORM
	SCAN
	IF	IFON	Z1CHSD
		GOTO	FALSE
	THEN	IFON	Z1CHSI
		GOTO	L4
		LF	(X1LEX) Z1CHI(X1BYTE)
		GOTO	@LSNT1(X1LEX)


	FI					;DIGIT FOUND
	JFCL	17,.+1				;CLEAR FLAGS
	IF	IFONA	YLSNUM
		GOTO 	FALSE			;HANDLE LONG REAL NUMBER
	THEN					;INTEGER LONGER THAN TEN DIGITS
		ST	X1RA,YLSNSD		;MAKE SPARE COPY IN CASE OF OVERFLOV
		IMULI	X1RA,^D10
		ADDI	X1RA,-"0"(X1BYTE)	;CALCULATE NEW VALUE
	IF	JOV	FALSE
		JUMPL	X1RA,FALSE		;OUT IF OVERFLOW
	THEN	DECR	X1RD,L8			;X1RD NEVER ZERO MAX 135 CHARACTERS 
	ASSERT<	RFAIL	(LSN	ERR1)>
	FI	;INTEGER OVERFLOW CONVERT TO LONG REAL
		L	X1RA,YLSNSD	;RESTORE SAVED VALUE
		EXEC	LSNCO		;CONVERT INTEGER
;		GOTO	FALSE		;NEXT INSTRUCTION


	FI	;DIGIT FOUND  VALUE CONVERTED TO LONG REAL
	IFN	QKA10,<;ROUTINE DEPENDENT ON DOUBLE FLOATING INSTRUCTIONS
>
	IFONA	YLSENW
	GOTO	L2			;OVERFLOW HAS OCCURRED
	STD	X1RA,YLSNSD		;SAVE OLD VALUE IN CASE OF OVERFLOW
	DFMP	X1RA,[
	XWD	204500,000000
	XWD	0,0		]	;VALUE * FLOATING TEN
	L	X1R0,LSNFT-"0"(X1BYTE)	;FIND LEFT PART     FLOATING DIGIT
	SETZ	X1R1,
	DFAD	X1RA,X1R0		;ADD NEW DIGIT
	JFOV	.+2			;
	DECR	X1RD,L8			;CONTINUE WITH NEXT CHARACTER
	;OVERFLOW OCCURRED
	SETONA	YLSENW			;INDICATE OVERFLOW
	LD	X1RA,YLSNSD		;RESTORE PREVIOUS VALUE
	SETZM	,YLSNSD
L2():	AOS	,YLSNSD			;COUNTER FOR DIGITS AFTER OVERFLOW
	DECR	X1RD,L8			;CONTINUE


	;BRANCH TABLE FOR NUMBER ROUTINE
LSNT1:	L4
	L3
	L6
	L7
	L9
	L10
	L4
	L4
L6():	;DOT FOUND
	IF	SKIPN	,YLSNPM
		GOTO	FALSE		;FIRST DECIMAL POINT
	THEN				;MORE THAN ONE DECIMAL POINT FOUND
		MERR	E,13,<MORE THAN ONE DECIMAL POINT>
		GOTO	L3		;IGNORE EXTRA DECIMAL POINT CONTINUE
	FI	
	ST	X1RD,YLSNPM		;UPDATE DECIMAL POINT MARKER
	CAIG	X1RD,^D10
	GOTO	L1			;CONTINUE FAST LOOP
	EXEC	LSNCO			;CONVERT FROM INTEGER TO DOUBLE FLOATING
					;IF NECESSARY
	GOTO	L8			;NEXT CHARACTER

L10():	;ILLEGAL PRINTABLE CHARACTER
	SCANNO
	MERRT	E,2,<  X  >,<ILLEGAL PRINTABLE CHAR.>

L3():	;BLANK CHARACTERS
	CAIG	X1RD,^D10		;FIRST TEN DIGITS HANDLED
	GOTO	L1			;NO,CONTINUE FAST LOOP
	GOTO	L8			;CONTINUE OTHER LOOP

L7():	;& FOUND ,START EXPONENT
	EXEC	LSNDL			;CHECK THAT DOT WAS NOT LAST CHARACTER
	EXEC	LSNCO			;CONVERT IF NECESSARY
	SCANBL
	IF	BIFCHA	"&",FALSE	;&& FOUND
	THEN	;SHORT REAL NUMBER
		EXEC	LSNEXP		;SCAN EXPONENT
L5():	;HANDLE SHORT REAL NUMBER
		EXEC	LSNSCE		;SCALE VALUE
		LI	X1NXT,%CONR	;RETURN SHORT REAL CONSTANT


		REPEAT 0,<	;[15] ROUNDING REMOVED
		IF	JOV	FALSE	;FLAG SET IN LSNSCE ROUTINE IF
					;OVERFLOW OR UNDERFLOW OCCURRED
		THEN			;ROUND NUMBER IF NO OVERFLOW
			IFN	QKA10,<;ROUTINE DEPENDENT ON DOUBLE FLOATING INSTRUCTIONS
>

			TLNN	X1RB,200000
			GOTO	FALSE		;ROUNDING
						; NOT NEEDED
			ADDI	X1RA,1
			TLO	X1RA,000400	;MAKE SURE BIT9 IS SET ON
			JUMPGE	X1RA,FALSE		;NO OVERFLOW WHILE ROUNDING
						; NUMBER
			MERR	E,16,<FLOATING OVERFLOW>
			L	X1RA,[XWD	377777,777777]
						;FILL IN MAX NUMBER
		FI

		>	;END REPEAT 0	;[15]

		ST	X1RA,YLSVAL		;FILL IN RETURN VALUE

		RETURN			;EXIT LS

	FI	;LONG REAL NUMBER
	SCANBL
	EXEC	LSNEXP			;SCAN EXPONENT
	EXEC	LSNSCE			;SCALE CONSTANT VALUE
	LI	X1NXT,%CONLR		;RETURN LONG REAL VALUE
	DMOVEM	X1RA,YLSVAL		;FILL IN RETURN VALUE

	RETURN				;EXIT LS
L4():	;END OF NUMBER FOUND
	EXEC	LSNDL			;CHECK THAT DOT WAS NOT LAST CHARACTER
	IF	IFOFFA	YLSNUM
		GOTO	FALSE		;NUMBER IN INTEGER FORM
	THEN				;DOUBLE FLOATING FORM
		IF	SKIPE	,YLSNPM
			GOTO	FALSE	;DECIMAL POINT PRESENT
		THEN	;ERROR OVERFLOW ,INTEGER CONVERTED TO REAL
			MERR	W,1,<OVERFLOW,INTEGER CONV. TO REAL>
			ST	X1RD,YLSNPM	;EXPONENT ZERO
		FI	SUB	X1RD,YLSNPM	;FIND DECIMAL POINT CORRECTION

						;IF OVERFLOW OCCURRED, CORRECT EXPONENT

			IFONA	YLSENW
			ADD	X1RD,YLSNSD	;ADD NUMBER OF DECIMAL DIGITS SKIPPED
			GOTO	L5		;HANDLE REAL NUMBER


	FI	;INTEGER FORM

	IF	SKIPN	,YLSNPM
		GOTO	FALSE		;NO DECIMAL POINT IN NUMBER
	THEN	EXEC	LSNCO		;CONVERT TO LONG REAL FORM
		SUB	X1RD,YLSNPM	;CALCULATE DECIMAL POINT CORRECTION
		GOTO	L5		;HANDLE REAL NUMBER

	FI	;INTEGER CONSTANT

	LI	X1NXT,%CONI		;RETURN INTEGER CONSTANT
	ST	X1RA,YLSVAL		;FILL IN RETURN VALUE

	GOTO	LSNR			;FIND OUT IF RADIX CONSTANT OR NORMAL INTEGER 

L9():	;SPECIAL GROUP OF CHARACTERS
	SCANNO				;FETCH CHARACTER AGAIN
	HRRZ	X1R0,Z1CH(X1BYTE)	;FETCH CHARACTER ROUTINE ADDRESS
	CAIN	X1R0,LSL
	GOTO	L4		;IF LINE CONTROL CHARACTER ,END OF NUMBER
	EXEC	LSCHGR		;HANDLE TEST OR ILLEGAL CHARACTER
	GOTO	L3		;NEXT CHARACTER

LSNPR:	; & FOUND ,START OF NUMBER
	SETZM	YLSNPM			;NO DECIMAL POINT
	SETOFA	YLSNUM			;INTEGER VALUE IN X1RA
	LI	X1RA,1			;INTEGER ONE
	GOTO	L7			;TREAT EXPONENT
	ENDD				;END OF NUMBER MAIN ROUTINE
	BEGIN
LSNR:	;FIND OUT IF RADIX INTEGER NUMBER
	SCANNO
	LF	(X1R0) Z1CHI(X1BYTE)
	CAIE	X1R0,'R'
	RETURN			;RETURN IF ORDINARY INTEGER, EXIT LS

	;X1RA CONTAINS INTEGER ,CHECK IF VALID BASE
	LI	X1RD,^D16
LOOP	CAMN	X1RA,X1RD
	GOTO	FALSE		;BASE MAY BE ACCEPTABLE
AS
	LSH	X1RD,-1		;DIVIDE BY TWO
	CAIE	X1RD,1
	GOTO	TRUE		;TRY NEXT BASE VALUE
	RETURN			;NORMAL INTEGER BASE NOT VALID, EXIT LS
SA	SKIPN	,YLSNSD
	RETURN			;BASE NUMBER NOT VALID IT STARTED WITH ZERO
				;EXIT LS


;	BASE VALUE IN YLSVAL
;	CORRECT BASE FOUND SCAN RADIX NUMBER
	SETOFA	YLSNUM		;NO DIGIT IN RADIX NUMBER
	SETZ	X1RA,		;INTEGER VALUE ZERO
IF	CAIN	X1RD,^D16
	GOTO	FALSE		;BASE IS 16
THEN	;BASE IS 2,4 OR 8
	EXEC	LSNRDD
	GOTO	L9		;ERROR RETURN
	BIFCHA	" ",TRUE	;CONTINUE IF BLANK FOUND
L2():	IFONA	YLSNUM
	GOTO	L10		;VALID DIGIT FOUND
	MERR	E,21,<DIGITS MISSING IN RADIX NUMBER>
	RETURN			;BASE VALUE USED FOR INTEGER
				;EXIT LS

L9():	SCANBL
	IFON	Z1CHSD
	GOTO	L9		;SCAN PAST ANY DIGITS
L10():	ST	X1RA,YLSVAL	;RETURN CALCULATED VALUE
	RETURN			;EXIT LS
FI	
;TREAT RADIX NUMBER WITH BASE 16

	SCANIG
L5():	EXEC	LSNRDN
	GOTO	L1		;ERROR EXIT ,OVERFLOW OR LETTER >F
	;NORMAL EXIT
L4():	BIFCHA	" ",L3		;KEYWORD MAY FOLLOW
	IFOFF	Z1CHSL
	GOTO	L2		;END OF NUMBER FOUND

	;LETTER NOT PRECEDED BY BLANK NO KEYWORD CHECK DONE

L7():	L	X1LEX,Z1CH(X1BYTE)	;FETCHRADIX SIX VALUE OF LETTER
	SETZ	X1ID2,
	LSHC	X1ID2,6
	SUBI	X1ID2,'A'-^D10		;CALCULATE LETTER VALUE
	CAIG	X1ID2,9			;VALUE MAY BE OK
					;TREAT $,#,@
	ADDI	X1ID2,'A'-^D10+^D16	;MAKE SURE DIGIT TEST WILL FAIL
	EXEC	LSNRDS
	GOTO	L1			;ERROR EXIT
	GOTO	L4		

L3():	;BLANK FOUND KEYWORD MAY FOLLOW

	EXEC	LSNKEY		;CHECK IF KEYWORD
	GOTO	L5		;RETURN NO LETTER AFTER BLANK
	GOTO	L2		;KEYWORD FOUND,END OF NUMBER
	GOTO	L7		;NORMAL IDENTIFIER
				;STILL PART OF RADIX NUMBER

L1():	;ERROR IN SCANNING RADIX NUMBER WITH BASE
	;CURRENT CHAR. IS DIGIT OR LETTER
	;SCAN UNTIL KEYWORD OR DELIMITING CHAR.
LOOP	SCANIG
AS
L8():	IFON	Z1CHSI
	GOTO	TRUE		;SCAN PAST LETTERS AND DIGITS
	BIFNCH	" ",L10		;END OF NUMBER
	;BLANK FOUND MAY START IDENTIFIER
	EXEC	LSNKEY		;SEEK KEYWORD
	GOTO	L8		;RETURN IF NO LETTER MAY BE DIGIT
	GOTO	L10		;RETURN IF KEYWORD ,END SCANNING
	GOTO	L8		;IDENTIFIER ,SCAN PAST IT
SA
	ENDD
	LIT
	EPROC
	END
	PRINTX A