Blame


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