13e12c5d1SDavid du Colombier /* lex [-[dynvt]] [file] ... [file] */ 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier /* Copyright 1976, Bell Telephone Laboratories, Inc., 43e12c5d1SDavid du Colombier written by Eric Schmidt, August 27, 1976 */ 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier # include "ldefs.h" 7219b2ee8SDavid du Colombier Biobuf fout; 8219b2ee8SDavid du Colombier int foutopen; 9219b2ee8SDavid du Colombier int errorf = 1; 103e12c5d1SDavid du Colombier int sect = DEFSECTION; 113e12c5d1SDavid du Colombier int prev = '\n'; /* previous input character */ 123e12c5d1SDavid du Colombier int pres = '\n'; /* present input character */ 133e12c5d1SDavid du Colombier int peek = '\n'; /* next input character */ 143e12c5d1SDavid du Colombier uchar *pushptr = pushc; 153e12c5d1SDavid du Colombier uchar *slptr = slist; 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier char *cname = "/sys/lib/lex/ncform"; 183e12c5d1SDavid du Colombier 193ff48bf5SDavid du Colombier int nine; 203e12c5d1SDavid du Colombier int ccount = 1; 213e12c5d1SDavid du Colombier int casecount = 1; 223e12c5d1SDavid du Colombier int aptr = 1; 233e12c5d1SDavid du Colombier int nstates = NSTATES, maxpos = MAXPOS; 243e12c5d1SDavid du Colombier int treesize = TREESIZE, ntrans = NTRANS; 253e12c5d1SDavid du Colombier int yytop; 263e12c5d1SDavid du Colombier int outsize = NOUTPUT; 273e12c5d1SDavid du Colombier int sptr = 1; 283e12c5d1SDavid du Colombier int report = 2; 293e12c5d1SDavid du Colombier int debug; /* 1 = on */ 303e12c5d1SDavid du Colombier int charc; 313e12c5d1SDavid du Colombier int sargc; 323e12c5d1SDavid du Colombier char **sargv; 333e12c5d1SDavid du Colombier uchar buf[520]; 343e12c5d1SDavid du Colombier int yyline; /* line number of file */ 353e12c5d1SDavid du Colombier int eof; 363e12c5d1SDavid du Colombier int lgatflg; 373e12c5d1SDavid du Colombier int divflg; 383e12c5d1SDavid du Colombier int funcflag; 393e12c5d1SDavid du Colombier int pflag; 403e12c5d1SDavid du Colombier int chset; /* 1 = char set modified */ 417b6cd6eaSDavid du Colombier Biobuf *fin = 0, *fother; 423e12c5d1SDavid du Colombier int fptr; 433e12c5d1SDavid du Colombier int *name; 443e12c5d1SDavid du Colombier int *left; 453e12c5d1SDavid du Colombier int *right; 463e12c5d1SDavid du Colombier int *parent; 473e12c5d1SDavid du Colombier uchar *nullstr; 4874f16c81SDavid du Colombier uchar **ptr; 493e12c5d1SDavid du Colombier int tptr; 503e12c5d1SDavid du Colombier uchar pushc[TOKENSIZE]; 513e12c5d1SDavid du Colombier uchar slist[STARTSIZE]; 523e12c5d1SDavid du Colombier uchar **def, **subs, *dchar; 533e12c5d1SDavid du Colombier uchar **sname, *stchar; 543e12c5d1SDavid du Colombier uchar *ccl; 553e12c5d1SDavid du Colombier uchar *ccptr; 563e12c5d1SDavid du Colombier uchar *dp, *sp; 573e12c5d1SDavid du Colombier int dptr; 583e12c5d1SDavid du Colombier uchar *bptr; /* store input position */ 593e12c5d1SDavid du Colombier uchar *tmpstat; 603e12c5d1SDavid du Colombier int count; 613e12c5d1SDavid du Colombier int **foll; 623e12c5d1SDavid du Colombier int *nxtpos; 633e12c5d1SDavid du Colombier int *positions; 643e12c5d1SDavid du Colombier int *gotof; 653e12c5d1SDavid du Colombier int *nexts; 663e12c5d1SDavid du Colombier uchar *nchar; 673e12c5d1SDavid du Colombier int **state; 683e12c5d1SDavid du Colombier int *sfall; /* fallback state num */ 693e12c5d1SDavid du Colombier uchar *cpackflg; /* true if state has been character packed */ 703e12c5d1SDavid du Colombier int *atable; 713e12c5d1SDavid du Colombier int nptr; 723e12c5d1SDavid du Colombier uchar symbol[NCH]; 733e12c5d1SDavid du Colombier uchar cindex[NCH]; 743e12c5d1SDavid du Colombier int xstate; 753e12c5d1SDavid du Colombier int stnum; 763e12c5d1SDavid du Colombier uchar match[NCH]; 773e12c5d1SDavid du Colombier uchar extra[NACTIONS]; 783e12c5d1SDavid du Colombier uchar *pchar, *pcptr; 793e12c5d1SDavid du Colombier int pchlen = TOKENSIZE; 803e12c5d1SDavid du Colombier long rcount; 813e12c5d1SDavid du Colombier int *verify, *advance, *stoff; 823e12c5d1SDavid du Colombier int scon; 833e12c5d1SDavid du Colombier uchar *psave; 843e12c5d1SDavid du Colombier 853e12c5d1SDavid du Colombier static void free1core(void); 863e12c5d1SDavid du Colombier static void free2core(void); 873e12c5d1SDavid du Colombier static void free3core(void); 883e12c5d1SDavid du Colombier static void get1core(void); 893e12c5d1SDavid du Colombier static void get2core(void); 903e12c5d1SDavid du Colombier static void get3core(void); 913e12c5d1SDavid du Colombier 92219b2ee8SDavid du Colombier void 933e12c5d1SDavid du Colombier main(int argc, char **argv) 943e12c5d1SDavid du Colombier { 953e12c5d1SDavid du Colombier int i; 96219b2ee8SDavid du Colombier 973e12c5d1SDavid du Colombier ARGBEGIN { 983e12c5d1SDavid du Colombier # ifdef DEBUG 993e12c5d1SDavid du Colombier case 'd': debug++; break; 1003e12c5d1SDavid du Colombier case 'y': yydebug = TRUE; break; 1013e12c5d1SDavid du Colombier # endif 1023e12c5d1SDavid du Colombier case 't': case 'T': 103219b2ee8SDavid du Colombier Binit(&fout, 1, OWRITE); 104219b2ee8SDavid du Colombier errorf= 2; 105219b2ee8SDavid du Colombier foutopen = 1; 1063e12c5d1SDavid du Colombier break; 1073e12c5d1SDavid du Colombier case 'v': case 'V': 1083e12c5d1SDavid du Colombier report = 1; 1093e12c5d1SDavid du Colombier break; 1103e12c5d1SDavid du Colombier case 'n': case 'N': 1113e12c5d1SDavid du Colombier report = 0; 1123e12c5d1SDavid du Colombier break; 1133ff48bf5SDavid du Colombier case '9': 1143ff48bf5SDavid du Colombier nine = 1; 1153ff48bf5SDavid du Colombier break; 1163e12c5d1SDavid du Colombier default: 1173e12c5d1SDavid du Colombier warning("Unknown option %c", ARGC()); 1183e12c5d1SDavid du Colombier } ARGEND 1193e12c5d1SDavid du Colombier sargc = argc; 1203e12c5d1SDavid du Colombier sargv = argv; 1213e12c5d1SDavid du Colombier if (argc > 0){ 122219b2ee8SDavid du Colombier fin = Bopen(argv[fptr++], OREAD); 123219b2ee8SDavid du Colombier if(fin == 0) 124219b2ee8SDavid du Colombier error ("Can't read input file %s",argv[0]); 1253e12c5d1SDavid du Colombier sargc--; 1263e12c5d1SDavid du Colombier sargv++; 1273e12c5d1SDavid du Colombier } 128219b2ee8SDavid du Colombier else { 129219b2ee8SDavid du Colombier fin = myalloc(sizeof(Biobuf), 1); 130219b2ee8SDavid du Colombier if(fin == 0) 131219b2ee8SDavid du Colombier exits("core"); 132219b2ee8SDavid du Colombier Binit(fin, 0, OREAD); 133219b2ee8SDavid du Colombier } 134219b2ee8SDavid du Colombier if(Bgetc(fin) == Beof) /* no input */ 135219b2ee8SDavid du Colombier exits(0); 136219b2ee8SDavid du Colombier Bseek(fin, 0, 0); 1373e12c5d1SDavid du Colombier gch(); 1383e12c5d1SDavid du Colombier /* may be gotten: def, subs, sname, stchar, ccl, dchar */ 1393e12c5d1SDavid du Colombier get1core(); 140*1fa40b8eSDavid du Colombier /* may be gotten: name, left, right, nullstr, parent, ptr */ 1413e12c5d1SDavid du Colombier strcpy((char*)sp, "INITIAL"); 1423e12c5d1SDavid du Colombier sname[0] = sp; 1433e12c5d1SDavid du Colombier sp += strlen("INITIAL") + 1; 1443e12c5d1SDavid du Colombier sname[1] = 0; 1453e12c5d1SDavid du Colombier if(yyparse()) exits("error"); /* error return code */ 1463e12c5d1SDavid du Colombier /* may be disposed of: def, subs, dchar */ 1473e12c5d1SDavid du Colombier free1core(); 1483e12c5d1SDavid du Colombier /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */ 1493e12c5d1SDavid du Colombier get2core(); 1503e12c5d1SDavid du Colombier ptail(); 1513e12c5d1SDavid du Colombier mkmatch(); 1523e12c5d1SDavid du Colombier # ifdef DEBUG 1533e12c5d1SDavid du Colombier if(debug) pccl(); 1543e12c5d1SDavid du Colombier # endif 1553e12c5d1SDavid du Colombier sect = ENDSECTION; 1563e12c5d1SDavid du Colombier if(tptr>0)cfoll(tptr-1); 1573e12c5d1SDavid du Colombier # ifdef DEBUG 1583e12c5d1SDavid du Colombier if(debug)pfoll(); 1593e12c5d1SDavid du Colombier # endif 1603e12c5d1SDavid du Colombier cgoto(); 1613e12c5d1SDavid du Colombier # ifdef DEBUG 1623e12c5d1SDavid du Colombier if(debug){ 163219b2ee8SDavid du Colombier print("Print %d states:\n",stnum+1); 1643e12c5d1SDavid du Colombier for(i=0;i<=stnum;i++)stprt(i); 1653e12c5d1SDavid du Colombier } 1663e12c5d1SDavid du Colombier # endif 1673e12c5d1SDavid du Colombier /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */ 1683e12c5d1SDavid du Colombier /* may be gotten: verify, advance, stoff */ 1693e12c5d1SDavid du Colombier free2core(); 1703e12c5d1SDavid du Colombier get3core(); 1713e12c5d1SDavid du Colombier layout(); 1723e12c5d1SDavid du Colombier /* may be disposed of: verify, advance, stoff, nexts, nchar, 1733e12c5d1SDavid du Colombier gotof, atable, ccpackflg, sfall */ 1743e12c5d1SDavid du Colombier # ifdef DEBUG 1753e12c5d1SDavid du Colombier free3core(); 1763e12c5d1SDavid du Colombier # endif 177219b2ee8SDavid du Colombier fother = Bopen(cname,OREAD); 178219b2ee8SDavid du Colombier if(fother == 0) 1793e12c5d1SDavid du Colombier error("Lex driver missing, file %s",cname); 180219b2ee8SDavid du Colombier while ( (i=Bgetc(fother)) != Beof) 181219b2ee8SDavid du Colombier Bputc(&fout, i); 1823e12c5d1SDavid du Colombier 183219b2ee8SDavid du Colombier Bterm(fother); 184219b2ee8SDavid du Colombier Bterm(&fout); 1853e12c5d1SDavid du Colombier if( 1863e12c5d1SDavid du Colombier # ifdef DEBUG 1873e12c5d1SDavid du Colombier debug || 1883e12c5d1SDavid du Colombier # endif 1893e12c5d1SDavid du Colombier report == 1)statistics(); 1907b6cd6eaSDavid du Colombier if (fin) 191219b2ee8SDavid du Colombier Bterm(fin); 1923e12c5d1SDavid du Colombier exits(0); /* success return code */ 1933e12c5d1SDavid du Colombier } 1943e12c5d1SDavid du Colombier 1953e12c5d1SDavid du Colombier static void 1963e12c5d1SDavid du Colombier get1core(void) 1973e12c5d1SDavid du Colombier { 1983e12c5d1SDavid du Colombier ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl)); 1993e12c5d1SDavid du Colombier pcptr = pchar = myalloc(pchlen, sizeof(*pchar)); 2003e12c5d1SDavid du Colombier def = myalloc(DEFSIZE,sizeof(*def)); 2013e12c5d1SDavid du Colombier subs = myalloc(DEFSIZE,sizeof(*subs)); 2023e12c5d1SDavid du Colombier dp = dchar = myalloc(DEFCHAR,sizeof(*dchar)); 2033e12c5d1SDavid du Colombier sname = myalloc(STARTSIZE,sizeof(*sname)); 2043e12c5d1SDavid du Colombier sp = stchar = myalloc(STARTCHAR,sizeof(*stchar)); 2053e12c5d1SDavid du Colombier if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0) 2063e12c5d1SDavid du Colombier error("Too little core to begin"); 2073e12c5d1SDavid du Colombier } 2083e12c5d1SDavid du Colombier 2093e12c5d1SDavid du Colombier static void 2103e12c5d1SDavid du Colombier free1core(void) 2113e12c5d1SDavid du Colombier { 2123e12c5d1SDavid du Colombier free(def); 2133e12c5d1SDavid du Colombier free(subs); 2143e12c5d1SDavid du Colombier free(dchar); 2153e12c5d1SDavid du Colombier } 2163e12c5d1SDavid du Colombier 2173e12c5d1SDavid du Colombier static void 2183e12c5d1SDavid du Colombier get2core(void) 2193e12c5d1SDavid du Colombier { 220219b2ee8SDavid du Colombier int i; 2213e12c5d1SDavid du Colombier 2223e12c5d1SDavid du Colombier gotof = myalloc(nstates,sizeof(*gotof)); 2233e12c5d1SDavid du Colombier nexts = myalloc(ntrans,sizeof(*nexts)); 2243e12c5d1SDavid du Colombier nchar = myalloc(ntrans,sizeof(*nchar)); 2253e12c5d1SDavid du Colombier state = myalloc(nstates,sizeof(*state)); 2263e12c5d1SDavid du Colombier atable = myalloc(nstates,sizeof(*atable)); 2273e12c5d1SDavid du Colombier sfall = myalloc(nstates,sizeof(*sfall)); 2283e12c5d1SDavid du Colombier cpackflg = myalloc(nstates,sizeof(*cpackflg)); 2293e12c5d1SDavid du Colombier tmpstat = myalloc(tptr+1,sizeof(*tmpstat)); 2303e12c5d1SDavid du Colombier foll = myalloc(tptr+1,sizeof(*foll)); 2313e12c5d1SDavid du Colombier nxtpos = positions = myalloc(maxpos,sizeof(*positions)); 2323e12c5d1SDavid du Colombier if(tmpstat == 0 || foll == 0 || positions == 0 || 2333e12c5d1SDavid du Colombier gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 ) 2343e12c5d1SDavid du Colombier error("Too little core for state generation"); 2353e12c5d1SDavid du Colombier for(i=0;i<=tptr;i++)foll[i] = 0; 2363e12c5d1SDavid du Colombier } 2373e12c5d1SDavid du Colombier 2383e12c5d1SDavid du Colombier static void 2393e12c5d1SDavid du Colombier free2core(void) 2403e12c5d1SDavid du Colombier { 2413e12c5d1SDavid du Colombier free(positions); 2423e12c5d1SDavid du Colombier free(tmpstat); 2433e12c5d1SDavid du Colombier free(foll); 2443e12c5d1SDavid du Colombier free(name); 2453e12c5d1SDavid du Colombier free(left); 2463e12c5d1SDavid du Colombier free(right); 2473e12c5d1SDavid du Colombier free(parent); 2483e12c5d1SDavid du Colombier free(nullstr); 249*1fa40b8eSDavid du Colombier free(ptr); 2503e12c5d1SDavid du Colombier free(state); 2513e12c5d1SDavid du Colombier free(sname); 2523e12c5d1SDavid du Colombier free(stchar); 2533e12c5d1SDavid du Colombier free(ccl); 2543e12c5d1SDavid du Colombier } 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier static void 2573e12c5d1SDavid du Colombier get3core(void) 2583e12c5d1SDavid du Colombier { 2593e12c5d1SDavid du Colombier verify = myalloc(outsize,sizeof(*verify)); 2603e12c5d1SDavid du Colombier advance = myalloc(outsize,sizeof(*advance)); 2613e12c5d1SDavid du Colombier stoff = myalloc(stnum+2,sizeof(*stoff)); 2623e12c5d1SDavid du Colombier if(verify == 0 || advance == 0 || stoff == 0) 2633e12c5d1SDavid du Colombier error("Too little core for final packing"); 2643e12c5d1SDavid du Colombier } 2653e12c5d1SDavid du Colombier # ifdef DEBUG 2663e12c5d1SDavid du Colombier static void 2673e12c5d1SDavid du Colombier free3core(void){ 2683e12c5d1SDavid du Colombier free(advance); 2693e12c5d1SDavid du Colombier free(verify); 2703e12c5d1SDavid du Colombier free(stoff); 2713e12c5d1SDavid du Colombier free(gotof); 2723e12c5d1SDavid du Colombier free(nexts); 2733e12c5d1SDavid du Colombier free(nchar); 2743e12c5d1SDavid du Colombier free(atable); 2753e12c5d1SDavid du Colombier free(sfall); 2763e12c5d1SDavid du Colombier free(cpackflg); 2773e12c5d1SDavid du Colombier } 2783e12c5d1SDavid du Colombier # endif 2793e12c5d1SDavid du Colombier void * 2803e12c5d1SDavid du Colombier myalloc(int a, int b) 2813e12c5d1SDavid du Colombier { 2823e12c5d1SDavid du Colombier void *i; 2833e12c5d1SDavid du Colombier i = calloc(a, b); 2843e12c5d1SDavid du Colombier if(i==0) 2853e12c5d1SDavid du Colombier warning("OOPS - calloc returns a 0"); 2863e12c5d1SDavid du Colombier return(i); 2873e12c5d1SDavid du Colombier } 2883e12c5d1SDavid du Colombier 2893e12c5d1SDavid du Colombier void 2903e12c5d1SDavid du Colombier yyerror(char *s) 2913e12c5d1SDavid du Colombier { 292219b2ee8SDavid du Colombier fprint(2, "line %d: %s\n", yyline, s); 2933e12c5d1SDavid du Colombier } 294