home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OS2-YACC.ZIP / YSTATE.1C < prev    next >
Text File  |  1989-09-29  |  3KB  |  97 lines

  1. /*
  2.   HEADER: CUG     nnn.nn;
  3.   TITLE:     YACC - Yet Another Compilier-Compilier
  4.   VERSION:     1.0 for IBM-PC
  5.   DATE:      JAN 28, 1985
  6.   DESCRIPTION:     LALR(1) Parser Generator. From UNIX
  7.   KEYWORDS:     Parser Generator Compilier-Compilier YACC
  8.   SYSTEM:     IBM-PC and Compatiables
  9.   FILENAME:      YSTATE.1C
  10.   WARNINGS:     This program is not for the casual user. It will
  11.          be useful primarily to expert developers.
  12.   CRC:         N/A
  13.   SEE-ALSO:     LEX and PREP
  14.   AUTHORS:     Scott Guthery 11100 leafwood lane Austin, TX 78750
  15.   COMPILERS:     DESMET-C
  16.   REFERENCES:     UNIX Systems Manuals
  17. */
  18.  
  19. #include "y1.h"
  20.  
  21. int state( int c )
  22.    {
  23.    /* sorts last state,and sees if it equals earlier ones. returns state number */
  24.    int size1,size2;
  25.    register i;
  26.    int *s;                                                              /*01*/
  27.    struct looksets *ss;                                         /*01*/
  28.    int s__;                                                     /*01*/
  29.    struct item *p1, *p2, *k, *l, *q1, *q2;
  30.    p1 = pstate[nstate];
  31.    p2 = pstate[nstate+1];
  32.    if(p1==p2) return(0); /* null state */
  33.    /* sort the items */
  34.    for(k=p2-1;k>p1;k--) 
  35.       {
  36.       /* make k the biggest */
  37.       for(l=k-1;l>=p1;--l)if( l->pitem > k->pitem )
  38.          {
  39.          s = k->pitem;
  40.          k->pitem = l->pitem;
  41.          l->pitem = s;
  42.          ss = k->look;
  43.          k->look = l->look;
  44.          l->look = ss;
  45.          }
  46.       }
  47.    size1 = p2 - p1; /* size of state */
  48.  
  49.    for( i= (c>=NTBASE)?ntstates[c-NTBASE]:tstates[c]; i != 0; i = mstates[i] ) 
  50.       {
  51.       /* get ith state */
  52.       q1 = pstate[i];
  53.       q2 = pstate[i+1];
  54.       size2 = q2 - q1;
  55.       if (size1 != size2) continue;
  56.       k=p1;
  57.       for(l=q1;l<q2;l++) 
  58.          {
  59.          if( l->pitem != k->pitem ) break;
  60.          ++k;
  61.          }
  62.       if (l != q2) continue;
  63.       /* found it */
  64.       pstate[nstate+1] = pstate[nstate]; /* delete last state */
  65.       /* fix up lookaheads */
  66.       if( nolook ) return(i);
  67.       for( l=q1,k=p1; l<q2; ++l,++k )
  68.          {
  69.          SETLOOP(s__) clset.lset[s__] = l->look->lset[s__];
  70.          if( setunion( clset.lset, k->look->lset ) ) 
  71.             {
  72.             tystate[i] = MUSTDO;
  73.             /* register the new set */
  74.             l->look = flset( &clset );
  75.             }
  76.          }
  77.       return (i);
  78.       }
  79.    /* state is new */
  80.  
  81.    if( nolook ) error( "yacc state/nolook error" );
  82.    pstate[nstate+2] = p2;
  83.    if(nstate+1 >= NSTATES) error("too many states" );
  84.    if( c >= NTBASE )
  85.       {
  86.       mstates[ nstate ] = ntstates[ c-NTBASE ];
  87.       ntstates[ c-NTBASE ] = nstate;
  88.       }
  89.    else 
  90.       {
  91.       mstates[ nstate ] = tstates[ c ];
  92.       tstates[ c ] = nstate;
  93.       }
  94.    tystate[nstate]=MUSTDO;
  95.    return(nstate++);
  96.    }
  97.