lmain.c (6094B)
1 /* lex [-[dynvt]] [file] ... [file] */ 2 3 /* Copyright 1976, Bell Telephone Laboratories, Inc., 4 written by Eric Schmidt, August 27, 1976 */ 5 6 # include "ldefs.h" 7 Biobuf fout; 8 int foutopen; 9 int errorf = 1; 10 int sect = DEFSECTION; 11 int prev = '\n'; /* previous input character */ 12 int pres = '\n'; /* present input character */ 13 int peek = '\n'; /* next input character */ 14 uchar *pushptr = pushc; 15 uchar *slptr = slist; 16 17 char *cname; 18 19 int nine; 20 int ccount = 1; 21 int casecount = 1; 22 int aptr = 1; 23 int nstates = NSTATES, maxpos = MAXPOS; 24 int treesize = TREESIZE, ntrans = NTRANS; 25 int yytop; 26 int outsize = NOUTPUT; 27 int sptr = 1; 28 int report = 2; 29 int debug; /* 1 = on */ 30 int charc; 31 int sargc; 32 char **sargv; 33 uchar buf[520]; 34 int yyline; /* line number of file */ 35 int eof; 36 int lgatflg; 37 int divflg; 38 int funcflag; 39 int pflag; 40 int chset; /* 1 = char set modified */ 41 Biobuf *fin, *fother; 42 int fptr; 43 int *name; 44 int *left; 45 uintptr *right; 46 int *parent; 47 uchar *nullstr; 48 uchar **ptr; 49 int tptr; 50 uchar pushc[TOKENSIZE]; 51 uchar slist[STARTSIZE]; 52 uchar **def, **subs, *dchar; 53 uchar **sname, *stchar; 54 uchar *ccl; 55 uchar *ccptr; 56 uchar *dp, *sp; 57 int dptr; 58 uchar *bptr; /* store input position */ 59 uchar *tmpstat; 60 int count; 61 int **foll; 62 int *nxtpos; 63 int *positions; 64 int *gotof; 65 int *nexts; 66 uchar *nchar; 67 int **state; 68 int *sfall; /* fallback state num */ 69 uchar *cpackflg; /* true if state has been character packed */ 70 int *atable; 71 int nptr; 72 uchar symbol[NCH]; 73 uchar cindex[NCH]; 74 int xstate; 75 int stnum; 76 uchar match[NCH]; 77 uchar extra[NACTIONS]; 78 uchar *pchar, *pcptr; 79 int pchlen = TOKENSIZE; 80 long rcount; 81 int *verify, *advance, *stoff; 82 int scon; 83 uchar *psave; 84 85 static void free1core(void); 86 static void free2core(void); 87 #ifdef DEBUG 88 static void free3core(void); 89 #endif 90 static void get1core(void); 91 static void get2core(void); 92 static void get3core(void); 93 94 void 95 main(int argc, char **argv) 96 { 97 int i; 98 99 cname = unsharp("#9/lib/lex.ncform"); 100 101 ARGBEGIN { 102 # ifdef DEBUG 103 case 'd': debug++; break; 104 case 'y': yydebug = TRUE; break; 105 # endif 106 case 't': case 'T': 107 Binit(&fout, 1, OWRITE); 108 errorf= 2; 109 foutopen = 1; 110 break; 111 case 'v': case 'V': 112 report = 1; 113 break; 114 case 'n': case 'N': 115 report = 0; 116 break; 117 case '9': 118 nine = 1; 119 break; 120 default: 121 warning("Unknown option %c", ARGC()); 122 } ARGEND 123 sargc = argc; 124 sargv = argv; 125 if (argc > 0){ 126 fin = Bopen(argv[fptr++], OREAD); 127 if(fin == 0) 128 error ("Can't read input file %s",argv[0]); 129 sargc--; 130 sargv++; 131 } 132 else { 133 fin = myalloc(sizeof(Biobuf), 1); 134 if(fin == 0) 135 exits("core"); 136 Binit(fin, 0, OREAD); 137 } 138 if(Bgetc(fin) == Beof) /* no input */ 139 exits(0); 140 Bseek(fin, 0, 0); 141 gch(); 142 /* may be gotten: def, subs, sname, stchar, ccl, dchar */ 143 get1core(); 144 /* may be gotten: name, left, right, nullstr, parent */ 145 strcpy((char*)sp, "INITIAL"); 146 sname[0] = sp; 147 sp += strlen("INITIAL") + 1; 148 sname[1] = 0; 149 if(yyparse()) exits("error"); /* error return code */ 150 /* may be disposed of: def, subs, dchar */ 151 free1core(); 152 /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */ 153 get2core(); 154 ptail(); 155 mkmatch(); 156 # ifdef DEBUG 157 if(debug) pccl(); 158 # endif 159 sect = ENDSECTION; 160 if(tptr>0)cfoll(tptr-1); 161 # ifdef DEBUG 162 if(debug)pfoll(); 163 # endif 164 cgoto(); 165 # ifdef DEBUG 166 if(debug){ 167 print("Print %d states:\n",stnum+1); 168 for(i=0;i<=stnum;i++)stprt(i); 169 } 170 # endif 171 /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */ 172 /* may be gotten: verify, advance, stoff */ 173 free2core(); 174 get3core(); 175 layout(); 176 /* may be disposed of: verify, advance, stoff, nexts, nchar, 177 gotof, atable, ccpackflg, sfall */ 178 # ifdef DEBUG 179 free3core(); 180 # endif 181 fother = Bopen(cname,OREAD); 182 if(fother == 0) 183 error("Lex driver missing, file %s",cname); 184 while ( (i=Bgetc(fother)) != Beof) 185 Bputc(&fout, i); 186 187 Bterm(fother); 188 Bterm(&fout); 189 if( 190 # ifdef DEBUG 191 debug || 192 # endif 193 report == 1)statistics(); 194 if(fin) 195 Bterm(fin); 196 exits(0); /* success return code */ 197 } 198 199 static void 200 get1core(void) 201 { 202 ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl)); 203 pcptr = pchar = myalloc(pchlen, sizeof(*pchar)); 204 def = myalloc(DEFSIZE,sizeof(*def)); 205 subs = myalloc(DEFSIZE,sizeof(*subs)); 206 dp = dchar = myalloc(DEFCHAR,sizeof(*dchar)); 207 sname = myalloc(STARTSIZE,sizeof(*sname)); 208 sp = stchar = myalloc(STARTCHAR,sizeof(*stchar)); 209 if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0) 210 error("Too little core to begin"); 211 } 212 213 static void 214 free1core(void) 215 { 216 free(def); 217 free(subs); 218 free(dchar); 219 } 220 221 static void 222 get2core(void) 223 { 224 int i; 225 226 gotof = myalloc(nstates,sizeof(*gotof)); 227 nexts = myalloc(ntrans,sizeof(*nexts)); 228 nchar = myalloc(ntrans,sizeof(*nchar)); 229 state = myalloc(nstates,sizeof(*state)); 230 atable = myalloc(nstates,sizeof(*atable)); 231 sfall = myalloc(nstates,sizeof(*sfall)); 232 cpackflg = myalloc(nstates,sizeof(*cpackflg)); 233 tmpstat = myalloc(tptr+1,sizeof(*tmpstat)); 234 foll = myalloc(tptr+1,sizeof(*foll)); 235 nxtpos = positions = myalloc(maxpos,sizeof(*positions)); 236 if(tmpstat == 0 || foll == 0 || positions == 0 || 237 gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 ) 238 error("Too little core for state generation"); 239 for(i=0;i<=tptr;i++)foll[i] = 0; 240 } 241 242 static void 243 free2core(void) 244 { 245 free(positions); 246 free(tmpstat); 247 free(foll); 248 free(name); 249 free(left); 250 free(right); 251 free(parent); 252 free(nullstr); 253 free(state); 254 free(sname); 255 free(stchar); 256 free(ccl); 257 } 258 259 static void 260 get3core(void) 261 { 262 verify = myalloc(outsize,sizeof(*verify)); 263 advance = myalloc(outsize,sizeof(*advance)); 264 stoff = myalloc(stnum+2,sizeof(*stoff)); 265 if(verify == 0 || advance == 0 || stoff == 0) 266 error("Too little core for final packing"); 267 } 268 # ifdef DEBUG 269 static void 270 free3core(void){ 271 free(advance); 272 free(verify); 273 free(stoff); 274 free(gotof); 275 free(nexts); 276 free(nchar); 277 free(atable); 278 free(sfall); 279 free(cpackflg); 280 } 281 # endif 282 void * 283 myalloc(int a, int b) 284 { 285 void *i; 286 i = calloc(a, b); 287 if(i==0) 288 warning("OOPS - calloc returns a 0"); 289 return(i); 290 } 291 292 void 293 yyerror(char *s) 294 { 295 fprint(2, "line %d: %s\n", yyline, s); 296 }