| 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 ***,*** |