USG_PG3/usr/source/lexgen2/subset.c
# include "../lexgen1/ldefs.c"
int stt[30];
struct {int ns; int st[10];};
subset()
{
int i, c, d, *p, ni, l;
int sn, v, w, ons, flag, boundary;
int kk, nnew, *np, k2, ki;
boundary = nstate;
for(i=1; i<=nstate; i++)
{
for(c=0; c<NCH; c++)
{
if ( (p= move(i,c,1,0))== 0)
continue;
if (p[1] == 0 || p[2] == 0)
continue;
ni = 0;
while (kk = *++p)
{
if (kk < boundary)
{
if (notin(stt, ni, kk))
stt[ni++] = kk;
}
else
{
np = new(kk,0);
if (nnew = *np++)
while(nnew--)
if(notin(stt,ni,k2 = *np++))
stt[ni++]= k2;
}
}
ons= nstate;
sn = stset(ni);
move(i,c,-1,0);
addmove(i,c,sn);
for (l=0; l<ni; l++)
{
w = stt[l];
if (p= stops(w,1))
while (v= *p++)
addstop(sn, v);
}
if (ons <nstate) /* really new state made */
{
for (d=0; d<NCH; d++)
{
for(flag=l=0; l<ni-1; l++)
{
if (p=move(stt[l],d,1,0))
{
flag = 1;
while (v = *++p)
{
addmove(sn,d,v);
}
}
}
if (flag)
{
if (p=move(stt[ni-1],d,1,0))
while (v= *++p)
addmove(sn,d,v);
}
}
v = stt[ni-1];
other[nstate] = ngo[v] ? v: 0;
}
}
}
}
stset(n)
{
extern icomp(), exch();
int nst, *ps, *pt, pi;
int i;
sort (n, icomp, exch);
for (nst=nstate; nst>0 && new(nst,2)->ns > 0; nst--)
{
if (new(nst,2)->ns != n)
continue;
ps = new(nst,2)->st;
pt = stt;
pi=n;
while(*ps++ == *pt++)
if (--pi == 0)
return(nst);
}
new(++nstate, (n+1)*sizeof(n))->ns = n;
ps = new(nstate,0)->st;
for(pi=0; pi<n; pi++)
ps[pi] = stt[pi];
return(nstate);
}
icomp(i,j)
{
int k,l;
k = stt[i]; l = stt[j];
if (ngo[k] != ngo[l])
return(ngo[k] < ngo[l]);
return(k>l);
}
exch(i,j)
{
int t;
t=stt[i];
stt[i] = stt[j];
stt[j] = t;
}
notin(arr, len, i)
int *arr;
{
while (len--)
if (*arr++ == i)
return(0);
return(1);
}