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
main(int argc,char ** argv)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
get1core(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
free1core(void)214 free1core(void)
215 {
216 free(def);
217 free(subs);
218 free(dchar);
219 }
220
221 static void
get2core(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
free2core(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
get3core(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
free3core(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 *
myalloc(int a,int b)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
yyerror(char * s)293 yyerror(char *s)
294 {
295 fprint(2, "line %d: %s\n", yyline, s);
296 }
297