Annotation of 40BSD/cmd/eyacc/ey3.c, revision 1.1

1.1     ! root        1: /* (c) 1979 Regents of the University of California */
        !             2: # include "ey.h"
        !             3: 
        !             4: cpres(){ /* conpute an array with the beginnings of  productions yielding given nonterminals
        !             5:        The array pres points to these lists */
        !             6:        int i,j,c;
        !             7:        pres = yalloc(nnonter+1);
        !             8:        for(i=0;i<=nnonter;i++){
        !             9:                c = i+NTBASE;
        !            10:                pres[i] = mem;
        !            11:                fatfl = 0;  /* make undefined  symbols  nonfatal */
        !            12:                for(j=0;j<nprod;j++)
        !            13:                if (*prdptr[j] == c) *mem++ =  prdptr[j]+1;
        !            14:                if(pres[i] == mem){
        !            15:                        error("nonterminal %s not defined!", nontrst[i].name);
        !            16:                        }
        !            17:                }
        !            18:        pres[i] = mem;
        !            19:        fatfl = 1;
        !            20:        if( nerrors ){
        !            21:                summary();
        !            22:                cexit(1);
        !            23:                }
        !            24:        }
        !            25: 
        !            26: int indebug = 0;
        !            27: cpfir() {
        !            28:   /* compute an array with the first of nonterminals */
        !            29:   int i, ch, **s, **t, changes, *p;
        !            30: 
        !            31:   pfirst = yalloc(nnonter+1);
        !            32:   for (i=0;i<=nnonter;i++) {
        !            33:     aryfil( wsets[i].ws, tbitset, 0 );
        !            34:     t = pres[i+1];
        !            35:     for( s=pres[i]; s<t; ++s ){ /* initially fill the sets */
        !            36:       for( p = *s; (ch = *p) > 0 ; ++p ) {
        !            37:         if( ch < NTBASE ) {
        !            38:           wsets[i].ws[ch>>4] |= (1 << (ch&017) );
        !            39:           break;
        !            40:           }
        !            41:         else if( !pempty[ch-NTBASE] ) break;
        !            42:         }
        !            43:       }
        !            44:     }
        !            45: 
        !            46:   /* now, reflect transitivity */
        !            47: 
        !            48:   changes = 1;
        !            49:   while( changes ){
        !            50:     changes = 0;
        !            51:     for( i=0; i<=nnonter; ++i ){
        !            52:       t = pres[i+1];
        !            53:       for( s=pres[i]; s<t; ++s ){
        !            54:         for( p = *s; ( ch = (*p-NTBASE) ) >= 0; ++p ) {
        !            55:           changes |= UNION( wsets[i].ws, wsets[i].ws, wsets[ch].ws );
        !            56:           if( !pempty[ch] ) break;
        !            57:           }
        !            58:         }
        !            59:       }
        !            60:     }
        !            61: 
        !            62:   for( i=0; i<=nnonter; i++ ) pfirst[i] = flset( wsets[i].ws );
        !            63:   if( !indebug ) return;
        !            64:   settty();
        !            65:   for( i=0; i<=nnonter; i++ ){
        !            66:     fprintf( cout ,  "\n%s: ", nontrst[i].name );
        !            67:     prlook( pfirst[i] );
        !            68:     fprintf( cout ,  " %d\n", pempty[i] );
        !            69:     }
        !            70:   }
        !            71: 
        !            72: state(c){ /* sorts last state,and sees if it equals earlier ones. returns state number */
        !            73:        int s,size1,size2;
        !            74:        _REGISTER i;
        !            75:        struct item *p1, *p2, *k, *l, *q1, *q2;
        !            76:        p1 = pstate[nstate];
        !            77:        p2 = pstate[nstate+1];
        !            78:        if(p1==p2) return(0); /* null state */
        !            79:        /* sort the items */
        !            80:        for(k=p2-1;k>p1;k--) {  /* make k the biggest */
        !            81:                for(l=k-1;l>=p1;--l)if( l->pitem > k->pitem ){
        !            82:                        s = k->pitem;
        !            83:                        k->pitem = l->pitem;
        !            84:                        l->pitem = s;
        !            85:                        s = k->look;
        !            86:                        k->look = l->look;
        !            87:                        l->look = s;
        !            88:                        }
        !            89:                }
        !            90:        size1 = p2 - p1; /* size of state */
        !            91: 
        !            92:        for( i= (c>=NTBASE)?ntstates[c-NTBASE]:tstates[c]; i != 0; i = mstates[i] ) {
        !            93:                /* get ith state */
        !            94:                q1 = pstate[i];
        !            95:                q2 = pstate[i+1];
        !            96:                size2 = q2 - q1;
        !            97:                if (size1 != size2) continue;
        !            98:                k=p1;
        !            99:                for(l=q1;l<q2;l++) {
        !           100:                        if( l->pitem != k->pitem ) break;
        !           101:                        ++k;
        !           102:                        }
        !           103:                if (l != q2) continue;
        !           104:                /* found it */
        !           105:                pstate[nstate+1] = pstate[nstate]; /* delete last state */
        !           106:                /* fix up lookaheads */
        !           107:                k=p1;
        !           108:                for( l=q1; l<q2; ++l ){
        !           109:                        if( UNION( clset.lset, l->look->lset, k->look->lset ) ) {
        !           110:                                tystate[i] = 1;
        !           111:                                /* register the new set */
        !           112:                                l->look = flset( &clset );
        !           113:                                }
        !           114:                        ++k;
        !           115:                        }
        !           116:                return (i);
        !           117:                }
        !           118: /* state is new */
        !           119:        pstate[nstate+2] = p2;
        !           120:        if(nstate+1 >= stsize) error("too many states");
        !           121:        if( c >= NTBASE ){
        !           122:                mstates[ nstate ] = ntstates[ c-NTBASE ];
        !           123:                ntstates[ c-NTBASE ] = nstate;
        !           124:                }
        !           125:        else {
        !           126:                mstates[ nstate ] = tstates[ c ];
        !           127:                tstates[ c ] = nstate;
        !           128:                }
        !           129:        tystate[nstate]=1;
        !           130:        return(nstate++);
        !           131:        }
        !           132: 
        !           133: int pidebug = 0; /* debugging flag for putitem */
        !           134: putitem ( ptr, lptr )          int *ptr; struct looksets *lptr;{
        !           135:        int *jip, k;
        !           136:        struct item *i, *j;
        !           137: 
        !           138:         if( pidebug ) {
        !           139:           settty();
        !           140:          fprintf( cout , "putitem(%s), state %d\n", writem(&ptr), nstate );
        !           141:           }
        !           142:        /* see if it's there */
        !           143:        j = pstate[nstate+1];
        !           144:         for( i=pstate[nstate]; i<j; ++i )
        !           145:                if(i->pitem == ptr) { 
        !           146:                        error("yacc error--duplicate item");
        !           147:                        }
        !           148:        /* not there */
        !           149:        j->pitem = ptr;
        !           150:        j->look = flset( lptr );
        !           151:        pstate[nstate+1] = ++j;
        !           152:        jip = j;
        !           153:        if(jip-mem0 >= memsiz) error("out of state space");
        !           154:        }
        !           155: 
        !           156: cempty(){ /* mark nonterminals which derive the empty string */
        !           157: 
        !           158:   int i, *p;
        !           159: 
        !           160:   /* set pempty to 0 */
        !           161:   pempty = yalloc( nnonter );
        !           162:   aryfil( pempty, nnonter+1, 0 );
        !           163:   for( i=1; i<nprod; ++i ) /* loop over productions */
        !           164:     if( prdptr[i][1] <= 0 ) /* i is empty production */
        !           165:       pempty[ *prdptr[i]-NTBASE ] = 1;
        !           166: 
        !           167:   /* now, all explicitly empty nonterminals marked with pempty = 1 */
        !           168: 
        !           169:   /* loop as long as we keep finding nontrivial empty nonterminals */
        !           170: 
        !           171: again:
        !           172:   for( i=1; i<nprod; ++i ){
        !           173:     if( pempty[ *prdptr[i]-NTBASE ]==0 ){ /* not known to be empty */
        !           174:       for( p=prdptr[i]+1; *p>=NTBASE && pempty[*p-NTBASE]!=0 ; ++p ) ;
        !           175:       if( *p < 0 ){ /* we have a nontrivially empty nonterminal */
        !           176:         pempty[*prdptr[i]-NTBASE] = 1;
        !           177:         goto again; /* got one ... try for another */
        !           178:         }
        !           179:       }
        !           180:     }
        !           181:   }
        !           182: 
        !           183: int gsdebug = 0;
        !           184: stagen(){ /* generate the states */
        !           185: 
        !           186:   int i, j, k, c;
        !           187: 
        !           188:   /* initialize */
        !           189: 
        !           190:   nstate = 0;
        !           191:   pstate[0] = pstate[1] = mem;
        !           192:   aryfil( clset.lset, tbitset, 0 );
        !           193:   putitem( prdptr[0]+1, &clset );
        !           194:   tystate[0] = 1;
        !           195:   nstate = 1;
        !           196:   pstate[2] = pstate[1];
        !           197: 
        !           198:   memact = 0;
        !           199:   aryfil( amem, actsiz, 0 );
        !           200: 
        !           201:   /* now, the main state generation loop */
        !           202: 
        !           203:   more:
        !           204:   for( i=0; i<nstate; ++i ){
        !           205:     if( tystate[i] != 1 ) continue;
        !           206:     tystate[i] = 0;
        !           207:     aryfil( temp1, nterms+nnonter+1, 0 );
        !           208:     /* take state i, close it, and do gotos */
        !           209:     closure(i);
        !           210:     for( j=0; j<cwset; ++j ){ /* generate gotos */
        !           211:       if( wsets[j].flag ) continue;
        !           212:       wsets[j].flag = 1;
        !           213:       c = *(wsets[j].pitem);
        !           214:       if( c <= 1 ) {
        !           215:                if( pstate[i+1]-pstate[i] <= j ) tystate[i] = (tystate[i]==1)?1:2;
        !           216:                continue;
        !           217:                }
        !           218:       /* do a goto on c */
        !           219:       for( k=j; k<cwset; ++k ){
        !           220:         if( c == *(wsets[k].pitem) ){ /* this item contributes to the goto */
        !           221:           putitem( wsets[k].pitem + 1, wsets[k].ws );
        !           222:           wsets[k].flag = 1;
        !           223:           }
        !           224:         }
        !           225:       if( c < NTBASE ) temp1[c] = state(c);
        !           226:       else temp1[c-NTBASE+nterms] = state(c);
        !           227:       }
        !           228:     if( gsdebug ){
        !           229:       settty();
        !           230:       fprintf( cout ,  "%d: ", i );
        !           231:       for( j=1; j<=nterms; ++j ){
        !           232:         if( temp1[j] != 0 ) fprintf( cout ,  "%s %d, ", symnam(j), temp1[j]);
        !           233:         }
        !           234:       for( j=1; j<=nnonter; ++j ){
        !           235:         if( temp1[j+nterms] ) fprintf( cout ,  "%s %d, ", nontrst[j].name, temp1[j+nterms] );
        !           236:         }
        !           237:       fprintf( cout , "\n");
        !           238:       }
        !           239:     apstate[i] = apack( &temp1[0], nterms );
        !           240:     indgo[i] = apack( &temp1[nterms+1], nnonter-1 ) - 1;
        !           241:     goto more; /* we have done one goto; do some more */
        !           242:     }
        !           243:   /* no more to do... stop */
        !           244:   }
        !           245: 
        !           246: int cldebug = 0; /* debugging flag for closure */
        !           247: closure(i){ /* generate the closure of state i */
        !           248: 
        !           249:   int c, ch, work;
        !           250:   _REGISTER j, k;
        !           251:   int *pi;
        !           252:   int **s, **t;
        !           253:   struct item *q;
        !           254:   _REGISTER struct item *p;
        !           255: 
        !           256:   ++zzclose;
        !           257: 
        !           258:   /* first, copy kernel of state i to wsets */
        !           259: 
        !           260:   cwset = 0;
        !           261:   q = pstate[i+1];
        !           262:   for( p=pstate[i]; p<q; ++p ){
        !           263:     wsets[cwset].pitem = p->pitem;
        !           264:     wsets[cwset].flag = 1;    /* this item must get closed */
        !           265:     for( k=0; k<tbitset; ++k ) wsets[cwset].ws[k] = p->look->lset[k];
        !           266:     ++cwset;
        !           267:     }
        !           268: 
        !           269:   /* now, go through the loop, closing each item */
        !           270: 
        !           271:   work = 1;
        !           272:   while( work ){
        !           273:     work = 0;
        !           274:     for( j=0; j<cwset; ++j ){
        !           275:   
        !           276:       if( wsets[j].flag == 0 ) continue;
        !           277:       c = *(wsets[j].pitem);  /* dot is before c */
        !           278:   
        !           279:       if( c < NTBASE ){
        !           280:         wsets[j].flag = 0;
        !           281:         continue;  /* only interesting case is where . is before nonterminal */
        !           282:         }
        !           283:   
        !           284:       /* compute the lookahead */
        !           285:       aryfil( clset.lset, tbitset, 0 );
        !           286: 
        !           287:       /* find items involving c */
        !           288: 
        !           289:       for( k=j; k<cwset; ++k ){
        !           290:         if( wsets[k].flag == 1 && *(pi=wsets[k].pitem) == c ){
        !           291:           wsets[k].flag = 0;
        !           292:           if( nolook ) continue;
        !           293:           while( (ch= *++pi)>0 ){
        !           294:             if( ch < NTBASE ){ /* terminal symbol */
        !           295:               clset.lset[ch>>4] |= (1<<(ch&017));
        !           296:               break;
        !           297:               }
        !           298:             /* nonterminal symbol */
        !           299:             UNION( clset.lset, clset.lset, pfirst[ch-NTBASE] );
        !           300:             if( !pempty[ch-NTBASE] ) break;
        !           301:             }
        !           302:           if( ch<=0 ) UNION( clset.lset, clset.lset, wsets[k].ws );
        !           303:           }
        !           304:         }
        !           305:   
        !           306:       /*  now loop over productions derived from c */
        !           307:   
        !           308:       c -= NTBASE; /* c is now nonterminal number */
        !           309:   
        !           310:       t = pres[c+1];
        !           311:       for( s=pres[c]; s<t; ++s ){
        !           312:         /* put these items into the closure */
        !           313:         for( k=0; k<cwset; ++k ){ /* is the item there */
        !           314:           if( wsets[k].pitem == *s ){ /* yes, it is there */
        !           315:             if( nolook ) goto nexts;
        !           316:             if( UNION( wsets[k].ws, wsets[k].ws, clset.lset ) ) wsets[k].flag = work = 1;
        !           317:             goto nexts;
        !           318:             }
        !           319:           }
        !           320:   
        !           321:         /*  not there; make a new entry */
        !           322:         if( cwset+1 >= wssize ) error( "working set overflow" );
        !           323:         wsets[cwset].pitem = *s;
        !           324:         wsets[cwset].flag = 1;
        !           325:         if( nolook ){
        !           326:           cwset++;
        !           327:           goto nexts;
        !           328:           }
        !           329:         work = 1;
        !           330:         for( k=0; k<tbitset; ++k ) wsets[cwset].ws[k] = clset.lset[k];
        !           331:         cwset++;
        !           332:   
        !           333:       nexts: ;
        !           334:         }
        !           335:   
        !           336:       }
        !           337:     }
        !           338: 
        !           339:   /* have computed closure; flags are reset; return */
        !           340: 
        !           341:   if( cwset > zzcwset ) zzcwset = cwset;
        !           342:   if( !cldebug ) return;
        !           343:   settty();
        !           344:   fprintf( cout , "\nState %d, nolook = %d\n", i, nolook );
        !           345:   for( j=0; j<cwset; ++j ){
        !           346:     if( wsets[j].flag ) fprintf( cout , "flag set!\n");
        !           347:     wsets[j].flag = 0;
        !           348:     fprintf( cout , "\t%s", writem(&wsets[j].pitem));
        !           349:     prlook( wsets[j].ws );
        !           350:     fprintf( cout ,  "\n" );
        !           351:     }
        !           352: 
        !           353:   }
        !           354: 
        !           355: struct looksets *flset( p ) 
        !           356:        struct looksets *p;
        !           357:        {
        !           358:        /* decide if the lookahead set pointed to by p is known */
        !           359:        /* return pointer to a perminent location for the set */
        !           360: 
        !           361:        int j, *w;
        !           362:        _REGISTER *u, *v, i;
        !           363: 
        !           364:        for( i=0; i<nlset; ++i ){
        !           365:                u = p->lset;
        !           366:                v = lkst[i].lset;
        !           367:                w = & v[tbitset];
        !           368:                while( v<w) if( *u++ != *v++ ) goto more;
        !           369:                /* we have matched */
        !           370:                return( & lkst[i] );
        !           371:                more: ;
        !           372:                }
        !           373:        /* add a new one */
        !           374:        if( nlset+1 >= lsetsz )error("too many lookahead sets");
        !           375:        for( j=0; j<tbitset; ++j ){
        !           376:                lkst[nlset].lset[j] = p->lset[j];
        !           377:                }
        !           378:        return( & lkst[nlset++]);
        !           379:        }

unix.superglobalmegacorp.com

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