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 */
35*ce6131d3SDavid du Colombier char *yyfile; /* filename for error messages */
363e12c5d1SDavid du Colombier int eof;
373e12c5d1SDavid du Colombier int lgatflg;
383e12c5d1SDavid du Colombier int divflg;
393e12c5d1SDavid du Colombier int funcflag;
403e12c5d1SDavid du Colombier int pflag;
413e12c5d1SDavid du Colombier int chset; /* 1 = char set modified */
427b6cd6eaSDavid du Colombier Biobuf *fin = 0, *fother;
433e12c5d1SDavid du Colombier int fptr;
443e12c5d1SDavid du Colombier int *name;
453e12c5d1SDavid du Colombier int *left;
463e12c5d1SDavid du Colombier int *right;
473e12c5d1SDavid du Colombier int *parent;
483e12c5d1SDavid du Colombier uchar *nullstr;
4974f16c81SDavid du Colombier uchar **ptr;
503e12c5d1SDavid du Colombier int tptr;
513e12c5d1SDavid du Colombier uchar pushc[TOKENSIZE];
523e12c5d1SDavid du Colombier uchar slist[STARTSIZE];
533e12c5d1SDavid du Colombier uchar **def, **subs, *dchar;
543e12c5d1SDavid du Colombier uchar **sname, *stchar;
553e12c5d1SDavid du Colombier uchar *ccl;
563e12c5d1SDavid du Colombier uchar *ccptr;
573e12c5d1SDavid du Colombier uchar *dp, *sp;
583e12c5d1SDavid du Colombier int dptr;
593e12c5d1SDavid du Colombier uchar *bptr; /* store input position */
603e12c5d1SDavid du Colombier uchar *tmpstat;
613e12c5d1SDavid du Colombier int count;
623e12c5d1SDavid du Colombier int **foll;
633e12c5d1SDavid du Colombier int *nxtpos;
643e12c5d1SDavid du Colombier int *positions;
653e12c5d1SDavid du Colombier int *gotof;
663e12c5d1SDavid du Colombier int *nexts;
673e12c5d1SDavid du Colombier uchar *nchar;
683e12c5d1SDavid du Colombier int **state;
693e12c5d1SDavid du Colombier int *sfall; /* fallback state num */
703e12c5d1SDavid du Colombier uchar *cpackflg; /* true if state has been character packed */
713e12c5d1SDavid du Colombier int *atable;
723e12c5d1SDavid du Colombier int nptr;
733e12c5d1SDavid du Colombier uchar symbol[NCH];
743e12c5d1SDavid du Colombier uchar cindex[NCH];
753e12c5d1SDavid du Colombier int xstate;
763e12c5d1SDavid du Colombier int stnum;
773e12c5d1SDavid du Colombier uchar match[NCH];
783e12c5d1SDavid du Colombier uchar extra[NACTIONS];
793e12c5d1SDavid du Colombier uchar *pchar, *pcptr;
803e12c5d1SDavid du Colombier int pchlen = TOKENSIZE;
813e12c5d1SDavid du Colombier long rcount;
823e12c5d1SDavid du Colombier int *verify, *advance, *stoff;
833e12c5d1SDavid du Colombier int scon;
843e12c5d1SDavid du Colombier uchar *psave;
853e12c5d1SDavid du Colombier
863e12c5d1SDavid du Colombier static void free1core(void);
873e12c5d1SDavid du Colombier static void free2core(void);
883e12c5d1SDavid du Colombier static void free3core(void);
893e12c5d1SDavid du Colombier static void get1core(void);
903e12c5d1SDavid du Colombier static void get2core(void);
913e12c5d1SDavid du Colombier static void get3core(void);
923e12c5d1SDavid du Colombier
93219b2ee8SDavid du Colombier void
main(int argc,char ** argv)943e12c5d1SDavid du Colombier main(int argc, char **argv)
953e12c5d1SDavid du Colombier {
963e12c5d1SDavid du Colombier int i;
97219b2ee8SDavid du Colombier
983e12c5d1SDavid du Colombier ARGBEGIN {
993e12c5d1SDavid du Colombier # ifdef DEBUG
1003e12c5d1SDavid du Colombier case 'd': debug++; break;
1013e12c5d1SDavid du Colombier case 'y': yydebug = TRUE; break;
1023e12c5d1SDavid du Colombier # endif
1033e12c5d1SDavid du Colombier case 't': case 'T':
104219b2ee8SDavid du Colombier Binit(&fout, 1, OWRITE);
105219b2ee8SDavid du Colombier errorf= 2;
106219b2ee8SDavid du Colombier foutopen = 1;
1073e12c5d1SDavid du Colombier break;
1083e12c5d1SDavid du Colombier case 'v': case 'V':
1093e12c5d1SDavid du Colombier report = 1;
1103e12c5d1SDavid du Colombier break;
1113e12c5d1SDavid du Colombier case 'n': case 'N':
1123e12c5d1SDavid du Colombier report = 0;
1133e12c5d1SDavid du Colombier break;
1143ff48bf5SDavid du Colombier case '9':
1153ff48bf5SDavid du Colombier nine = 1;
1163ff48bf5SDavid du Colombier break;
1173e12c5d1SDavid du Colombier default:
1183e12c5d1SDavid du Colombier warning("Unknown option %c", ARGC());
1193e12c5d1SDavid du Colombier } ARGEND
1203e12c5d1SDavid du Colombier sargc = argc;
1213e12c5d1SDavid du Colombier sargv = argv;
1223e12c5d1SDavid du Colombier if (argc > 0){
123*ce6131d3SDavid du Colombier yyfile = argv[fptr++];
124*ce6131d3SDavid du Colombier fin = Bopen(yyfile, OREAD);
125219b2ee8SDavid du Colombier if(fin == 0)
126*ce6131d3SDavid du Colombier error ("%s - can't open file: %r", yyfile);
1273e12c5d1SDavid du Colombier sargc--;
1283e12c5d1SDavid du Colombier sargv++;
1293e12c5d1SDavid du Colombier }
130219b2ee8SDavid du Colombier else {
131*ce6131d3SDavid du Colombier yyfile = "/fd/0";
132219b2ee8SDavid du Colombier fin = myalloc(sizeof(Biobuf), 1);
133219b2ee8SDavid du Colombier if(fin == 0)
134219b2ee8SDavid du Colombier exits("core");
135219b2ee8SDavid du Colombier Binit(fin, 0, OREAD);
136219b2ee8SDavid du Colombier }
137219b2ee8SDavid du Colombier if(Bgetc(fin) == Beof) /* no input */
138219b2ee8SDavid du Colombier exits(0);
139219b2ee8SDavid du Colombier Bseek(fin, 0, 0);
1403e12c5d1SDavid du Colombier gch();
1413e12c5d1SDavid du Colombier /* may be gotten: def, subs, sname, stchar, ccl, dchar */
1423e12c5d1SDavid du Colombier get1core();
1431fa40b8eSDavid du Colombier /* may be gotten: name, left, right, nullstr, parent, ptr */
1443e12c5d1SDavid du Colombier strcpy((char*)sp, "INITIAL");
1453e12c5d1SDavid du Colombier sname[0] = sp;
1463e12c5d1SDavid du Colombier sp += strlen("INITIAL") + 1;
1473e12c5d1SDavid du Colombier sname[1] = 0;
1483e12c5d1SDavid du Colombier if(yyparse()) exits("error"); /* error return code */
1493e12c5d1SDavid du Colombier /* may be disposed of: def, subs, dchar */
1503e12c5d1SDavid du Colombier free1core();
1513e12c5d1SDavid du Colombier /* may be gotten: tmpstat, foll, positions, gotof, nexts, nchar, state, atable, sfall, cpackflg */
1523e12c5d1SDavid du Colombier get2core();
1533e12c5d1SDavid du Colombier ptail();
1543e12c5d1SDavid du Colombier mkmatch();
1553e12c5d1SDavid du Colombier # ifdef DEBUG
1563e12c5d1SDavid du Colombier if(debug) pccl();
1573e12c5d1SDavid du Colombier # endif
1583e12c5d1SDavid du Colombier sect = ENDSECTION;
1593e12c5d1SDavid du Colombier if(tptr>0)cfoll(tptr-1);
1603e12c5d1SDavid du Colombier # ifdef DEBUG
1613e12c5d1SDavid du Colombier if(debug)pfoll();
1623e12c5d1SDavid du Colombier # endif
1633e12c5d1SDavid du Colombier cgoto();
1643e12c5d1SDavid du Colombier # ifdef DEBUG
1653e12c5d1SDavid du Colombier if(debug){
166219b2ee8SDavid du Colombier print("Print %d states:\n",stnum+1);
1673e12c5d1SDavid du Colombier for(i=0;i<=stnum;i++)stprt(i);
1683e12c5d1SDavid du Colombier }
1693e12c5d1SDavid du Colombier # endif
1703e12c5d1SDavid du Colombier /* may be disposed of: positions, tmpstat, foll, state, name, left, right, parent, ccl, stchar, sname */
1713e12c5d1SDavid du Colombier /* may be gotten: verify, advance, stoff */
1723e12c5d1SDavid du Colombier free2core();
1733e12c5d1SDavid du Colombier get3core();
1743e12c5d1SDavid du Colombier layout();
1753e12c5d1SDavid du Colombier /* may be disposed of: verify, advance, stoff, nexts, nchar,
1763e12c5d1SDavid du Colombier gotof, atable, ccpackflg, sfall */
1773e12c5d1SDavid du Colombier # ifdef DEBUG
1783e12c5d1SDavid du Colombier free3core();
1793e12c5d1SDavid du Colombier # endif
180219b2ee8SDavid du Colombier fother = Bopen(cname,OREAD);
181219b2ee8SDavid du Colombier if(fother == 0)
182*ce6131d3SDavid du Colombier error("Lex driver missing, file %s: %r",cname);
183219b2ee8SDavid du Colombier while ( (i=Bgetc(fother)) != Beof)
184219b2ee8SDavid du Colombier Bputc(&fout, i);
1853e12c5d1SDavid du Colombier
186219b2ee8SDavid du Colombier Bterm(fother);
187219b2ee8SDavid du Colombier Bterm(&fout);
1883e12c5d1SDavid du Colombier if(
1893e12c5d1SDavid du Colombier # ifdef DEBUG
1903e12c5d1SDavid du Colombier debug ||
1913e12c5d1SDavid du Colombier # endif
1923e12c5d1SDavid du Colombier report == 1)statistics();
1937b6cd6eaSDavid du Colombier if (fin)
194219b2ee8SDavid du Colombier Bterm(fin);
1953e12c5d1SDavid du Colombier exits(0); /* success return code */
1963e12c5d1SDavid du Colombier }
1973e12c5d1SDavid du Colombier
1983e12c5d1SDavid du Colombier static void
get1core(void)1993e12c5d1SDavid du Colombier get1core(void)
2003e12c5d1SDavid du Colombier {
2013e12c5d1SDavid du Colombier ccptr = ccl = myalloc(CCLSIZE,sizeof(*ccl));
2023e12c5d1SDavid du Colombier pcptr = pchar = myalloc(pchlen, sizeof(*pchar));
2033e12c5d1SDavid du Colombier def = myalloc(DEFSIZE,sizeof(*def));
2043e12c5d1SDavid du Colombier subs = myalloc(DEFSIZE,sizeof(*subs));
2053e12c5d1SDavid du Colombier dp = dchar = myalloc(DEFCHAR,sizeof(*dchar));
2063e12c5d1SDavid du Colombier sname = myalloc(STARTSIZE,sizeof(*sname));
2073e12c5d1SDavid du Colombier sp = stchar = myalloc(STARTCHAR,sizeof(*stchar));
2083e12c5d1SDavid du Colombier if(ccl == 0 || def == 0 || subs == 0 || dchar == 0 || sname == 0 || stchar == 0)
2093e12c5d1SDavid du Colombier error("Too little core to begin");
2103e12c5d1SDavid du Colombier }
2113e12c5d1SDavid du Colombier
2123e12c5d1SDavid du Colombier static void
free1core(void)2133e12c5d1SDavid du Colombier free1core(void)
2143e12c5d1SDavid du Colombier {
2153e12c5d1SDavid du Colombier free(def);
2163e12c5d1SDavid du Colombier free(subs);
2173e12c5d1SDavid du Colombier free(dchar);
2183e12c5d1SDavid du Colombier }
2193e12c5d1SDavid du Colombier
2203e12c5d1SDavid du Colombier static void
get2core(void)2213e12c5d1SDavid du Colombier get2core(void)
2223e12c5d1SDavid du Colombier {
223219b2ee8SDavid du Colombier int i;
2243e12c5d1SDavid du Colombier
2253e12c5d1SDavid du Colombier gotof = myalloc(nstates,sizeof(*gotof));
2263e12c5d1SDavid du Colombier nexts = myalloc(ntrans,sizeof(*nexts));
2273e12c5d1SDavid du Colombier nchar = myalloc(ntrans,sizeof(*nchar));
2283e12c5d1SDavid du Colombier state = myalloc(nstates,sizeof(*state));
2293e12c5d1SDavid du Colombier atable = myalloc(nstates,sizeof(*atable));
2303e12c5d1SDavid du Colombier sfall = myalloc(nstates,sizeof(*sfall));
2313e12c5d1SDavid du Colombier cpackflg = myalloc(nstates,sizeof(*cpackflg));
2323e12c5d1SDavid du Colombier tmpstat = myalloc(tptr+1,sizeof(*tmpstat));
2333e12c5d1SDavid du Colombier foll = myalloc(tptr+1,sizeof(*foll));
2343e12c5d1SDavid du Colombier nxtpos = positions = myalloc(maxpos,sizeof(*positions));
2353e12c5d1SDavid du Colombier if(tmpstat == 0 || foll == 0 || positions == 0 ||
2363e12c5d1SDavid du Colombier gotof == 0 || nexts == 0 || nchar == 0 || state == 0 || atable == 0 || sfall == 0 || cpackflg == 0 )
2373e12c5d1SDavid du Colombier error("Too little core for state generation");
2383e12c5d1SDavid du Colombier for(i=0;i<=tptr;i++)foll[i] = 0;
2393e12c5d1SDavid du Colombier }
2403e12c5d1SDavid du Colombier
2413e12c5d1SDavid du Colombier static void
free2core(void)2423e12c5d1SDavid du Colombier free2core(void)
2433e12c5d1SDavid du Colombier {
2443e12c5d1SDavid du Colombier free(positions);
2453e12c5d1SDavid du Colombier free(tmpstat);
2463e12c5d1SDavid du Colombier free(foll);
2473e12c5d1SDavid du Colombier free(name);
2483e12c5d1SDavid du Colombier free(left);
2493e12c5d1SDavid du Colombier free(right);
2503e12c5d1SDavid du Colombier free(parent);
2513e12c5d1SDavid du Colombier free(nullstr);
2521fa40b8eSDavid du Colombier free(ptr);
2533e12c5d1SDavid du Colombier free(state);
2543e12c5d1SDavid du Colombier free(sname);
2553e12c5d1SDavid du Colombier free(stchar);
2563e12c5d1SDavid du Colombier free(ccl);
2573e12c5d1SDavid du Colombier }
2583e12c5d1SDavid du Colombier
2593e12c5d1SDavid du Colombier static void
get3core(void)2603e12c5d1SDavid du Colombier get3core(void)
2613e12c5d1SDavid du Colombier {
2623e12c5d1SDavid du Colombier verify = myalloc(outsize,sizeof(*verify));
2633e12c5d1SDavid du Colombier advance = myalloc(outsize,sizeof(*advance));
2643e12c5d1SDavid du Colombier stoff = myalloc(stnum+2,sizeof(*stoff));
2653e12c5d1SDavid du Colombier if(verify == 0 || advance == 0 || stoff == 0)
2663e12c5d1SDavid du Colombier error("Too little core for final packing");
2673e12c5d1SDavid du Colombier }
2683e12c5d1SDavid du Colombier # ifdef DEBUG
2693e12c5d1SDavid du Colombier static void
free3core(void)2703e12c5d1SDavid du Colombier free3core(void){
2713e12c5d1SDavid du Colombier free(advance);
2723e12c5d1SDavid du Colombier free(verify);
2733e12c5d1SDavid du Colombier free(stoff);
2743e12c5d1SDavid du Colombier free(gotof);
2753e12c5d1SDavid du Colombier free(nexts);
2763e12c5d1SDavid du Colombier free(nchar);
2773e12c5d1SDavid du Colombier free(atable);
2783e12c5d1SDavid du Colombier free(sfall);
2793e12c5d1SDavid du Colombier free(cpackflg);
2803e12c5d1SDavid du Colombier }
2813e12c5d1SDavid du Colombier # endif
2823e12c5d1SDavid du Colombier void *
myalloc(int a,int b)2833e12c5d1SDavid du Colombier myalloc(int a, int b)
2843e12c5d1SDavid du Colombier {
2853e12c5d1SDavid du Colombier void *i;
2863e12c5d1SDavid du Colombier i = calloc(a, b);
2873e12c5d1SDavid du Colombier if(i==0)
2883e12c5d1SDavid du Colombier warning("OOPS - calloc returns a 0");
2893e12c5d1SDavid du Colombier return(i);
2903e12c5d1SDavid du Colombier }
2913e12c5d1SDavid du Colombier
2923e12c5d1SDavid du Colombier void
yyerror(char * s)2933e12c5d1SDavid du Colombier yyerror(char *s)
2943e12c5d1SDavid du Colombier {
295*ce6131d3SDavid du Colombier fprint(2, "%s:%d %s\n", yyfile, yyline, s);
2963e12c5d1SDavid du Colombier }
297