Blame


1 e37302c4 2004-04-21 devnull # include "ldefs.h"
2 e37302c4 2004-04-21 devnull void
3 e37302c4 2004-04-21 devnull cfoll(int v)
4 e37302c4 2004-04-21 devnull {
5 e37302c4 2004-04-21 devnull int i,j,k;
6 e37302c4 2004-04-21 devnull uchar *p;
7 e37302c4 2004-04-21 devnull i = name[v];
8 e37302c4 2004-04-21 devnull if(i < NCH) i = 1; /* character */
9 e37302c4 2004-04-21 devnull switch(i){
10 e37302c4 2004-04-21 devnull case 1: case RSTR: case RCCL: case RNCCL: case RNULLS:
11 e37302c4 2004-04-21 devnull for(j=0;j<tptr;j++)
12 e37302c4 2004-04-21 devnull tmpstat[j] = FALSE;
13 e37302c4 2004-04-21 devnull count = 0;
14 e37302c4 2004-04-21 devnull follow(v);
15 e37302c4 2004-04-21 devnull # ifdef PP
16 e37302c4 2004-04-21 devnull padd(foll,v); /* packing version */
17 e37302c4 2004-04-21 devnull # endif
18 e37302c4 2004-04-21 devnull # ifndef PP
19 e37302c4 2004-04-21 devnull add(foll,v); /* no packing version */
20 e37302c4 2004-04-21 devnull # endif
21 e37302c4 2004-04-21 devnull if(i == RSTR) cfoll(left[v]);
22 e37302c4 2004-04-21 devnull else if(i == RCCL || i == RNCCL){ /* compress ccl list */
23 e37302c4 2004-04-21 devnull for(j=1; j<NCH;j++)
24 e37302c4 2004-04-21 devnull symbol[j] = (i==RNCCL);
25 0afb7989 2006-04-20 devnull p = ptr[v];
26 e37302c4 2004-04-21 devnull while(*p)
27 e37302c4 2004-04-21 devnull symbol[*p++] = (i == RCCL);
28 e37302c4 2004-04-21 devnull p = pcptr;
29 e37302c4 2004-04-21 devnull for(j=1;j<NCH;j++)
30 e37302c4 2004-04-21 devnull if(symbol[j]){
31 e37302c4 2004-04-21 devnull for(k=0;p+k < pcptr; k++)
32 e37302c4 2004-04-21 devnull if(cindex[j] == *(p+k))
33 e37302c4 2004-04-21 devnull break;
34 e37302c4 2004-04-21 devnull if(p+k >= pcptr)*pcptr++ = cindex[j];
35 e37302c4 2004-04-21 devnull }
36 e37302c4 2004-04-21 devnull *pcptr++ = 0;
37 e37302c4 2004-04-21 devnull if(pcptr > pchar + pchlen)
38 e37302c4 2004-04-21 devnull error("Too many packed character classes");
39 0afb7989 2006-04-20 devnull ptr[v] = p;
40 e37302c4 2004-04-21 devnull name[v] = RCCL; /* RNCCL eliminated */
41 e37302c4 2004-04-21 devnull # ifdef DEBUG
42 e37302c4 2004-04-21 devnull if(debug && *p){
43 e37302c4 2004-04-21 devnull print("ccl %d: %d",v,*p++);
44 e37302c4 2004-04-21 devnull while(*p)
45 e37302c4 2004-04-21 devnull print(", %d",*p++);
46 e37302c4 2004-04-21 devnull print("\n");
47 e37302c4 2004-04-21 devnull }
48 e37302c4 2004-04-21 devnull # endif
49 e37302c4 2004-04-21 devnull }
50 e37302c4 2004-04-21 devnull break;
51 e37302c4 2004-04-21 devnull case CARAT:
52 e37302c4 2004-04-21 devnull cfoll(left[v]);
53 e37302c4 2004-04-21 devnull break;
54 fa325e9b 2020-01-10 cross case STAR: case PLUS: case QUEST: case RSCON:
55 e37302c4 2004-04-21 devnull cfoll(left[v]);
56 e37302c4 2004-04-21 devnull break;
57 e37302c4 2004-04-21 devnull case BAR: case RCAT: case DIV: case RNEWE:
58 e37302c4 2004-04-21 devnull cfoll(left[v]);
59 e37302c4 2004-04-21 devnull cfoll(right[v]);
60 e37302c4 2004-04-21 devnull break;
61 e37302c4 2004-04-21 devnull # ifdef DEBUG
62 e37302c4 2004-04-21 devnull case FINAL:
63 e37302c4 2004-04-21 devnull case S1FINAL:
64 e37302c4 2004-04-21 devnull case S2FINAL:
65 e37302c4 2004-04-21 devnull break;
66 e37302c4 2004-04-21 devnull default:
67 e37302c4 2004-04-21 devnull warning("bad switch cfoll %d",v);
68 e37302c4 2004-04-21 devnull # endif
69 e37302c4 2004-04-21 devnull }
70 e37302c4 2004-04-21 devnull }
71 e37302c4 2004-04-21 devnull
72 e37302c4 2004-04-21 devnull # ifdef DEBUG
73 e37302c4 2004-04-21 devnull void
74 e37302c4 2004-04-21 devnull pfoll(void)
75 e37302c4 2004-04-21 devnull {
76 e37302c4 2004-04-21 devnull int i,k,*p;
77 e37302c4 2004-04-21 devnull int j;
78 e37302c4 2004-04-21 devnull /* print sets of chars which may follow positions */
79 e37302c4 2004-04-21 devnull print("pos\tchars\n");
80 e37302c4 2004-04-21 devnull for(i=0;i<tptr;i++)
81 e37302c4 2004-04-21 devnull if(p=foll[i]){
82 e37302c4 2004-04-21 devnull j = *p++;
83 e37302c4 2004-04-21 devnull if(j >= 1){
84 e37302c4 2004-04-21 devnull print("%d:\t%d",i,*p++);
85 e37302c4 2004-04-21 devnull for(k=2;k<=j;k++)
86 e37302c4 2004-04-21 devnull print(", %d",*p++);
87 e37302c4 2004-04-21 devnull print("\n");
88 e37302c4 2004-04-21 devnull }
89 e37302c4 2004-04-21 devnull }
90 e37302c4 2004-04-21 devnull }
91 e37302c4 2004-04-21 devnull # endif
92 e37302c4 2004-04-21 devnull
93 e37302c4 2004-04-21 devnull void
94 e37302c4 2004-04-21 devnull add(int **array, int n)
95 e37302c4 2004-04-21 devnull {
96 e37302c4 2004-04-21 devnull int i, *temp;
97 e37302c4 2004-04-21 devnull uchar *ctemp;
98 e37302c4 2004-04-21 devnull
99 e37302c4 2004-04-21 devnull temp = nxtpos;
100 e37302c4 2004-04-21 devnull ctemp = tmpstat;
101 e37302c4 2004-04-21 devnull array[n] = nxtpos; /* note no packing is done in positions */
102 e37302c4 2004-04-21 devnull *temp++ = count;
103 e37302c4 2004-04-21 devnull for(i=0;i<tptr;i++)
104 e37302c4 2004-04-21 devnull if(ctemp[i] == TRUE)
105 e37302c4 2004-04-21 devnull *temp++ = i;
106 e37302c4 2004-04-21 devnull nxtpos = temp;
107 e37302c4 2004-04-21 devnull if(nxtpos >= positions+maxpos)
108 e37302c4 2004-04-21 devnull error("Too many positions %s",(maxpos== MAXPOS?"\nTry using %p num":""));
109 e37302c4 2004-04-21 devnull return;
110 e37302c4 2004-04-21 devnull }
111 e37302c4 2004-04-21 devnull
112 e37302c4 2004-04-21 devnull void
113 e37302c4 2004-04-21 devnull follow(int v)
114 e37302c4 2004-04-21 devnull {
115 e37302c4 2004-04-21 devnull int p;
116 e37302c4 2004-04-21 devnull if(v >= tptr-1)return;
117 e37302c4 2004-04-21 devnull p = parent[v];
118 e37302c4 2004-04-21 devnull if(p == 0) return;
119 e37302c4 2004-04-21 devnull switch(name[p]){
120 e37302c4 2004-04-21 devnull /* will not be CHAR RNULLS FINAL S1FINAL S2FINAL RCCL RNCCL */
121 e37302c4 2004-04-21 devnull case RSTR:
122 e37302c4 2004-04-21 devnull if(tmpstat[p] == FALSE){
123 e37302c4 2004-04-21 devnull count++;
124 e37302c4 2004-04-21 devnull tmpstat[p] = TRUE;
125 e37302c4 2004-04-21 devnull }
126 e37302c4 2004-04-21 devnull break;
127 e37302c4 2004-04-21 devnull case STAR: case PLUS:
128 e37302c4 2004-04-21 devnull first(v);
129 e37302c4 2004-04-21 devnull follow(p);
130 e37302c4 2004-04-21 devnull break;
131 e37302c4 2004-04-21 devnull case BAR: case QUEST: case RNEWE:
132 e37302c4 2004-04-21 devnull follow(p);
133 e37302c4 2004-04-21 devnull break;
134 fa325e9b 2020-01-10 cross case RCAT: case DIV:
135 e37302c4 2004-04-21 devnull if(v == left[p]){
136 e37302c4 2004-04-21 devnull if(nullstr[right[p]])
137 e37302c4 2004-04-21 devnull follow(p);
138 e37302c4 2004-04-21 devnull first(right[p]);
139 e37302c4 2004-04-21 devnull }
140 e37302c4 2004-04-21 devnull else follow(p);
141 e37302c4 2004-04-21 devnull break;
142 fa325e9b 2020-01-10 cross case RSCON: case CARAT:
143 e37302c4 2004-04-21 devnull follow(p);
144 e37302c4 2004-04-21 devnull break;
145 e37302c4 2004-04-21 devnull # ifdef DEBUG
146 e37302c4 2004-04-21 devnull default:
147 e37302c4 2004-04-21 devnull warning("bad switch follow %d",p);
148 e37302c4 2004-04-21 devnull # endif
149 e37302c4 2004-04-21 devnull }
150 e37302c4 2004-04-21 devnull }
151 e37302c4 2004-04-21 devnull
152 e37302c4 2004-04-21 devnull void
153 e37302c4 2004-04-21 devnull first(int v) /* calculate set of positions with v as root which can be active initially */
154 e37302c4 2004-04-21 devnull {
155 e37302c4 2004-04-21 devnull int i;
156 e37302c4 2004-04-21 devnull uchar *p;
157 e37302c4 2004-04-21 devnull i = name[v];
158 e37302c4 2004-04-21 devnull if(i < NCH)i = 1;
159 e37302c4 2004-04-21 devnull switch(i){
160 e37302c4 2004-04-21 devnull case 1: case RCCL: case RNCCL: case RNULLS: case FINAL: case S1FINAL: case S2FINAL:
161 e37302c4 2004-04-21 devnull if(tmpstat[v] == FALSE){
162 e37302c4 2004-04-21 devnull count++;
163 e37302c4 2004-04-21 devnull tmpstat[v] = TRUE;
164 e37302c4 2004-04-21 devnull }
165 e37302c4 2004-04-21 devnull break;
166 e37302c4 2004-04-21 devnull case BAR: case RNEWE:
167 e37302c4 2004-04-21 devnull first(left[v]);
168 e37302c4 2004-04-21 devnull first(right[v]);
169 e37302c4 2004-04-21 devnull break;
170 e37302c4 2004-04-21 devnull case CARAT:
171 e37302c4 2004-04-21 devnull if(stnum % 2 == 1)
172 e37302c4 2004-04-21 devnull first(left[v]);
173 e37302c4 2004-04-21 devnull break;
174 e37302c4 2004-04-21 devnull case RSCON:
175 e37302c4 2004-04-21 devnull i = stnum/2 +1;
176 c291b2ec 2006-04-20 devnull p = (uchar*)right[v];
177 e37302c4 2004-04-21 devnull while(*p)
178 e37302c4 2004-04-21 devnull if(*p++ == i){
179 e37302c4 2004-04-21 devnull first(left[v]);
180 e37302c4 2004-04-21 devnull break;
181 e37302c4 2004-04-21 devnull }
182 e37302c4 2004-04-21 devnull break;
183 e37302c4 2004-04-21 devnull case STAR: case QUEST: case PLUS: case RSTR:
184 e37302c4 2004-04-21 devnull first(left[v]);
185 e37302c4 2004-04-21 devnull break;
186 e37302c4 2004-04-21 devnull case RCAT: case DIV:
187 e37302c4 2004-04-21 devnull first(left[v]);
188 e37302c4 2004-04-21 devnull if(nullstr[left[v]])
189 e37302c4 2004-04-21 devnull first(right[v]);
190 e37302c4 2004-04-21 devnull break;
191 e37302c4 2004-04-21 devnull # ifdef DEBUG
192 e37302c4 2004-04-21 devnull default:
193 e37302c4 2004-04-21 devnull warning("bad switch first %d",v);
194 e37302c4 2004-04-21 devnull # endif
195 e37302c4 2004-04-21 devnull }
196 e37302c4 2004-04-21 devnull }
197 e37302c4 2004-04-21 devnull
198 e37302c4 2004-04-21 devnull void
199 e37302c4 2004-04-21 devnull cgoto(void)
200 e37302c4 2004-04-21 devnull {
201 e37302c4 2004-04-21 devnull int i, j, s;
202 e37302c4 2004-04-21 devnull int npos, curpos, n;
203 e37302c4 2004-04-21 devnull int tryit;
204 e37302c4 2004-04-21 devnull uchar tch[NCH];
205 e37302c4 2004-04-21 devnull int tst[NCH];
206 e37302c4 2004-04-21 devnull uchar *q;
207 e37302c4 2004-04-21 devnull
208 e37302c4 2004-04-21 devnull /* generate initial state, for each start condition */
209 e37302c4 2004-04-21 devnull Bprint(&fout,"int yyvstop[] = {\n0,\n");
210 e37302c4 2004-04-21 devnull while(stnum < 2 || stnum/2 < sptr){
211 e37302c4 2004-04-21 devnull for(i = 0; i<tptr; i++) tmpstat[i] = 0;
212 e37302c4 2004-04-21 devnull count = 0;
213 e37302c4 2004-04-21 devnull if(tptr > 0)first(tptr-1);
214 e37302c4 2004-04-21 devnull add(state,stnum);
215 e37302c4 2004-04-21 devnull # ifdef DEBUG
216 e37302c4 2004-04-21 devnull if(debug){
217 e37302c4 2004-04-21 devnull if(stnum > 1)
218 e37302c4 2004-04-21 devnull print("%s:\n",sname[stnum/2]);
219 e37302c4 2004-04-21 devnull pstate(stnum);
220 e37302c4 2004-04-21 devnull }
221 e37302c4 2004-04-21 devnull # endif
222 e37302c4 2004-04-21 devnull stnum++;
223 e37302c4 2004-04-21 devnull }
224 e37302c4 2004-04-21 devnull stnum--;
225 e37302c4 2004-04-21 devnull /* even stnum = might not be at line begin */
226 e37302c4 2004-04-21 devnull /* odd stnum = must be at line begin */
227 e37302c4 2004-04-21 devnull /* even states can occur anywhere, odd states only at line begin */
228 e37302c4 2004-04-21 devnull for(s = 0; s <= stnum; s++){
229 e37302c4 2004-04-21 devnull tryit = FALSE;
230 e37302c4 2004-04-21 devnull cpackflg[s] = FALSE;
231 e37302c4 2004-04-21 devnull sfall[s] = -1;
232 e37302c4 2004-04-21 devnull acompute(s);
233 e37302c4 2004-04-21 devnull for(i=0;i<NCH;i++) symbol[i] = 0;
234 e37302c4 2004-04-21 devnull npos = *state[s];
235 e37302c4 2004-04-21 devnull for(i = 1; i<=npos; i++){
236 e37302c4 2004-04-21 devnull curpos = *(state[s]+i);
237 e37302c4 2004-04-21 devnull if(name[curpos] < NCH) symbol[name[curpos]] = TRUE;
238 e37302c4 2004-04-21 devnull else switch(name[curpos]){
239 e37302c4 2004-04-21 devnull case RCCL:
240 e37302c4 2004-04-21 devnull tryit = TRUE;
241 0afb7989 2006-04-20 devnull q = ptr[curpos];
242 e37302c4 2004-04-21 devnull while(*q){
243 e37302c4 2004-04-21 devnull for(j=1;j<NCH;j++)
244 e37302c4 2004-04-21 devnull if(cindex[j] == *q)
245 e37302c4 2004-04-21 devnull symbol[j] = TRUE;
246 e37302c4 2004-04-21 devnull q++;
247 e37302c4 2004-04-21 devnull }
248 e37302c4 2004-04-21 devnull break;
249 e37302c4 2004-04-21 devnull case RSTR:
250 e37302c4 2004-04-21 devnull symbol[right[curpos]] = TRUE;
251 e37302c4 2004-04-21 devnull break;
252 e37302c4 2004-04-21 devnull # ifdef DEBUG
253 e37302c4 2004-04-21 devnull case RNULLS:
254 e37302c4 2004-04-21 devnull case FINAL:
255 e37302c4 2004-04-21 devnull case S1FINAL:
256 e37302c4 2004-04-21 devnull case S2FINAL:
257 e37302c4 2004-04-21 devnull break;
258 e37302c4 2004-04-21 devnull default:
259 e37302c4 2004-04-21 devnull warning("bad switch cgoto %d state %d",curpos,s);
260 e37302c4 2004-04-21 devnull break;
261 e37302c4 2004-04-21 devnull # endif
262 e37302c4 2004-04-21 devnull }
263 e37302c4 2004-04-21 devnull }
264 e37302c4 2004-04-21 devnull # ifdef DEBUG
265 e37302c4 2004-04-21 devnull if(debug){
266 e37302c4 2004-04-21 devnull print("State %d transitions on:\n\t",s);
267 e37302c4 2004-04-21 devnull charc = 0;
268 e37302c4 2004-04-21 devnull for(i = 1; i<NCH; i++){
269 e37302c4 2004-04-21 devnull if(symbol[i]) allprint(i);
270 e37302c4 2004-04-21 devnull if(charc > LINESIZE){
271 e37302c4 2004-04-21 devnull charc = 0;
272 e37302c4 2004-04-21 devnull print("\n\t");
273 e37302c4 2004-04-21 devnull }
274 e37302c4 2004-04-21 devnull }
275 e37302c4 2004-04-21 devnull print("\n");
276 e37302c4 2004-04-21 devnull }
277 e37302c4 2004-04-21 devnull # endif
278 e37302c4 2004-04-21 devnull /* for each char, calculate next state */
279 e37302c4 2004-04-21 devnull n = 0;
280 e37302c4 2004-04-21 devnull for(i = 1; i<NCH; i++){
281 e37302c4 2004-04-21 devnull if(symbol[i]){
282 e37302c4 2004-04-21 devnull nextstate(s,i); /* executed for each state, transition pair */
283 e37302c4 2004-04-21 devnull xstate = notin(stnum);
284 e37302c4 2004-04-21 devnull if(xstate == -2) warning("bad state %d %o",s,i);
285 e37302c4 2004-04-21 devnull else if(xstate == -1){
286 e37302c4 2004-04-21 devnull if(stnum >= nstates)
287 e37302c4 2004-04-21 devnull error("Too many states %s",(nstates == NSTATES ? "\nTry using %n num":""));
288 e37302c4 2004-04-21 devnull add(state,++stnum);
289 e37302c4 2004-04-21 devnull # ifdef DEBUG
290 e37302c4 2004-04-21 devnull if(debug)pstate(stnum);
291 e37302c4 2004-04-21 devnull # endif
292 e37302c4 2004-04-21 devnull tch[n] = i;
293 e37302c4 2004-04-21 devnull tst[n++] = stnum;
294 e37302c4 2004-04-21 devnull } else { /* xstate >= 0 ==> state exists */
295 e37302c4 2004-04-21 devnull tch[n] = i;
296 e37302c4 2004-04-21 devnull tst[n++] = xstate;
297 e37302c4 2004-04-21 devnull }
298 e37302c4 2004-04-21 devnull }
299 e37302c4 2004-04-21 devnull }
300 e37302c4 2004-04-21 devnull tch[n] = 0;
301 e37302c4 2004-04-21 devnull tst[n] = -1;
302 e37302c4 2004-04-21 devnull /* pack transitions into permanent array */
303 e37302c4 2004-04-21 devnull if(n > 0) packtrans(s,tch,tst,n,tryit);
304 e37302c4 2004-04-21 devnull else gotof[s] = -1;
305 e37302c4 2004-04-21 devnull }
306 e37302c4 2004-04-21 devnull Bprint(&fout,"0};\n");
307 e37302c4 2004-04-21 devnull }
308 e37302c4 2004-04-21 devnull
309 e37302c4 2004-04-21 devnull /* Beware -- 70% of total CPU time is spent in this subroutine -
310 e37302c4 2004-04-21 devnull if you don't believe me - try it yourself ! */
311 e37302c4 2004-04-21 devnull void
312 e37302c4 2004-04-21 devnull nextstate(int s, int c)
313 e37302c4 2004-04-21 devnull {
314 e37302c4 2004-04-21 devnull int j, *newpos;
315 e37302c4 2004-04-21 devnull uchar *temp, *tz;
316 e37302c4 2004-04-21 devnull int *pos, i, *f, num, curpos, number;
317 e37302c4 2004-04-21 devnull /* state to goto from state s on char c */
318 e37302c4 2004-04-21 devnull num = *state[s];
319 e37302c4 2004-04-21 devnull temp = tmpstat;
320 e37302c4 2004-04-21 devnull pos = state[s] + 1;
321 e37302c4 2004-04-21 devnull for(i = 0; i<num; i++){
322 e37302c4 2004-04-21 devnull curpos = *pos++;
323 e37302c4 2004-04-21 devnull j = name[curpos];
324 e37302c4 2004-04-21 devnull if(j < NCH && j == c
325 e37302c4 2004-04-21 devnull || j == RSTR && c == right[curpos]
326 0afb7989 2006-04-20 devnull || j == RCCL && member(c, ptr[curpos])){
327 e37302c4 2004-04-21 devnull f = foll[curpos];
328 e37302c4 2004-04-21 devnull number = *f;
329 e37302c4 2004-04-21 devnull newpos = f+1;
330 e37302c4 2004-04-21 devnull for(j=0;j<number;j++)
331 e37302c4 2004-04-21 devnull temp[*newpos++] = 2;
332 e37302c4 2004-04-21 devnull }
333 e37302c4 2004-04-21 devnull }
334 e37302c4 2004-04-21 devnull j = 0;
335 e37302c4 2004-04-21 devnull tz = temp + tptr;
336 e37302c4 2004-04-21 devnull while(temp < tz){
337 e37302c4 2004-04-21 devnull if(*temp == 2){
338 e37302c4 2004-04-21 devnull j++;
339 e37302c4 2004-04-21 devnull *temp++ = 1;
340 e37302c4 2004-04-21 devnull }
341 e37302c4 2004-04-21 devnull else *temp++ = 0;
342 e37302c4 2004-04-21 devnull }
343 e37302c4 2004-04-21 devnull count = j;
344 e37302c4 2004-04-21 devnull }
345 e37302c4 2004-04-21 devnull
346 e37302c4 2004-04-21 devnull int
347 e37302c4 2004-04-21 devnull notin(int n)
348 e37302c4 2004-04-21 devnull { /* see if tmpstat occurs previously */
349 e37302c4 2004-04-21 devnull int *j,k;
350 e37302c4 2004-04-21 devnull uchar *temp;
351 e37302c4 2004-04-21 devnull int i;
352 e37302c4 2004-04-21 devnull
353 e37302c4 2004-04-21 devnull if(count == 0)
354 e37302c4 2004-04-21 devnull return(-2);
355 e37302c4 2004-04-21 devnull temp = tmpstat;
356 e37302c4 2004-04-21 devnull for(i=n;i>=0;i--){ /* for each state */
357 e37302c4 2004-04-21 devnull j = state[i];
358 e37302c4 2004-04-21 devnull if(count == *j++){
359 e37302c4 2004-04-21 devnull for(k=0;k<count;k++)
360 e37302c4 2004-04-21 devnull if(!temp[*j++])break;
361 e37302c4 2004-04-21 devnull if(k >= count)
362 e37302c4 2004-04-21 devnull return(i);
363 e37302c4 2004-04-21 devnull }
364 e37302c4 2004-04-21 devnull }
365 e37302c4 2004-04-21 devnull return(-1);
366 e37302c4 2004-04-21 devnull }
367 e37302c4 2004-04-21 devnull
368 e37302c4 2004-04-21 devnull void
369 e37302c4 2004-04-21 devnull packtrans(int st, uchar *tch, int *tst, int cnt, int tryit)
370 e37302c4 2004-04-21 devnull {
371 e37302c4 2004-04-21 devnull /* pack transitions into nchar, nexts */
372 e37302c4 2004-04-21 devnull /* nchar is terminated by '\0', nexts uses cnt, followed by elements */
373 e37302c4 2004-04-21 devnull /* gotof[st] = index into nchr, nexts for state st */
374 e37302c4 2004-04-21 devnull
375 e37302c4 2004-04-21 devnull /* sfall[st] = t implies t is fall back state for st */
376 e37302c4 2004-04-21 devnull /* == -1 implies no fall back */
377 e37302c4 2004-04-21 devnull
378 e37302c4 2004-04-21 devnull int i,j,k;
379 e37302c4 2004-04-21 devnull int cmin, cval, tcnt, diff, p, *ast;
380 e37302c4 2004-04-21 devnull uchar *ach;
381 e37302c4 2004-04-21 devnull int go[NCH], temp[NCH], c;
382 e37302c4 2004-04-21 devnull int swork[NCH];
383 e37302c4 2004-04-21 devnull uchar cwork[NCH];
384 e37302c4 2004-04-21 devnull int upper;
385 e37302c4 2004-04-21 devnull
386 e37302c4 2004-04-21 devnull rcount += cnt;
387 e37302c4 2004-04-21 devnull cmin = -1;
388 e37302c4 2004-04-21 devnull cval = NCH;
389 e37302c4 2004-04-21 devnull ast = tst;
390 e37302c4 2004-04-21 devnull ach = tch;
391 e37302c4 2004-04-21 devnull /* try to pack transitions using ccl's */
392 e37302c4 2004-04-21 devnull if(tryit){ /* ccl's used */
393 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++){
394 e37302c4 2004-04-21 devnull go[i] = temp[i] = -1;
395 e37302c4 2004-04-21 devnull symbol[i] = 1;
396 e37302c4 2004-04-21 devnull }
397 e37302c4 2004-04-21 devnull for(i=0;i<cnt;i++){
398 e37302c4 2004-04-21 devnull go[tch[i]] = tst[i];
399 e37302c4 2004-04-21 devnull symbol[tch[i]] = 0;
400 e37302c4 2004-04-21 devnull }
401 e37302c4 2004-04-21 devnull for(i=0; i<cnt;i++){
402 e37302c4 2004-04-21 devnull c = match[tch[i]];
403 e37302c4 2004-04-21 devnull if(go[c] != tst[i] || c == tch[i])
404 e37302c4 2004-04-21 devnull temp[tch[i]] = tst[i];
405 e37302c4 2004-04-21 devnull }
406 e37302c4 2004-04-21 devnull /* fill in error entries */
407 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
408 e37302c4 2004-04-21 devnull if(symbol[i]) temp[i] = -2; /* error trans */
409 e37302c4 2004-04-21 devnull /* count them */
410 e37302c4 2004-04-21 devnull k = 0;
411 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
412 e37302c4 2004-04-21 devnull if(temp[i] != -1)k++;
413 e37302c4 2004-04-21 devnull if(k <cnt){ /* compress by char */
414 e37302c4 2004-04-21 devnull # ifdef DEBUG
415 e37302c4 2004-04-21 devnull if(debug) print("use compression %d, %d vs %d\n",st,k,cnt);
416 e37302c4 2004-04-21 devnull # endif
417 e37302c4 2004-04-21 devnull k = 0;
418 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
419 e37302c4 2004-04-21 devnull if(temp[i] != -1){
420 e37302c4 2004-04-21 devnull cwork[k] = i;
421 e37302c4 2004-04-21 devnull swork[k++] = (temp[i] == -2 ? -1 : temp[i]);
422 e37302c4 2004-04-21 devnull }
423 e37302c4 2004-04-21 devnull cwork[k] = 0;
424 e37302c4 2004-04-21 devnull # ifdef PC
425 e37302c4 2004-04-21 devnull ach = cwork;
426 e37302c4 2004-04-21 devnull ast = swork;
427 e37302c4 2004-04-21 devnull cnt = k;
428 e37302c4 2004-04-21 devnull cpackflg[st] = TRUE;
429 e37302c4 2004-04-21 devnull # endif
430 e37302c4 2004-04-21 devnull }
431 e37302c4 2004-04-21 devnull }
432 e37302c4 2004-04-21 devnull for(i=0; i<st; i++){ /* get most similar state */
433 e37302c4 2004-04-21 devnull /* reject state with more transitions, state already represented by a third state,
434 e37302c4 2004-04-21 devnull and state which is compressed by char if ours is not to be */
435 e37302c4 2004-04-21 devnull if(sfall[i] != -1) continue;
436 e37302c4 2004-04-21 devnull if(cpackflg[st] == 1) if(!(cpackflg[i] == 1)) continue;
437 e37302c4 2004-04-21 devnull p = gotof[i];
438 e37302c4 2004-04-21 devnull if(p == -1) /* no transitions */ continue;
439 e37302c4 2004-04-21 devnull tcnt = nexts[p];
440 e37302c4 2004-04-21 devnull if(tcnt > cnt) continue;
441 e37302c4 2004-04-21 devnull diff = 0;
442 e37302c4 2004-04-21 devnull j = 0;
443 e37302c4 2004-04-21 devnull upper = p + tcnt;
444 e37302c4 2004-04-21 devnull while(ach[j] && p < upper){
445 e37302c4 2004-04-21 devnull while(ach[j] < nchar[p] && ach[j]){diff++; j++; }
446 e37302c4 2004-04-21 devnull if(ach[j] == 0)break;
447 e37302c4 2004-04-21 devnull if(ach[j] > nchar[p]){diff=NCH;break;}
448 e37302c4 2004-04-21 devnull /* ach[j] == nchar[p] */
449 e37302c4 2004-04-21 devnull if(ast[j] != nexts[++p] || ast[j] == -1 || (cpackflg[st] && ach[j] != match[ach[j]]))diff++;
450 e37302c4 2004-04-21 devnull j++;
451 e37302c4 2004-04-21 devnull }
452 e37302c4 2004-04-21 devnull while(ach[j]){
453 e37302c4 2004-04-21 devnull diff++;
454 e37302c4 2004-04-21 devnull j++;
455 e37302c4 2004-04-21 devnull }
456 e37302c4 2004-04-21 devnull if(p < upper)diff = NCH;
457 e37302c4 2004-04-21 devnull if(diff < cval && diff < tcnt){
458 e37302c4 2004-04-21 devnull cval = diff;
459 e37302c4 2004-04-21 devnull cmin = i;
460 e37302c4 2004-04-21 devnull if(cval == 0)break;
461 e37302c4 2004-04-21 devnull }
462 e37302c4 2004-04-21 devnull }
463 e37302c4 2004-04-21 devnull /* cmin = state "most like" state st */
464 e37302c4 2004-04-21 devnull # ifdef DEBUG
465 e37302c4 2004-04-21 devnull if(debug)print("select st %d for st %d diff %d\n",cmin,st,cval);
466 e37302c4 2004-04-21 devnull # endif
467 e37302c4 2004-04-21 devnull # ifdef PS
468 e37302c4 2004-04-21 devnull if(cmin != -1){ /* if we can use st cmin */
469 e37302c4 2004-04-21 devnull gotof[st] = nptr;
470 e37302c4 2004-04-21 devnull k = 0;
471 e37302c4 2004-04-21 devnull sfall[st] = cmin;
472 e37302c4 2004-04-21 devnull p = gotof[cmin]+1;
473 e37302c4 2004-04-21 devnull j = 0;
474 e37302c4 2004-04-21 devnull while(ach[j]){
475 e37302c4 2004-04-21 devnull /* if cmin has a transition on c, then so will st */
476 e37302c4 2004-04-21 devnull /* st may be "larger" than cmin, however */
477 e37302c4 2004-04-21 devnull while(ach[j] < nchar[p-1] && ach[j]){
478 e37302c4 2004-04-21 devnull k++;
479 e37302c4 2004-04-21 devnull nchar[nptr] = ach[j];
480 e37302c4 2004-04-21 devnull nexts[++nptr] = ast[j];
481 e37302c4 2004-04-21 devnull j++;
482 e37302c4 2004-04-21 devnull }
483 e37302c4 2004-04-21 devnull if(nchar[p-1] == 0)break;
484 e37302c4 2004-04-21 devnull if(ach[j] > nchar[p-1]){
485 e37302c4 2004-04-21 devnull warning("bad transition %d %d",st,cmin);
486 e37302c4 2004-04-21 devnull goto nopack;
487 e37302c4 2004-04-21 devnull }
488 e37302c4 2004-04-21 devnull /* ach[j] == nchar[p-1] */
489 e37302c4 2004-04-21 devnull if(ast[j] != nexts[p] || ast[j] == -1 || (cpackflg[st] && ach[j] != match[ach[j]])){
490 e37302c4 2004-04-21 devnull k++;
491 e37302c4 2004-04-21 devnull nchar[nptr] = ach[j];
492 e37302c4 2004-04-21 devnull nexts[++nptr] = ast[j];
493 e37302c4 2004-04-21 devnull }
494 e37302c4 2004-04-21 devnull p++;
495 e37302c4 2004-04-21 devnull j++;
496 e37302c4 2004-04-21 devnull }
497 e37302c4 2004-04-21 devnull while(ach[j]){
498 e37302c4 2004-04-21 devnull nchar[nptr] = ach[j];
499 e37302c4 2004-04-21 devnull nexts[++nptr] = ast[j++];
500 e37302c4 2004-04-21 devnull k++;
501 e37302c4 2004-04-21 devnull }
502 e37302c4 2004-04-21 devnull nexts[gotof[st]] = cnt = k;
503 e37302c4 2004-04-21 devnull nchar[nptr++] = 0;
504 e37302c4 2004-04-21 devnull } else {
505 e37302c4 2004-04-21 devnull # endif
506 e37302c4 2004-04-21 devnull nopack:
507 e37302c4 2004-04-21 devnull /* stick it in */
508 e37302c4 2004-04-21 devnull gotof[st] = nptr;
509 e37302c4 2004-04-21 devnull nexts[nptr] = cnt;
510 e37302c4 2004-04-21 devnull for(i=0;i<cnt;i++){
511 e37302c4 2004-04-21 devnull nchar[nptr] = ach[i];
512 e37302c4 2004-04-21 devnull nexts[++nptr] = ast[i];
513 e37302c4 2004-04-21 devnull }
514 e37302c4 2004-04-21 devnull nchar[nptr++] = 0;
515 e37302c4 2004-04-21 devnull # ifdef PS
516 e37302c4 2004-04-21 devnull }
517 e37302c4 2004-04-21 devnull # endif
518 e37302c4 2004-04-21 devnull if(cnt < 1){
519 e37302c4 2004-04-21 devnull gotof[st] = -1;
520 e37302c4 2004-04-21 devnull nptr--;
521 e37302c4 2004-04-21 devnull } else
522 e37302c4 2004-04-21 devnull if(nptr > ntrans)
523 e37302c4 2004-04-21 devnull error("Too many transitions %s",(ntrans==NTRANS?"\nTry using %a num":""));
524 e37302c4 2004-04-21 devnull }
525 e37302c4 2004-04-21 devnull
526 e37302c4 2004-04-21 devnull # ifdef DEBUG
527 e37302c4 2004-04-21 devnull void
528 e37302c4 2004-04-21 devnull pstate(int s)
529 e37302c4 2004-04-21 devnull {
530 e37302c4 2004-04-21 devnull int *p,i,j;
531 e37302c4 2004-04-21 devnull print("State %d:\n",s);
532 e37302c4 2004-04-21 devnull p = state[s];
533 e37302c4 2004-04-21 devnull i = *p++;
534 e37302c4 2004-04-21 devnull if(i == 0) return;
535 e37302c4 2004-04-21 devnull print("%4d",*p++);
536 e37302c4 2004-04-21 devnull for(j = 1; j<i; j++){
537 e37302c4 2004-04-21 devnull print(", %4d",*p++);
538 e37302c4 2004-04-21 devnull if(j%30 == 0)print("\n");
539 e37302c4 2004-04-21 devnull }
540 e37302c4 2004-04-21 devnull print("\n");
541 e37302c4 2004-04-21 devnull return;
542 e37302c4 2004-04-21 devnull }
543 e37302c4 2004-04-21 devnull # endif
544 e37302c4 2004-04-21 devnull
545 e37302c4 2004-04-21 devnull int
546 e37302c4 2004-04-21 devnull member(int d, uchar *t)
547 e37302c4 2004-04-21 devnull {
548 e37302c4 2004-04-21 devnull int c;
549 e37302c4 2004-04-21 devnull uchar *s;
550 e37302c4 2004-04-21 devnull
551 e37302c4 2004-04-21 devnull c = d;
552 e37302c4 2004-04-21 devnull s = t;
553 e37302c4 2004-04-21 devnull c = cindex[c];
554 e37302c4 2004-04-21 devnull while(*s)
555 e37302c4 2004-04-21 devnull if(*s++ == c) return(1);
556 e37302c4 2004-04-21 devnull return(0);
557 e37302c4 2004-04-21 devnull }
558 e37302c4 2004-04-21 devnull
559 e37302c4 2004-04-21 devnull # ifdef DEBUG
560 e37302c4 2004-04-21 devnull void
561 e37302c4 2004-04-21 devnull stprt(int i)
562 e37302c4 2004-04-21 devnull {
563 e37302c4 2004-04-21 devnull int p, t;
564 e37302c4 2004-04-21 devnull
565 e37302c4 2004-04-21 devnull print("State %d:",i);
566 e37302c4 2004-04-21 devnull /* print actions, if any */
567 e37302c4 2004-04-21 devnull t = atable[i];
568 e37302c4 2004-04-21 devnull if(t != -1)print(" final");
569 e37302c4 2004-04-21 devnull print("\n");
570 e37302c4 2004-04-21 devnull if(cpackflg[i] == TRUE)print("backup char in use\n");
571 e37302c4 2004-04-21 devnull if(sfall[i] != -1)print("fall back state %d\n",sfall[i]);
572 e37302c4 2004-04-21 devnull p = gotof[i];
573 e37302c4 2004-04-21 devnull if(p == -1) return;
574 e37302c4 2004-04-21 devnull print("(%d transitions)\n",nexts[p]);
575 e37302c4 2004-04-21 devnull while(nchar[p]){
576 e37302c4 2004-04-21 devnull charc = 0;
577 e37302c4 2004-04-21 devnull if(nexts[p+1] >= 0)
578 e37302c4 2004-04-21 devnull print("%d\t",nexts[p+1]);
579 e37302c4 2004-04-21 devnull else print("err\t");
580 e37302c4 2004-04-21 devnull allprint(nchar[p++]);
581 e37302c4 2004-04-21 devnull while(nexts[p] == nexts[p+1] && nchar[p]){
582 e37302c4 2004-04-21 devnull if(charc > LINESIZE){
583 e37302c4 2004-04-21 devnull charc = 0;
584 e37302c4 2004-04-21 devnull print("\n\t");
585 e37302c4 2004-04-21 devnull }
586 e37302c4 2004-04-21 devnull allprint(nchar[p++]);
587 e37302c4 2004-04-21 devnull }
588 e37302c4 2004-04-21 devnull print("\n");
589 e37302c4 2004-04-21 devnull }
590 e37302c4 2004-04-21 devnull print("\n");
591 e37302c4 2004-04-21 devnull }
592 e37302c4 2004-04-21 devnull # endif
593 e37302c4 2004-04-21 devnull
594 e37302c4 2004-04-21 devnull void
595 e37302c4 2004-04-21 devnull acompute(int s) /* compute action list = set of poss. actions */
596 e37302c4 2004-04-21 devnull {
597 e37302c4 2004-04-21 devnull int *p, i, j;
598 e37302c4 2004-04-21 devnull int cnt, m;
599 e37302c4 2004-04-21 devnull int temp[300], k, neg[300], n;
600 e37302c4 2004-04-21 devnull
601 e37302c4 2004-04-21 devnull k = 0;
602 e37302c4 2004-04-21 devnull n = 0;
603 e37302c4 2004-04-21 devnull p = state[s];
604 e37302c4 2004-04-21 devnull cnt = *p++;
605 e37302c4 2004-04-21 devnull if(cnt > 300)
606 e37302c4 2004-04-21 devnull error("Too many positions for one state - acompute");
607 e37302c4 2004-04-21 devnull for(i=0;i<cnt;i++){
608 e37302c4 2004-04-21 devnull if(name[*p] == FINAL)temp[k++] = left[*p];
609 e37302c4 2004-04-21 devnull else if(name[*p] == S1FINAL){temp[k++] = left[*p];
610 e37302c4 2004-04-21 devnull if (left[*p] >= NACTIONS) error("Too many right contexts");
611 e37302c4 2004-04-21 devnull extra[left[*p]] = 1;
612 e37302c4 2004-04-21 devnull } else if(name[*p] == S2FINAL)neg[n++] = left[*p];
613 e37302c4 2004-04-21 devnull p++;
614 e37302c4 2004-04-21 devnull }
615 e37302c4 2004-04-21 devnull atable[s] = -1;
616 e37302c4 2004-04-21 devnull if(k < 1 && n < 1) return;
617 e37302c4 2004-04-21 devnull # ifdef DEBUG
618 e37302c4 2004-04-21 devnull if(debug) print("final %d actions:",s);
619 e37302c4 2004-04-21 devnull # endif
620 e37302c4 2004-04-21 devnull /* sort action list */
621 e37302c4 2004-04-21 devnull for(i=0; i<k; i++)
622 e37302c4 2004-04-21 devnull for(j=i+1;j<k;j++)
623 e37302c4 2004-04-21 devnull if(temp[j] < temp[i]){
624 e37302c4 2004-04-21 devnull m = temp[j];
625 e37302c4 2004-04-21 devnull temp[j] = temp[i];
626 e37302c4 2004-04-21 devnull temp[i] = m;
627 e37302c4 2004-04-21 devnull }
628 e37302c4 2004-04-21 devnull /* remove dups */
629 e37302c4 2004-04-21 devnull for(i=0;i<k-1;i++)
630 e37302c4 2004-04-21 devnull if(temp[i] == temp[i+1]) temp[i] = 0;
631 e37302c4 2004-04-21 devnull /* copy to permanent quarters */
632 e37302c4 2004-04-21 devnull atable[s] = aptr;
633 e37302c4 2004-04-21 devnull # ifdef DEBUG
634 e37302c4 2004-04-21 devnull Bprint(&fout,"/* actions for state %d */",s);
635 e37302c4 2004-04-21 devnull # endif
636 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
637 e37302c4 2004-04-21 devnull for(i=0;i<k;i++)
638 e37302c4 2004-04-21 devnull if(temp[i] != 0){
639 e37302c4 2004-04-21 devnull Bprint(&fout,"%d,\n",temp[i]);
640 e37302c4 2004-04-21 devnull # ifdef DEBUG
641 e37302c4 2004-04-21 devnull if(debug)
642 e37302c4 2004-04-21 devnull print("%d ",temp[i]);
643 e37302c4 2004-04-21 devnull # endif
644 e37302c4 2004-04-21 devnull aptr++;
645 e37302c4 2004-04-21 devnull }
646 e37302c4 2004-04-21 devnull for(i=0;i<n;i++){ /* copy fall back actions - all neg */
647 e37302c4 2004-04-21 devnull Bprint(&fout,"%d,\n",neg[i]);
648 e37302c4 2004-04-21 devnull aptr++;
649 e37302c4 2004-04-21 devnull # ifdef DEBUG
650 e37302c4 2004-04-21 devnull if(debug)print("%d ",neg[i]);
651 e37302c4 2004-04-21 devnull # endif
652 e37302c4 2004-04-21 devnull }
653 e37302c4 2004-04-21 devnull # ifdef DEBUG
654 e37302c4 2004-04-21 devnull if(debug)print("\n");
655 e37302c4 2004-04-21 devnull # endif
656 e37302c4 2004-04-21 devnull Bprint(&fout,"0,\n");
657 e37302c4 2004-04-21 devnull aptr++;
658 e37302c4 2004-04-21 devnull return;
659 e37302c4 2004-04-21 devnull }
660 e37302c4 2004-04-21 devnull
661 e37302c4 2004-04-21 devnull # ifdef DEBUG
662 e37302c4 2004-04-21 devnull void
663 e37302c4 2004-04-21 devnull pccl(void) {
664 e37302c4 2004-04-21 devnull /* print character class sets */
665 e37302c4 2004-04-21 devnull int i, j;
666 e37302c4 2004-04-21 devnull
667 e37302c4 2004-04-21 devnull print("char class intersection\n");
668 e37302c4 2004-04-21 devnull for(i=0; i< ccount; i++){
669 e37302c4 2004-04-21 devnull charc = 0;
670 e37302c4 2004-04-21 devnull print("class %d:\n\t",i);
671 e37302c4 2004-04-21 devnull for(j=1;j<NCH;j++)
672 e37302c4 2004-04-21 devnull if(cindex[j] == i){
673 e37302c4 2004-04-21 devnull allprint(j);
674 e37302c4 2004-04-21 devnull if(charc > LINESIZE){
675 e37302c4 2004-04-21 devnull print("\n\t");
676 e37302c4 2004-04-21 devnull charc = 0;
677 e37302c4 2004-04-21 devnull }
678 e37302c4 2004-04-21 devnull }
679 e37302c4 2004-04-21 devnull print("\n");
680 e37302c4 2004-04-21 devnull }
681 e37302c4 2004-04-21 devnull charc = 0;
682 e37302c4 2004-04-21 devnull print("match:\n");
683 e37302c4 2004-04-21 devnull for(i=0;i<NCH;i++){
684 e37302c4 2004-04-21 devnull allprint(match[i]);
685 e37302c4 2004-04-21 devnull if(charc > LINESIZE){
686 e37302c4 2004-04-21 devnull print("\n");
687 e37302c4 2004-04-21 devnull charc = 0;
688 e37302c4 2004-04-21 devnull }
689 e37302c4 2004-04-21 devnull }
690 e37302c4 2004-04-21 devnull print("\n");
691 e37302c4 2004-04-21 devnull return;
692 e37302c4 2004-04-21 devnull }
693 e37302c4 2004-04-21 devnull # endif
694 e37302c4 2004-04-21 devnull
695 e37302c4 2004-04-21 devnull void
696 e37302c4 2004-04-21 devnull mkmatch(void)
697 e37302c4 2004-04-21 devnull {
698 e37302c4 2004-04-21 devnull int i;
699 e37302c4 2004-04-21 devnull uchar tab[NCH];
700 e37302c4 2004-04-21 devnull
701 e37302c4 2004-04-21 devnull for(i=0; i<ccount; i++)
702 e37302c4 2004-04-21 devnull tab[i] = 0;
703 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
704 e37302c4 2004-04-21 devnull if(tab[cindex[i]] == 0)
705 e37302c4 2004-04-21 devnull tab[cindex[i]] = i;
706 e37302c4 2004-04-21 devnull /* tab[i] = principal char for new ccl i */
707 e37302c4 2004-04-21 devnull for(i = 1; i<NCH; i++)
708 e37302c4 2004-04-21 devnull match[i] = tab[cindex[i]];
709 e37302c4 2004-04-21 devnull return;
710 e37302c4 2004-04-21 devnull }
711 e37302c4 2004-04-21 devnull
712 e37302c4 2004-04-21 devnull void
713 e37302c4 2004-04-21 devnull layout(void)
714 e37302c4 2004-04-21 devnull {
715 e37302c4 2004-04-21 devnull /* format and output final program's tables */
716 e37302c4 2004-04-21 devnull int i, j, k;
717 e37302c4 2004-04-21 devnull int top, bot, startup, omin;
718 e37302c4 2004-04-21 devnull
719 e37302c4 2004-04-21 devnull for(i=0; i<outsize;i++)
720 e37302c4 2004-04-21 devnull verify[i] = advance[i] = 0;
721 e37302c4 2004-04-21 devnull omin = 0;
722 e37302c4 2004-04-21 devnull yytop = 0;
723 e37302c4 2004-04-21 devnull for(i=0; i<= stnum; i++){ /* for each state */
724 e37302c4 2004-04-21 devnull j = gotof[i];
725 e37302c4 2004-04-21 devnull if(j == -1){
726 e37302c4 2004-04-21 devnull stoff[i] = 0;
727 e37302c4 2004-04-21 devnull continue;
728 e37302c4 2004-04-21 devnull }
729 e37302c4 2004-04-21 devnull bot = j;
730 e37302c4 2004-04-21 devnull while(nchar[j])j++;
731 e37302c4 2004-04-21 devnull top = j - 1;
732 e37302c4 2004-04-21 devnull # ifdef DEBUG
733 e37302c4 2004-04-21 devnull if (debug) {
734 e37302c4 2004-04-21 devnull print("State %d: (layout)\n", i);
735 e37302c4 2004-04-21 devnull for(j=bot; j<=top;j++) {
736 e37302c4 2004-04-21 devnull print(" %o", nchar[j]);
737 e37302c4 2004-04-21 devnull if (j%10==0) print("\n");
738 e37302c4 2004-04-21 devnull }
739 e37302c4 2004-04-21 devnull print("\n");
740 e37302c4 2004-04-21 devnull }
741 e37302c4 2004-04-21 devnull # endif
742 e37302c4 2004-04-21 devnull while(verify[omin+NCH]) omin++;
743 e37302c4 2004-04-21 devnull startup = omin;
744 e37302c4 2004-04-21 devnull # ifdef DEBUG
745 e37302c4 2004-04-21 devnull if (debug) print("bot,top %d, %d startup begins %d\n",bot,top,startup);
746 e37302c4 2004-04-21 devnull # endif
747 e37302c4 2004-04-21 devnull do {
748 e37302c4 2004-04-21 devnull startup += 1;
749 e37302c4 2004-04-21 devnull if(startup > outsize - NCH)
750 e37302c4 2004-04-21 devnull error("output table overflow");
751 e37302c4 2004-04-21 devnull for(j = bot; j<= top; j++){
752 e37302c4 2004-04-21 devnull k = startup + nchar[j];
753 e37302c4 2004-04-21 devnull if(verify[k])break;
754 e37302c4 2004-04-21 devnull }
755 e37302c4 2004-04-21 devnull } while (j <= top);
756 e37302c4 2004-04-21 devnull /* have found place */
757 e37302c4 2004-04-21 devnull # ifdef DEBUG
758 e37302c4 2004-04-21 devnull if (debug) print(" startup going to be %d\n", startup);
759 e37302c4 2004-04-21 devnull # endif
760 e37302c4 2004-04-21 devnull for(j = bot; j<= top; j++){
761 e37302c4 2004-04-21 devnull k = startup + nchar[j];
762 e37302c4 2004-04-21 devnull verify[k] = i+1; /* state number + 1*/
763 e37302c4 2004-04-21 devnull advance[k] = nexts[j+1]+1; /* state number + 1*/
764 e37302c4 2004-04-21 devnull if(yytop < k) yytop = k;
765 e37302c4 2004-04-21 devnull }
766 e37302c4 2004-04-21 devnull stoff[i] = startup;
767 e37302c4 2004-04-21 devnull }
768 e37302c4 2004-04-21 devnull
769 e37302c4 2004-04-21 devnull /* stoff[i] = offset into verify, advance for trans for state i */
770 e37302c4 2004-04-21 devnull /* put out yywork */
771 e37302c4 2004-04-21 devnull Bprint(&fout,"# define YYTYPE %s\n",stnum+1 >= NCH ? "int" : "Uchar");
772 e37302c4 2004-04-21 devnull Bprint(&fout,"struct yywork { YYTYPE verify, advance; } yycrank[] = {\n");
773 e37302c4 2004-04-21 devnull for(i=0;i<=yytop;i+=4){
774 e37302c4 2004-04-21 devnull for(j=0;j<4;j++){
775 e37302c4 2004-04-21 devnull k = i+j;
776 e37302c4 2004-04-21 devnull if(verify[k])
777 e37302c4 2004-04-21 devnull Bprint(&fout,"%d,%d,\t",verify[k],advance[k]);
778 e37302c4 2004-04-21 devnull else
779 e37302c4 2004-04-21 devnull Bprint(&fout,"0,0,\t");
780 e37302c4 2004-04-21 devnull }
781 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
782 e37302c4 2004-04-21 devnull }
783 e37302c4 2004-04-21 devnull Bprint(&fout,"0,0};\n");
784 e37302c4 2004-04-21 devnull
785 e37302c4 2004-04-21 devnull /* put out yysvec */
786 e37302c4 2004-04-21 devnull
787 e37302c4 2004-04-21 devnull Bprint(&fout,"struct yysvf yysvec[] = {\n");
788 e37302c4 2004-04-21 devnull Bprint(&fout,"0,\t0,\t0,\n");
789 e37302c4 2004-04-21 devnull for(i=0;i<=stnum;i++){ /* for each state */
790 e37302c4 2004-04-21 devnull if(cpackflg[i])stoff[i] = -stoff[i];
791 e37302c4 2004-04-21 devnull Bprint(&fout,"yycrank+%d,\t",stoff[i]);
792 e37302c4 2004-04-21 devnull if(sfall[i] != -1)
793 e37302c4 2004-04-21 devnull Bprint(&fout,"yysvec+%d,\t", sfall[i]+1); /* state + 1 */
794 e37302c4 2004-04-21 devnull else Bprint(&fout,"0,\t\t");
795 e37302c4 2004-04-21 devnull if(atable[i] != -1)
796 e37302c4 2004-04-21 devnull Bprint(&fout,"yyvstop+%d,",atable[i]);
797 e37302c4 2004-04-21 devnull else Bprint(&fout,"0,\t");
798 e37302c4 2004-04-21 devnull # ifdef DEBUG
799 e37302c4 2004-04-21 devnull Bprint(&fout,"\t\t/* state %d */",i);
800 e37302c4 2004-04-21 devnull # endif
801 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
802 e37302c4 2004-04-21 devnull }
803 e37302c4 2004-04-21 devnull Bprint(&fout,"0,\t0,\t0};\n");
804 e37302c4 2004-04-21 devnull
805 e37302c4 2004-04-21 devnull /* put out yymatch */
806 fa325e9b 2020-01-10 cross
807 e37302c4 2004-04-21 devnull Bprint(&fout,"struct yywork *yytop = yycrank+%d;\n",yytop);
808 e37302c4 2004-04-21 devnull Bprint(&fout,"struct yysvf *yybgin = yysvec+1;\n");
809 e37302c4 2004-04-21 devnull Bprint(&fout,"Uchar yymatch[] = {\n");
810 e37302c4 2004-04-21 devnull for(i=0; i<NCH; i+=8){
811 e37302c4 2004-04-21 devnull for(j=0; j<8; j++){
812 e37302c4 2004-04-21 devnull int fbch;
813 e37302c4 2004-04-21 devnull fbch = match[i+j];
814 e37302c4 2004-04-21 devnull if(isprint(fbch) && fbch != '\'' && fbch != '\\')
815 e37302c4 2004-04-21 devnull Bprint(&fout,"'%c' ,",fbch);
816 e37302c4 2004-04-21 devnull else Bprint(&fout,"0%-3o,",fbch);
817 e37302c4 2004-04-21 devnull }
818 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
819 e37302c4 2004-04-21 devnull }
820 e37302c4 2004-04-21 devnull Bprint(&fout,"0};\n");
821 e37302c4 2004-04-21 devnull /* put out yyextra */
822 e37302c4 2004-04-21 devnull Bprint(&fout,"Uchar yyextra[] = {\n");
823 e37302c4 2004-04-21 devnull for(i=0;i<casecount;i+=8){
824 e37302c4 2004-04-21 devnull for(j=0;j<8;j++)
825 e37302c4 2004-04-21 devnull Bprint(&fout, "%d,", i+j<NACTIONS ?
826 e37302c4 2004-04-21 devnull extra[i+j] : 0);
827 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
828 e37302c4 2004-04-21 devnull }
829 e37302c4 2004-04-21 devnull Bprint(&fout,"0};\n");
830 e37302c4 2004-04-21 devnull }
831 e37302c4 2004-04-21 devnull
832 e37302c4 2004-04-21 devnull # ifdef PP
833 e37302c4 2004-04-21 devnull void
834 e37302c4 2004-04-21 devnull padd(int **array, int n)
835 e37302c4 2004-04-21 devnull {
836 e37302c4 2004-04-21 devnull int i, *j, k;
837 e37302c4 2004-04-21 devnull
838 e37302c4 2004-04-21 devnull array[n] = nxtpos;
839 e37302c4 2004-04-21 devnull if(count == 0){
840 e37302c4 2004-04-21 devnull *nxtpos++ = 0;
841 e37302c4 2004-04-21 devnull return;
842 e37302c4 2004-04-21 devnull }
843 e37302c4 2004-04-21 devnull for(i=tptr-1;i>=0;i--){
844 e37302c4 2004-04-21 devnull j = array[i];
845 e37302c4 2004-04-21 devnull if(j && *j++ == count){
846 e37302c4 2004-04-21 devnull for(k=0;k<count;k++)
847 e37302c4 2004-04-21 devnull if(!tmpstat[*j++])break;
848 e37302c4 2004-04-21 devnull if(k >= count){
849 e37302c4 2004-04-21 devnull array[n] = array[i];
850 e37302c4 2004-04-21 devnull return;
851 e37302c4 2004-04-21 devnull }
852 e37302c4 2004-04-21 devnull }
853 e37302c4 2004-04-21 devnull }
854 e37302c4 2004-04-21 devnull add(array,n);
855 e37302c4 2004-04-21 devnull }
856 e37302c4 2004-04-21 devnull # endif