home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
OS2-YACC.ZIP
/
YSTATE.1C
< prev
next >
Wrap
Text File
|
1989-09-29
|
3KB
|
97 lines
/*
HEADER: CUG nnn.nn;
TITLE: YACC - Yet Another Compilier-Compilier
VERSION: 1.0 for IBM-PC
DATE: JAN 28, 1985
DESCRIPTION: LALR(1) Parser Generator. From UNIX
KEYWORDS: Parser Generator Compilier-Compilier YACC
SYSTEM: IBM-PC and Compatiables
FILENAME: YSTATE.1C
WARNINGS: This program is not for the casual user. It will
be useful primarily to expert developers.
CRC: N/A
SEE-ALSO: LEX and PREP
AUTHORS: Scott Guthery 11100 leafwood lane Austin, TX 78750
COMPILERS: DESMET-C
REFERENCES: UNIX Systems Manuals
*/
#include "y1.h"
int state( int c )
{
/* sorts last state,and sees if it equals earlier ones. returns state number */
int size1,size2;
register i;
int *s; /*01*/
struct looksets *ss; /*01*/
int s__; /*01*/
struct item *p1, *p2, *k, *l, *q1, *q2;
p1 = pstate[nstate];
p2 = pstate[nstate+1];
if(p1==p2) return(0); /* null state */
/* sort the items */
for(k=p2-1;k>p1;k--)
{
/* make k the biggest */
for(l=k-1;l>=p1;--l)if( l->pitem > k->pitem )
{
s = k->pitem;
k->pitem = l->pitem;
l->pitem = s;
ss = k->look;
k->look = l->look;
l->look = ss;
}
}
size1 = p2 - p1; /* size of state */
for( i= (c>=NTBASE)?ntstates[c-NTBASE]:tstates[c]; i != 0; i = mstates[i] )
{
/* get ith state */
q1 = pstate[i];
q2 = pstate[i+1];
size2 = q2 - q1;
if (size1 != size2) continue;
k=p1;
for(l=q1;l<q2;l++)
{
if( l->pitem != k->pitem ) break;
++k;
}
if (l != q2) continue;
/* found it */
pstate[nstate+1] = pstate[nstate]; /* delete last state */
/* fix up lookaheads */
if( nolook ) return(i);
for( l=q1,k=p1; l<q2; ++l,++k )
{
SETLOOP(s__) clset.lset[s__] = l->look->lset[s__];
if( setunion( clset.lset, k->look->lset ) )
{
tystate[i] = MUSTDO;
/* register the new set */
l->look = flset( &clset );
}
}
return (i);
}
/* state is new */
if( nolook ) error( "yacc state/nolook error" );
pstate[nstate+2] = p2;
if(nstate+1 >= NSTATES) error("too many states" );
if( c >= NTBASE )
{
mstates[ nstate ] = ntstates[ c-NTBASE ];
ntstates[ c-NTBASE ] = nstate;
}
else
{
mstates[ nstate ] = tstates[ c ];
tstates[ c ] = nstate;
}
tystate[nstate]=MUSTDO;
return(nstate++);
}