Commit | Line | Data |
---|---|---|
c1b567d8 MW |
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 | ||
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 ***,*** |