chiark / gitweb /
Create readable text `.bas' for each tokenized BASIC `,ffb' file.
[ssr] / StraySrc / Libraries / Sapphire / sail / tableGen.bas
1 REM >tableGen
2 REM
3 REM Generates a lex table for BASIC keywords, and outputs it in
4 REM objasm syntax
5 REM
6 REM © 1995 Straylight
7 REM
8 :
9 PROCinit
10 tab$=CHR$(9)
11 PROCgetClasses
12 PROCoutputTokens
13 PROCoutputNames
14 PROCoutputTable
15 END
16 :
17 DEFPROCinit
18 ONERROR PRINTREPORT$;" [";STR$(ERL);"]":CLOSE#0:END
19 DIM block% 20240
20 DIM tokenClass%(256)
21 DIM classNames$(256)
22 DIM tokenCount%(256)
23 tokenClass%()=-1
24 nClass%=1
25 ptr%=block%
26 ptr%!0=0
27 ptr%!4=0
28 ptr%!8=0
29 ntable%=1
30 ENDPROC
31 :
32 DEFPROCgetClasses
33 LOCAL i%,k$,c$,c%,t%,this%,C
34 RESTORE
35 READ k$,c$
36 t%=128
37 WHILE k$<>"***"
38   c%=-1
39   FOR i%=0 TO nClass%
40     IF classNames$(i%)=c$ THEN c%=i%
41   NEXT
42   IF c%=-1 THEN
43     c%=nClass%
44     nClass%+=1
45     classNames$(c%)=c$
46   ENDIF
47   IF LEN(k$)=1 THEN
48     this%=ASC(k$)
49   ELSE
50     this%=t%
51     t%+=1
52   ENDIF
53   tokenClass%(this%)=c%+(tokenCount%(c%)<<16)
54   tokenCount%(c%)+=1
55   READ k$,c$
56 ENDWHILE
57
58 C=OPENOUT("sh.tokClasses")
59 BPUT#C,";"
60 BPUT#C,"; tokClasses.sh"
61 BPUT#C,";"
62 BPUT#C,"; Token class and index tables (generated)"
63 BPUT#C,";"
64 BPUT#C,"; © 1995 Straylight"
65 BPUT#C,";"
66 BPUT#C,""
67 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokClasses__dfn"
68 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokClasses__dfn"
69 BPUT#C,""
70 BPUT#C,"tokClasses"
71 FOR i%=0 TO 255
72   IF tokenClass%(i%)=-1 THEN
73     BPUT#C,tab$+tab$+"DCB"+tab$+"0,0"
74   ELSE
75     BPUT#C,tab$+tab$+"DCB"+tab$+STR$(tokenClass%(i%) AND &FFFF)+",";
76     BPUT#C,STR$(tokenClass%(i%) >> 16)
77   ENDIF
78 NEXT
79 BPUT#C,""
80 BPUT#C,tab$+tab$+"]"
81 BPUT#C,"" 
82 BPUT#C,tab$+tab$+"END"
83 CLOSE#C
84 OSCLI "SetType sh.tokClasses text"
85 ENDPROC
86 :
87 DEFPROCoutputTokens
88 LOCAL C,key$
89 C=OPENOUT("sh.tokens")
90 BPUT#C,";"
91 BPUT#C,"; tokens.sh"
92 BPUT#C,";"
93 BPUT#C,"; Define constants for the tokens (generated)"
94 BPUT#C,";"
95 BPUT#C,"; © 1995 Straylight"
96 BPUT#C,";"
97 BPUT#C,""
98 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokens__dfn"
99 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokens__dfn"
100 BPUT#C,""
101 BPUT#C,tab$+tab$+"^"+tab$+"&80"
102 RESTORE
103 READ key$,c$
104 WHILE key$<>"***"
105   IF LEN(key$)>1 THEN
106     key$=FNnice(key$)
107     BPUT#C,key$;
108     IF LEN(key$)>7 THEN BPUT#C,tab$; ELSE BPUT#C,tab$+tab$;
109     BPUT#C,"#"+tab$+"1"
110   ENDIF
111   READ key$,c$
112 ENDWHILE
113 BPUT#C,""
114 BPUT#C,tab$+tab$+"^"+tab$+"1"
115 FOR i%=1 TO nClass%-1
116   c$="tClass_"+classNames$(i%)
117   BPUT#C,c$;
118   IF LEN(c$)<8 THEN BPUT#C,tab$+tab$; ELSE BPUT#C,tab$;
119   BPUT#C,"#"+tab$+"1"
120 NEXT
121 BPUT#C,""
122 BPUT#C,tab$+tab$+"]"
123 BPUT#C,""
124 BPUT#C,tab$+tab$+"END"
125 CLOSE#C
126 OSCLI("Settype sh.tokens text")
127 ENDPROC
128 :
129 DEFPROCoutputNames
130 LOCAL C,key$,i%
131 C=OPENOUT("sh.tokNames")
132 BPUT#C,";"
133 BPUT#C,"; tokNames.sh"
134 BPUT#C,";"
135 BPUT#C,"; Number-to-name table for tokens (generated)"
136 BPUT#C,";"
137 BPUT#C,"; © 1995 Straylight"
138 BPUT#C,";"
139 BPUT#C,""
140 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokNames__dfn"
141 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokNames__dfn"
142 BPUT#C,""
143 BPUT#C,"tokNames";
144
145 i%=0
146 RESTORE
147 READ key$,c$
148 WHILE key$<>"***"
149   IF LEN(key$)>1 THEN
150     IF i%=0 THEN BPUT#C,tab$; ELSE BPUT#C,tab$+tab$;
151     BPUT#C,"DCD"+tab$+"tn__"+STR$(i%)
152     i%+=1
153   ENDIF
154   READ key$,c$
155 ENDWHILE
156 BPUT#C,""
157 RESTORE
158 READ key$,c$
159 i%=0
160 WHILE key$<>"***"
161   IF LEN(key$)>1 THEN
162     BPUT#C,"tn__"+STR$(i%)+tab$+tab$+"DCB"+tab$+""""+key$+""",0"
163     i%+=1
164   ENDIF
165   READ key$,c$
166 ENDWHILE
167 BPUT#C,""
168 BPUT#C,tab$+tab$+"]"
169 BPUT#C,""
170 BPUT#C,tab$+tab$+"END"
171 CLOSE#C
172 OSCLI("Settype sh.tokNames text")
173 ENDPROC
174 :
175 DEFPROCoutputTable
176 RESTORE
177 READ key$,c$
178 root%=0
179 WHILE key$<>"***"  
180   PROCaddAcross(root%,key$)
181   READ key$,c$
182 ENDWHILE
183 C=OPENOUT"sh.tokTable"
184 BPUT#C,";"
185 BPUT#C,"; tokTable.sh"
186 BPUT#C,";"
187 BPUT#C,"; State table for lexical analysis (generated)"
188 BPUT#C,";"
189 BPUT#C,"; © 1995 Straylight"
190 BPUT#C,";"
191 BPUT#C,""
192 BPUT#C,tab$+tab$+"["+tab$+":LNOT::DEF:tokTable__dfn"
193 BPUT#C,tab$+tab$+"GBLL"+tab$+"tokTable__dfn"
194 BPUT#C,""
195 BPUT#C,tab$+tab$+"MACRO"
196 BPUT#C,"$label"+tab$+tab$+"TOKTBL"+tab$+"$char,$next,$token"
197 BPUT#C,"$label"
198 BPUT#C,tab$+tab$+"["+tab$+"""$next""=""0"""
199 BPUT#C,tab$+tab$+"DCW"+tab$+"0"
200 BPUT#C,tab$+tab$+"|"
201 BPUT#C,tab$+tab$+"DCW"+tab$+"$next-kt0"
202 BPUT#C,tab$+tab$+"]"
203 BPUT#C,tab$+tab$+"["+tab$+"""$token""<>"""""
204 BPUT#C,tab$+tab$+"DCB"+tab$+"$token"
205 BPUT#C,tab$+tab$+"|"
206 BPUT#C,tab$+tab$+"DCB"+tab$+"0"
207 BPUT#C,tab$+tab$+"]"
208 BPUT#C,tab$+tab$+"DCB"+tab$+"$char"
209 BPUT#C,tab$+tab$+"MEND"
210 BPUT#C,""
211 BPUT#C,"tokTable"
212 PROCoutputBlock(C,block%,0,"")
213 BPUT#C,tab$+tab$+"]"
214 BPUT#C,""
215 BPUT#C,tab$+tab$+"END"
216 CLOSE#C
217 OSCLI("Settype sh.tokTable text")
218 ENDPROC
219 :
220 DEFFNnice(s$)
221 LOCAL nice$,c%
222 IF LEN(s$)=1 THEN ="'"+s$+"'"
223 nice$="tok_"
224 WHILE s$<>""
225   c%=ASC(LEFT$(s$,1))
226   c%=c% OR &20
227   IF c%>&60 AND c%<&7B THEN
228     nice$+=CHR$(c%)
229   ELSE
230     CASE CHR$(c%) OF
231       WHEN "+": nice$+="P"
232       WHEN "-": nice$+="M"
233       WHEN "*": nice$+="T"
234       WHEN "/": nice$+="D"
235       WHEN "=": nice$+="E"
236       WHEN "<": nice$+="L"
237       WHEN ">": nice$+="G"
238       WHEN "$": nice$+="S"
239       WHEN "#": nice$+="H"
240     ENDCASE
241   ENDIF
242   s$=MID$(s$,2)
243 ENDWHILE
244 =nice$
245 :
246 DEF PROCaddAcross(p%,s$)
247 old%=0
248 last%=0
249 WHILE s$<>""
250   c%=ASC(LEFT$(s$,1))
251   IF p%=0 THEN
252     IF old% THEN old%!0=ptr% ELSE root%=ptr%
253     p%=ptr%
254     ptr%!0=c%
255     ptr%!4=0
256     ptr%!8=0
257     ptr%+=12
258     s$=MID$(s$,2)
259     old%=p%+8
260     last%=p%
261     p%=p%!8
262   ELSE  
263     IF c%=?p% THEN
264       old%=p%+8
265       last%=p%
266       p%=p%!8
267       s$=MID$(s$,2)
268     ELSE
269       old%=p%+4
270       p%=p%!4
271     ENDIF
272   ENDIF
273 ENDWHILE
274 last%!0=last%!0 OR (1<<31)
275 ENDPROC
276 :
277 DEFPROCdisplayBlock(blk%,indent%)
278 IF blk%<>0 THEN
279   PRINT CHR$(blk%!0);
280   PROCdisplayBlock(blk%!8,indent%+1)
281   IF blk%!4 THEN
282     PRINT SPC(indent%);
283     PROCdisplayBlock(blk%!4,indent%)
284   ENDIF
285 ELSE
286   PRINT
287 ENDIF
288 ENDPROC
289 :
290 DEFPROCoutputBlock(C,blk%,n%,prefix$)
291 BPUT#C,"kt"+STR$(n%);
292 PROCoutputAcross(C,blk%,prefix$)
293 ENDPROC
294 :
295 DEFPROCoutputAcross(C,p%,prefix$)
296 LOCAL n%
297 n%=ntable%
298 IF p%<>0 THEN
299   BPUT#C,tab$+tab$+"TOKTBL"+tab$+"'"+CHR$(p%?0)+"'";
300   IF p%!8 THEN
301     BPUT#C,",kt"+STR$(n%);
302     ntable%+=1
303   ELSE
304     BPUT#C,",0";
305   ENDIF
306   IF (p%!0 AND (1<<31)) THEN
307     BPUT#C,","+FNnice(prefix$+CHR$(?p%));
308   ENDIF
309   BPUT#C,""
310   PROCoutputAcross(C,p%!4,prefix$)
311   IF p%!8 THEN PROCoutputBlock(C,p%!8,n%,prefix$+CHR$(?p%))
312 ELSE
313   BPUT#C,tab$+tab$+"TOKTBL"+tab$+"0,0"
314   BPUT#C,""
315 ENDIF
316 ENDPROC
317 :
318 DATA AND,andOp,ABS,fn,ASC,fn
319 DATA BGET,streamOp,BPUT,instr,
320 DATA CASE,instr,CHR$,fn,CLOSE,instr
321 DATA CALL,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
325 DATA EXT,streamOp
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
329 DATA LET,instr
330 DATA LOCAL,instr
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
340 DATA SYS,instr
341 DATA THEN,noise,TIME,pseud,TIME$,pseud,TO,noise,TRUE,pseud
342 DATA UNTIL,instr
343 DATA VAL,fn
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
349 DATA /=,assign
350 DATA ***,***