Annotation of 43BSDTahoe/usr.bin/lex/sub2.c, revision 1.1

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

unix.superglobalmegacorp.com

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