#include
#include
#define MAXS 100
using namespace std;
string NODE; //结点集合
string CHANGE; //终结符集合
int N; //NFA边数
struct edge{
string first;
string change;
string last;
};
struct chan{
string ltab;
string jihe[MAXS];
};
void kong(int a)
{
int i;
for(i=0;icout<<' ';
}
//排序
void paixu(string &a)
{
int i,j;
char b;
for(j=0;j
{
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
}
void eclouse(char c,string &he,edge b[])
{
int k;
for(k=0;k
if(c==b[k].first[0])
if(b[k].change=="*")
{
if(he.find(b[k].last)>he.length())
he+=b[k].last;
eclouse(b[k].last[0],he,b);
}
}
}
void move(chan &he,int m,edge b[])
{
int i,j,k,l;
k=he.ltab.length();
l=he.jihe[m].length();
for(i=0;i
if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())
he.jihe[m]+=b[j].last[0];
for(i=0;i
if(he.jihe[m].find(b[j].last[0])>he.jihe[m].length())
he.jihe[m]+=b[j].last[0];
}
//输出
void outputfa(int len,int h,chan *t)
{
int i,j,m;
cout<<" I ";
for(i=0;i
cout<<' '<
for(j=0;j
kong(8-m);
m=t[i].jihe[j].length();
cout<
cout<
}
void main()
{
edge *b=new edge[MAXS];
int i,j,k,m,n,h,x,y,len;
bool flag;
string jh[MAXS],endnode,ednode,sta;
cout<<"请输入NFA各边信息(起点 条件[空为*] 终点),以#结束:"<
cin>>b[i].first;
if(b[i].first=="#") break;
cin>>b[i].change>>b[i].last;
}
N=i;
/*for(j=0;j
if(NODE.find(b[i].first)>NODE.length())
NODE+=b[i].first;
if(NODE.find(b[i].last)>NODE.length())
NODE+=b[i].last;
if((CHANGE.find(b[i].change)>CHANGE.length())&&(b[i].change!="*"))
CHANGE+=b[i].change;
}
len=CHANGE.length();
cout<<"结点中属于终态的是:"<
for(i=0;i
{
cout<<"所输终态不在集合中,错误!"<
}
//cout<<"endnode="<
t[0].ltab=b[0].first;
h=1;
eclouse(b[0].first[0],t[0].ltab,b); //求e-clouse
//cout<
for(j=0;j
for(k=0;k
//cout<
move(t[i],k,b); //求move(I,a)
//cout<
}
for(j=0;j
paixu(t[i].jihe[j]); //对集合排序以便比较
for(k=0;k
{
flag=operator==(t[k].ltab,t[i].jihe[j]);
if(flag)
break;
}
if(!flag&&t[i].jihe[j].length())
t[h++].ltab=t[i].jihe[j];
}
}
cout<
//状态重新命名
string *d=new string[h];
NODE.erase();
cout<
sta=t[i].ltab;
t[i].ltab.erase();
t[i].ltab='A'+i;
NODE+=t[i].ltab;
cout<<'{'<
for(k=0;k
t[k].jihe[m]=t[i].ltab;
}
for(i=0;i
d[0]+=NODE[i];
endnode=ednode;
cout<
cout<<"其中终态为:"<
m=2;
sta.erase();
flag=0;
for(i=0;i
//cout<<"d["<for(k=0;k
//cout<<"I"<
for(j=0;j
for(n=0;n
if(d[n].find(t[NODE.find(d[i][j])].jihe[k])
if(t[NODE.find(d[i][j])].jihe[k].length()==0)
x=m;
else
x=n;
if(!sta.length())
{
sta+=x+48;
}
else
if(sta[0]!=x+48)
{
d[m]+=d[i][j];
flag=1;
d[i].erase(j,1);
//cout<
}
break; //跳出n
}
}//n
}//j
if(flag)
{
m++;
flag=0;
}
//cout<<"sta="<
}//k
}//i
cout<
chan *md=new chan[m];
NODE.erase();
cout<
md[i].ltab='A'+i;
NODE+=md[i].ltab;
cout<<"{"<
for(i=0;i
if(d[i][0]==t[j].ltab[0])
{
for(n=0;n
if(!t[j].jihe[k].length())
break;
else
if(d[n].find(t[j].jihe[k])
md[i].jihe[k]=md[n].ltab;
break;
}
}
break;
}
}
ednode.erase();
for(i=0;i
endnode=ednode;
cout<
cout<<"其中终态为:"<