if(pNode->nextstate==temp[j])break;
if(j==len)
{
if(len==0)cout<nextstate;
else
cout<<","<nextstate;
temp[len]=pNode->nextstate;
len++;
}
pNode=pNode->nextsibling;
}
}
}
voidBianli2(LeftItemArray[],intsize)
//输出FA中有穷的输入字母表
{
chartemp[20];
intlen=0;
inti,j;
RightNode*pNode;
for(i=0;i{
pNode=Array[i].link;
while(pNode)
{
for(j=0;jif(pNode->tran==temp[j])break;
if(j==len)
{
if(len==0)cout<tran;
else
cout<<","<tran;
temp[len]=pNode->tran;
len++;
}
pNode=pNode->nextsibling;
}
}
}
voidBianli31(LeftItemArray[],intsize)
//输出DFA状态转换关系的集合M
{
inti;
RightNode*pNode;
for(i=0;i{
pNode=Array[i].link;
while(pNode!
=NULL)
{
cout<<"M("<tran
<<")="<nextstate<pNode=pNode->nextsibling;
}
}
}
voidBianli32(LeftItemArray[],intsize)//输出NFA状态转换关系集合M
{
charK[20];
intlen=0;
inti,j;
RightNode*pNode;
RightNode*qNode;
for(i=0;i{
pNode=Array[i].link;
while(pNode)
{
for(j=0;jif(pNode->tran==K[j])break;
if(j==len)
{
K[len]=pNode->tran;
len++;
}
pNode=pNode->nextsibling;
}
}
Sort(K,len);
for(i=0;i{
for(j=0;j{
pNode=Array[i].link;
cout<<"M("<if(getstate(pNode,K[j]))
{
cout<<"{";
while(pNode)
{
if(pNode->tran==K[j])
{
qNode=pNode->nextsibling;
cout<nextstate;
break;
}
pNode=pNode->nextsibling;
}
while(qNode)
{
if(qNode->tran==K[j])
cout<<","<nextstate;
qNode=qNode->nextsibling;
}
cout<<"}"<}
else
cout<<"$"<}
}
}
voidInitiate(LeftItemArray[],intsize,charTArray[])//将FA中的输入字母表存入数组TArray[]
{
intlen=0;
inti,j;
RightNode*pNode;
for(i=0;i{
pNode=Array[i].link;
while(pNode)
{
for(j=0;jif(pNode->tran==TArray[j])break;
if(j==len)
{
TArray[len]=pNode->tran;
len++;
}
pNode=pNode->nextsibling;
}
}
}
voidGetState(LeftItemArray[],intsize,charnstate[],chararc,chartemp[])
//将NFA确定化创建二维矩阵时取得新状态
{
inti=0;
while(nstate[i]!
='\0')
{
for(intj=0;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(StateItemSArray[],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(LeftItemArray[],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(LeftItemArray[],intsize,charstart,charend)
//根据输入文法创建FA
{
if(CheckState(Array,size))
{
cout<<"此为确定有穷状态自动机!
"<cout<<"DFAD=(";
}
else
{
cout<<"此为非确定有穷状态自动机!
"<cout<<"NFAN=(";
}
cout<<"{";
Bianli1(Array,size);
cout<<"},{";
Bianli2(Array,size);
cout<<"},M,";
if(CheckState(Array,size))cout<elsecout<<"{"<cout<<","<<"{"<cout<<"其中M:
"<if(CheckState(Array,size))
Bianli31(Array,size);
else
Bianli32(Array,size);
}
voidCreateFA2(LeftItemArray[],intsize,charstart,charend,StateItemSArray[],charTArray[],int&length,intMArray[][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;
cout<<"将NFA转化为DFA!
"<cout<<"DFAN'=({";
for(i=0;i{
if(i==0)cout<<"["<elsecout<<",["<}
cout<<"},{";
for(i=0;i{
if(i==0)cout<<"["<else
cout<<",["<}
cout<<"},M',["<cout<<"其中M':
"<for(i=0;ifor(j=0;j{
if(MArray[i][j]!
=-1)
{
k=MArray[i][j];
cout<<"M'(["<}
}
cout<<"其中F'={";
k=0;
for(i=0;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)cout<<"["<else
cout<<",["<k++;
}
}
cout<<"}"<}
voidRunFA1(LeftItemArray[],intsize,charstart,charend)
{
charTD[20];
inti=0,j;
chars=start;
cout<<"请输入要推导的符号串:
";
cin>>TD;
cout<<"M("<
for(j=0;TD[j]!
='\0';j++)
cout<
cout<<")"<while(TD[i]! ='\0') { if(TD[i+1]! ='\0') { cout<<"=M(M("< for(j=i+1;TD[j]! ='\0';j++) cout< cout<<")"<} s=FindNewState(Array,size,s,TD[i]);
展开阅读全文
相关搜索
资源标签
| |