3 REM Generates a lex table for BASIC keywords, and outputs it in
18 ONERROR PRINTREPORT$;" [";STR$(ERL);"]":CLOSE#0:END
33 LOCAL i%,k$,c$,c%,t%,this%,C
40 IF classNames$(i%)=c$ THEN c%=i%
53 tokenClass%(this%)=c%+(tokenCount%(c%)<<16)
58 C=OPENOUT("sh.tokClasses")
60 BPUT#C,"; tokClasses.sh"
62 BPUT#C,"; Token class and index tables (generated)"
64 BPUT#C,"; © 1995 Straylight"
67 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokClasses__dfn"
68 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokClasses__dfn"
72 IF tokenClass%(i%)=-1 THEN
73 BPUT#C,tab$+tab$+"DCB"+tab$+"0,0"
75 BPUT#C,tab$+tab$+"DCB"+tab$+STR$(tokenClass%(i%) AND &FFFF)+",";
76 BPUT#C,STR$(tokenClass%(i%) >> 16)
82 BPUT#C,tab$+tab$+"END"
84 OSCLI "SetType sh.tokClasses text"
89 C=OPENOUT("sh.tokens")
93 BPUT#C,"; Define constants for the tokens (generated)"
95 BPUT#C,"; © 1995 Straylight"
98 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokens__dfn"
99 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokens__dfn"
101 BPUT#C,tab$+tab$+"^"+tab$+"&80"
108 IF LEN(key$)>7 THEN BPUT#C,tab$; ELSE BPUT#C,tab$+tab$;
114 BPUT#C,tab$+tab$+"^"+tab$+"1"
115 FOR i%=1 TO nClass%-1
116 c$="tClass_"+classNames$(i%)
118 IF LEN(c$)<8 THEN BPUT#C,tab$+tab$; ELSE BPUT#C,tab$;
124 BPUT#C,tab$+tab$+"END"
126 OSCLI("Settype sh.tokens text")
131 C=OPENOUT("sh.tokNames")
133 BPUT#C,"; tokNames.sh"
135 BPUT#C,"; Number-to-name table for tokens (generated)"
137 BPUT#C,"; © 1995 Straylight"
140 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokNames__dfn"
141 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokNames__dfn"
150 IF i%=0 THEN BPUT#C,tab$; ELSE BPUT#C,tab$+tab$;
151 BPUT#C,"DCD"+tab$+"tn__"+STR$(i%)
162 BPUT#C,"tn__"+STR$(i%)+tab$+tab$+"DCB"+tab$+""""+key$+""",0"
170 BPUT#C,tab$+tab$+"END"
172 OSCLI("Settype sh.tokNames text")
180 PROCaddAcross(root%,key$)
183 C=OPENOUT"sh.tokTable"
185 BPUT#C,"; tokTable.sh"
187 BPUT#C,"; State table for lexical analysis (generated)"
189 BPUT#C,"; © 1995 Straylight"
192 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokTable__dfn"
193 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokTable__dfn"
195 BPUT#C,tab$+tab$+"MACRO"
196 BPUT#C,"$label"+tab$+tab$+"TOKTBL"+tab$+"$char,$next,$token"
198 BPUT#C,tab$+tab$+"["+tab$+"""$next""=""0"""
199 BPUT#C,tab$+tab$+"DCW"+tab$+"0"
201 BPUT#C,tab$+tab$+"DCW"+tab$+"$next-kt0"
203 BPUT#C,tab$+tab$+"["+tab$+"""$token""<>"""""
204 BPUT#C,tab$+tab$+"DCB"+tab$+"$token"
206 BPUT#C,tab$+tab$+"DCB"+tab$+"0"
208 BPUT#C,tab$+tab$+"DCB"+tab$+"$char"
209 BPUT#C,tab$+tab$+"MEND"
212 PROCoutputBlock(C,block%,0,"")
215 BPUT#C,tab$+tab$+"END"
217 OSCLI("Settype sh.tokTable text")
222 IF LEN(s$)=1 THEN ="'"+s$+"'"
227 IF c%>&60 AND c%<&7B THEN
246 DEF PROCaddAcross(p%,s$)
252 IF old% THEN old%!0=ptr% ELSE root%=ptr%
274 last%!0=last%!0 OR (1<<31)
277 DEFPROCdisplayBlock(blk%,indent%)
280 PROCdisplayBlock(blk%!8,indent%+1)
283 PROCdisplayBlock(blk%!4,indent%)
290 DEFPROCoutputBlock(C,blk%,n%,prefix$)
291 BPUT#C,"kt"+STR$(n%);
292 PROCoutputAcross(C,blk%,prefix$)
295 DEFPROCoutputAcross(C,p%,prefix$)
299 BPUT#C,tab$+tab$+"TOKTBL"+tab$+"'"+CHR$(p%?0)+"'";
301 BPUT#C,",kt"+STR$(n%);
306 IF (p%!0 AND (1<<31)) THEN
307 BPUT#C,","+FNnice(prefix$+CHR$(?p%));
310 PROCoutputAcross(C,p%!4,prefix$)
311 IF p%!8 THEN PROCoutputBlock(C,p%!8,n%,prefix$+CHR$(?p%))
313 BPUT#C,tab$+tab$+"TOKTBL"+tab$+"0,0"
318 DATA AND,andOp,ABS,fn,ASC,fn
319 DATA BGET,streamOp,BPUT,instr,
320 DATA CASE,instr,CHR$,fn,CLOSE,instr
322 DATA DATA,instr,DEF,instr,DIV,multOp,DIM,instr
323 DATA END,instr,ENDPROC,instr,ENDWHILE,instr,ENDIF,instr,ENDCASE,instr
324 DATA ELSE,instr,EVAL,fn,ERROR,instr,EOF,streamOp,EOR,orOp
326 DATA FOR,instr,FALSE,pseud,FN,odd,GOTO,instr
327 DATA GET$,streamOp,GOSUB,instr
328 DATA IF,instr,INSTR(,multArg,LEFT$(,multArg,LEN,fn
331 DATA MID$(,multArg,MOD,multOp
332 DATA NEXT,instr,NOT,fn
333 DATA OF,noise,OFF,option,ON,noise,OR,orOp,OPENIN,fn,OPENOUT,fn,OPENUP,fn
334 DATA OSCLI,instr,OTHERWISE,instr
335 DATA PTR,streamOp,PROC,instr
336 DATA RETURN,instr,REPEAT,instr,READ,instr
337 DATA REM,noise,RESTORE,instr
338 DATA RIGHT$(,multArg,RND,odd
339 DATA STEP,noise,SGN,fn,STR$,fn,STRING$(,multArg,SWAP,instr
341 DATA THEN,noise,TIME,pseud,TIME$,pseud,TO,noise,TRUE,pseud
344 DATA WHILE,instr,WHEN,instr
345 DATA =,relOp,<,relOp,<=,relOp,<>,relOp,>,relOp,>=,relOp
346 DATA <<,relOp,>>,relOp,>>>,relOp
347 DATA /,multOp,/*,noise,//,noise
348 DATA +,addOp,-,addOp,*,multOp,+=,assign,-=,assign,*=,assign,^,powOp