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 = 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] = 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 = 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 = 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 = 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(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

Defined functions

acompute defined in line 588; used 1 times
add defined in line 92; used 4 times
bprint defined in line 909; used 2 times
cfoll defined in line 2; used 6 times
cgoto defined in line 194; used 1 times
first defined in line 149; used 10 times
follow defined in line 109; used 6 times
layout defined in line 697; used 1 times
member defined in line 543; used 1 times
mkmatch defined in line 684; used 1 times
nextstate defined in line 311; used 1 times
notin defined in line 345; used 1 times
packtrans defined in line 364; used 1 times
padd defined in line 928; used 1 times
  • in line 16
pccl defined in line 654; used 1 times
pfoll defined in line 73; used 1 times
pstate defined in line 527; used 2 times
rprint defined in line 879; used 5 times
shiftr defined in line 895; used 3 times
stprt defined in line 556; used 1 times
upone defined in line 902; used 1 times
Last modified: 1983-12-09
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2189
Valid CSS Valid XHTML 1.0 Strict