}
else
coutvv"$"vvendl;
}
}
}
TArray[]
voidlnitiate(LeftltemArray[],intsize,charTArray[])〃将FA中的输入字母表存入数组
{
intlen=0;
inti,j;
RightNode*pNode;
for(i=0;ivsize;i++)
{
pNode=Array[i].link;
while(pNode)
{
for(j=0;jvlen;j++)
if(pNode->tran==TArray[j])break;
if(j==len)
{
TArray[len]=pNode->tran;
len++;
}
pNode=pNode->nextsibling;
}
}
}voidGetState(LeftltemArray[],intsize,charnstate[],chararc,chartemp[])//将NFA确定化创建二维矩阵时取得新状态
{
inti=0;
while(nstate[i]!
='\0')
{
for(intj=0;jvsize;j++)
{
if(Array[j].state==nstate[i])
{
RightNode*p=Array[j].link;
while(p!
=NULL)
{
if(p_>tran==arc)
{
intk=0;
while(temp[k]!
='\0')
{
if(p->nextstate==temp[k])break;k++;
}
if(temp[k]=='\0')
{
temp[k]=p->nextstate;
temp[k+1]='\0:
}
}
p=p->nextsibling;
}
}
}
i++;
}
}voidChange(StateltemSArray[],chartemp[],int&length,intMArray[][20],intindex,inti)
//取得新状态后对状态数组以及状态转换矩阵进行对应变化
{
intk;
if(temp[0]!
='\0')
{
k=CheckExist(SArray,length,temp);
MArray[index][i]=k;
if(k==length)
strcpy(SArray[length].newstates,temp);
}
}
charFindNewState(LeftltemArray[],intsize,charS,chararc)//得到当前状态的下一状态
{
inti;
for(i=0;i{
if(Array[i].state==S)
{
RightNode*p=Array[i].link;
while(p!
=NULL)
{
if(p_>tran==arc)returnp->nextstate;p=p->nextsibling;
}
}
}
returnNULL;
//取得输入字母在字母表中的下表
}intFindy(charTArray[],chars)
{
inti=0;
while(TArray[i]!
='\0')
{
if(TArray[i]==s)returni;i++;
}
}voidCreateFA1(LeftltemArray[],intsize,charstart,charend)
//根据输入文法创建FA{
if(CheckState(Array,size))
{
coutvv"此为确定有穷状态自动机!
"<cout«"DFAD=(";
}
else
{
coutvv"此为非确定有穷状态自动机!
"<cout}
coutvv"{";
Bianli1(Array,size);
coutvv"},{";
Bianli2(Array,size);
coutvv"},M,";
coutvvstart;
if(CheckState(Array,size))
elsecout"vvendl;if(CheckState(Array,size))Bianli31(Array,size);
else
Bianli32(Array,size);
length,int
}voidCreateFA2(LeftltemArray[],intsize,charstart,charend,StateltemSArray[],charTArray[],int&MArray[][20])
//将NFA转换为DFA
{
chartemp[20];
intindex=0;
inti;
do
{
i=0;
while(TArray[i]!
='\0')
{
temp[0]='\0:
GetState(Array,size,SArray[index].newstates,TArray[i],temp);
Sort(temp,strlen(temp));
Change(SArray,temp,length,MArray,index,i);
i++;
}
index++;
}while(index<=length);
}
voidDisplay(StateItemSArray[],charTArray[],intMArray[][20],intx,inty,charstart,charend)
〃输出确定化的NFA
{
inti,j,k;
coutvv"将NFA转化为DFA!
"vcoutfor(i=0;ivx;i++)
{
if(i==0)coutvv"["vvSArray[i].newstatesvv"]";
elsecoutvv",["vvSArray[i].newstatesvv"]";
}
coutvv"},{";
for(i=0;ivy;i++)
{
if(i==O)coutvelse
coutvv",["v}
cout«"},M',["vcout«"其中M':
"vfor(i=0;ifor(j=0;jvy;j++)
{
if(MArray[i][j]!
=-1)
{
k=MArray[i][j];
coutvv"
M'(["vvSArray[i].newstatesvv"],"vvTArray[j]vv")=["vvSArray[k].newstatesvv"]"vvendl;
}
}
coutvv"其中F'={";
k=0;
for(i=0;ivx;i++)
{
j=0;
while(SArray[i].newstates[j]!
='\0')
{
if(SArray[i].newstates[j]==end)break;
j++;
}
if(SArray[i].newstates[j]!
='\0')
{
if(k==0)coutvv"["vvSArray[i].newstatesvv"]";
else
coutvv",["vvSArray[i].newstatesvv"]";
k++;
}
}
coutvv"}"vvendl;
}
voidRunFA1(LeftltemArray[],intsize,charstart,charend)
charTD[20];
inti=0,j;
chars=start;
COUt«"请输入要推导的符号串:
";
cin»TD;
cout«"M("vfor(j=0;TD[j]!
='\0';j++)
cout<
coutwhile(TD[i]! ='\0') { if(TD[i+1]! ='\0') { cout
展开阅读全文
相关搜索
|