编译原理实验六DFA最小化Word格式.docx

上传人:b****6 文档编号:18795901 上传时间:2023-01-01 格式:DOCX 页数:7 大小:44.20KB
下载 相关 举报
编译原理实验六DFA最小化Word格式.docx_第1页
第1页 / 共7页
编译原理实验六DFA最小化Word格式.docx_第2页
第2页 / 共7页
编译原理实验六DFA最小化Word格式.docx_第3页
第3页 / 共7页
编译原理实验六DFA最小化Word格式.docx_第4页
第4页 / 共7页
编译原理实验六DFA最小化Word格式.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

编译原理实验六DFA最小化Word格式.docx

《编译原理实验六DFA最小化Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验六DFA最小化Word格式.docx(7页珍藏版)》请在冰豆网上搜索。

编译原理实验六DFA最小化Word格式.docx

由上述定义知,K1和K2是不等价的。

(2)对各状态集每次按下面的方法进一步划分,直到不再产生新的划分。

设第i次划分已将状态集划分为k组,即:

K=K1(i)∪K2(i)∪…∪Kk(i)

对于状态集Kj(i)(j=1,2,…,k)中的各个状态逐个检查,设有两个状态Kj’、Kj’’∈Kj(i),且对于输入符号a,有:

F(Kj'

,a)=Km

'

,a)=Kn

如果Km和Kn属于同一个状态集合,则将Kj’和Kj’’放到同一集合中,否则将Kj’和Kj’’分为两个集合。

(3)重复第

(2)步,直到每一个集合不能再划分为止,此时每个状态集合中的状态均是等价的。

(4)合并等价状态,即在等价状态集中取任意一个状态作为代表,删去其他一切等价状态。

(5)若有无关状态,则将其删去。

根据以上方法就将确定有限自动机进行了简化,而且简化后的自动机是原自动机的状态最少的自动机。

 

四:

数据结构与算法

structedge{

stringfirst;

//边的初始结点

stringcondition;

//边上的条件

stringlast;

//边的终点

};

stringmove(stringcollection,charch,edge*b)//状态集合I的a弧转换

intdivide(edge*b,stringchange)//分割子集法进行DFA的最小化

五:

出错分析

1:

在数据结构的定义之中,字符与字符串的差别,本次实验室字符串而不是字符

六:

实验结果与分析

七:

源代码

#include<

iostream>

string>

usingnamespacestd;

#definemax100

intN;

//NFA的边数

stringpart[max];

//分割子集

{

inti,j;

strings="

"

;

for(i=0;

i<

collection.length();

i++)

{

for(j=0;

j<

N;

j++)

{

if(b[j].first[0]==collection[i]&

&

b[j].condition[0]==ch)

s=s+b[j].last;

}

}

if(s=="

)return"

elsereturns;

}

boolisexist(strings,stringd)//判断子串是否存在在某一集合

if(d!

="

0<

=d.find(s)&

d.find(s)<

=d.length()-1)return1;

elsereturn0;

intx,m,flag=2,flag0,i,j;

stringss,part0[max];

flag0=flag;

for(x=0;

x<

change.length();

x++)

{

for(m=0;

m<

flag0;

m++)

for(i=0;

part[m].length();

{

ss=move(part[m].substr(i,1),change[x],b);

for(j=0;

flag;

{

if(isexist(ss,part[j]))part0[j]=part0[j]+part[m].substr(i,1);

if(ss=="

{

part0[flag]=part0[flag]+part[m].substr(i,1);

break;

}

}

}

for(j=0;

=flag;

if(part0[j]!

part0[j]!

=part[m])

part[flag++]=part0[j];

part0[j]="

part[m]="

elsepart0[j]="

flag0=flag;

returnflag;

voidmain()

inti,j,flag,x;

stringCondition;

stringss;

edge*b=newedge[max];

cout<

<

...................编译原理实验六:

DFA最小化...................."

endl;

请输入DFA各边信息:

起点条件(空用&

表示)终点并以输入#结束。

max;

cin>

>

b[i].first;

if(b[i].first=="

#"

)break;

else

cin>

b[i].condition>

b[i].last;

N=i;

请输入该DFA的终态集合:

part[1];

请输入该DFA的非终态集合:

part[0];

请输入此DFA状态中的边上的条件:

Condition;

flag=divide(b,Condition);

DFA最小化划分的子集如下:

if(part[i]!

)cout<

part[i]<

用状态A,B,C·

·

等代替子集:

{"

},"

endl<

则DFA最小化后的各边信息如下:

charletters[max];

charletter='

A'

letters[i]=letter;

++letter;

for(j=0;

Condition.length();

ss=move(part[i],Condition[j],b);

if(part[i]!

ss!

letters[i]<

"

Condition[j]<

for(x=0;

if(isexist(ss.substr(0,1),part[x]))cout<

letters[x]<

system("

pause"

);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1