home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / C / YACCUNX.ZIP / YSTATE.1C < prev    next >
Encoding:
Text File  |  1983-12-23  |  2.2 KB  |  78 lines

  1. #include "y1.h"
  2.  
  3. state(c)
  4.    {
  5.    /* sorts last state,and sees if it equals earlier ones. returns state number */
  6.    int size1,size2;
  7.    register i;
  8.    int *s;                                                              /*01*/
  9.    struct looksets *ss;                                         /*01*/
  10.    int s__;                                                     /*01*/
  11.    struct item *p1, *p2, *k, *l, *q1, *q2;
  12.    p1 = pstate[nstate];
  13.    p2 = pstate[nstate+1];
  14.    if(p1==p2) return(0); /* null state */
  15.    /* sort the items */
  16.    for(k=p2-1;k>p1;k--) 
  17.       {
  18.       /* make k the biggest */
  19.       for(l=k-1;l>=p1;--l)if( l->pitem > k->pitem )
  20.          {
  21.          s = k->pitem;
  22.          k->pitem = l->pitem;
  23.          l->pitem = s;
  24.          ss = k->look;
  25.          k->look = l->look;
  26.          l->look = ss;
  27.          }
  28.       }
  29.    size1 = p2 - p1; /* size of state */
  30.  
  31.    for( i= (c>=NTBASE)?ntstates[c-NTBASE]:tstates[c]; i != 0; i = mstates[i] ) 
  32.       {
  33.       /* get ith state */
  34.       q1 = pstate[i];
  35.       q2 = pstate[i+1];
  36.       size2 = q2 - q1;
  37.       if (size1 != size2) continue;
  38.       k=p1;
  39.       for(l=q1;l<q2;l++) 
  40.          {
  41.          if( l->pitem != k->pitem ) break;
  42.          ++k;
  43.          }
  44.       if (l != q2) continue;
  45.       /* found it */
  46.       pstate[nstate+1] = pstate[nstate]; /* delete last state */
  47.       /* fix up lookaheads */
  48.       if( nolook ) return(i);
  49.       for( l=q1,k=p1; l<q2; ++l,++k )
  50.          {
  51.          SETLOOP(s__) clset.lset[s__] = l->look->lset[s__];
  52.          if( setunion( clset.lset, k->look->lset ) ) 
  53.             {
  54.             tystate[i] = MUSTDO;
  55.             /* register the new set */
  56.             l->look = flset( &clset );
  57.             }
  58.          }
  59.       return (i);
  60.       }
  61.    /* state is new */
  62.    if( nolook ) error( "yacc state/nolook error" );
  63.    pstate[nstate+2] = p2;
  64.    if(nstate+1 >= NSTATES) error("too many states" );
  65.    if( c >= NTBASE )
  66.       {
  67.       mstates[ nstate ] = ntstates[ c-NTBASE ];
  68.       ntstates[ c-NTBASE ] = nstate;
  69.       }
  70.    else 
  71.       {
  72.       mstates[ nstate ] = tstates[ c ];
  73.       tstates[ c ] = nstate;
  74.       }
  75.    tystate[nstate]=MUSTDO;
  76.    return(nstate++);
  77.    }
  78.