|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.