Annotation of researchv9/cmd/lex/sub2.c, revision 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.