子集构造法NFA转换成DFA

教材《编译原理》(龙书)第2版

关于这部分,教材在P94页有说明,但是我觉得不容易理解,下面通过两个例题来理解一下。

例题一:

子集构造法NFA转换成DFA_第1张图片

这一题比较简单,我们直接从答案找解题方法

子集构造法NFA转换成DFA_第2张图片

第一步:要根据NFA画出这个表格,可能有些模糊,表头分别为I,Ia,Ib,状态是对I这一列自定义的状态名称

下面我们来说一下第一行的三项如何得出:(S就是开始状态)

 先以S开始,经过任意个ε得到的结点就是第一个I,这道题就是{X, 1,2},

然后将{X,1,2}中的每一个字符经过a (中间可以有ε)后得到的结点加起来,

X的Ia={1,2}, 1的Ia={1,2}, 2的Ia是空集,所以这一行的Ia={1,2}。

后面的Ib也是一样,只不过是经过b后得到的结点的集合.

也就是说I的第一行第一列{X, 1,2},是从开始符号经过ε得到的集合,而Ia,Ib是集合中每个结点分别经过a,b得到的集合的并集。

第二行的第一列I,是第一行的Ia,如果仔细观察,就可以发现:第一列都是将前面的Ia和Ib作为I计算新的Ia和Ib。

当然要注意重复的状态集合,就没有必要再作为I写一次了。

直到把所有的新状态都作为I写一遍,这个表就完成了。

第二步:根据表格画出DFA

子集构造法NFA转换成DFA_第3张图片

将这些集合依次标号,这道题是{X,1,2}为X,{1,2}为1, {1,2,3}为2,{1,2,Y}为3,根据上面那个表就可以把图画出来了。

关于箭头指向和箭头的值,都要从每一行的三项来看,比如第一行,如果把集合换成自定义的状态编号就是

I       Ia       Ib

X      1       2

意思就是X经过a到达状态1,X经过b到达状态2。

并且由于Y在NFA中是一个接受状态,在表格的状态3中也有Y,所以3是接受状态。

例题二:

将下图NFA转换成DFA

子集构造法NFA转换成DFA_第4张图片

这一个NFA中不含有ε,一开始我也不知该怎么做,和上一题有一些小区别,是我同学给我讲的,如果不对,就不要借鉴了。

子集构造法NFA转换成DFA_第5张图片

区别就在于,每一个集合不再是把所有经过a,b的结点都写入,而是只写第一个经过的结点,例如第一行的Ib,从A经过b的所有结点事{E,B},但是只记录了一个E。

最后的结果是:

 

子集构造法NFA转换成DFA_第6张图片

 

 

你可能感兴趣的:(编译原理期末复习)