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