Annotation of researchv9/cmd/lex/sub2.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.