c语言编程NFA确定化Word文档格式.docx
《c语言编程NFA确定化Word文档格式.docx》由会员分享,可在线阅读,更多相关《c语言编程NFA确定化Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
有关数据结构:
States[]是一个M的数组,每个状态有两个域,set域存放N的状态集合,flg域为一标识。
Trans[]是M的转移矩阵(输入字母表Σ元素个数×
最大状态数),Trans[i][a]=下一状态。
iM的当前状态号
a输入符号,a∈Σ
Nstates[]M的下一新状态号
S定义M的一个状态的N的状态集
初始化:
States[0].set=ε_Closure({N的初态})
States[0].flg=FALSE
Nstates=1
i=0
S=Ф
Trans初始化为无状态’-’
while(States[i]的flg为FALSE){
States[i].flg=TRUE;
for(每个输入符号a∈Σ){
S=ε_Closure(Move(States[i].set,a));
if(S非空)
if(States中没有set域等于S的状态){
States[Nstates].set=S;
States[Nstates].flg=FALSE;
Trans[i][a]=Nstates++;
else
Trans[i][a]=States中一个set域为S的下标;
此算法的输出M主要由Trans矩阵描述,其中省略了每个状态是否为终态的描述,应加以完善。
4.实验程序;
#include<
iostream>
string>
#defineMAXS100
usingnamespacestd;
stringNODE;
//结点集合
stringCHANGE;
//终结符集合
intN;
//NFA边数
structedge{
stringfirst;
stringchange;
stringlast;
};
structchan{
stringltab;
stringjihe[MAXS];
voidkong(inta)
{
inti;
for(i=0;
i<
a;
i++)
cout<
<
'
'
;
//排序
voidpaixu(string&
a)
inti,j;
charb;
for(j=0;
j<
a.length();
j++)
for(i=0;
if(NODE.find(a[i])>
NODE.find(a[i+1]))
{
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
voideclouse(charc,string&
he,edgeb[])
intk;
for(k=0;
k<
N;
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);
voidmove(chan&
he,intm,edgeb[])
inti,j,k,l;
k=he.ltab.length();
l=he.jihe[m].length();
k;
for(j=0;
if((CHANGE[m]==b[j].change[0])&
&
(he.ltab[i]==b[j].first[0]))
if(he.jihe[m].find(b[j].last[0])>
he.jihe[m].length())
he.jihe[m]+=b[j].last[0];
l;
(he.jihe[m][i]==b[j].first[0]))
//输出
voidoutputfa(intlen,inth,chan*t)
inti,j,m;
cout<
"
I"
len;
I'
CHANGE[i]<
"
endl<
-------------------------"
endl;
h;
t[i].ltab;
m=t[i].ltab.length();
kong(8-m);
m=t[i].jihe[j].length();
t[i].jihe[j];
voidmain()
edge*b=newedge[MAXS];
inti,j,k,m,n,h,x,y,len;
boolflag;
stringjh[MAXS],endnode,ednode,sta;
请输入NFA各边信息(起点条件[空为*]终点),以#结束:
MAXS;
cin>
>
b[i].first;
if(b[i].first=="
#"
)break;
b[i].change>
b[i].last;
N=i;
/*for(j=0;
b[j].first<
b[j].change<
b[j].last<
if(NODE.find(b[i].first)>
NODE.length())
NODE+=b[i].first;
if(NODE.find(b[i].last)>
NODE+=b[i].last;
if((CHANGE.find(b[i].change)>
CHANGE.length())&
(b[i].change!
="
))
CHANGE+=b[i].change;
len=CHANGE.length();
结点中属于终态的是:
cin>
endnode;
endnode.length();
if(NODE.find(endnode[i])>
所输终态不在集合中,错误!
return;
//cout<
endnode="
endnode<
chan*t=newchan[MAXS];
t[0].ltab=b[0].first;
h=1;
eclouse(b[0].first[0],t[0].ltab,b);
//求e-clouse
t[0].ltab<
{
t[i].ltab.length();
for(m=0;
m<
m++)
eclouse(t[i].ltab[j],t[i].jihe[m],b);
for(k=0;
//cout<
t[i].jihe[k]<
->
move(t[i],k,b);
//求move(I,a)
t[i].jihe[k].length();
eclouse(t[i].jihe[k][j],t[i].jihe[k],b);
paixu(t[i].jihe[j]);
//对集合排序以便比较
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];
状态转换矩阵如下:
outputfa(len,h,t);
//输出状态转换矩阵
//状态重新命名
string*d=newstring[h];
NODE.erase();
重命名:
i++)
sta=t[i].ltab;
t[i].ltab.erase();
t[i].ltab='
A'
+i;
NODE+=t[i].ltab;
{'
sta<
}="
t[i].ltab<
if(sta.find(endnode[j])<
sta.length())
d[1]=ednode+=t[i].ltab;
if(sta==t[k].jihe[m])
t[k].jihe[m]=t[i].ltab;
NODE.length();
if(ednode.find(NODE[i])>
ednode.length())
d[0]+=NODE[i];
endnode=ednode;
DFA如下:
//输出DFA
其中终态为:
5..实验截