home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / yaccsrc2 / ystate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-19  |  2.5 KB  |  96 lines

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