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