您的位置:首页 > 其它

编译原理与编译构造 由NFA变为DFA

2017-10-11 23:58 585 查看
本文主要来源于上课笔记

单词构造的两种方法:

正规文法

形如 A→aB A→a

缺点是不直观

正规表达式

采用模板,好处是直观

1) a∈RE ,ϵ 属于特殊字符,ϵ∈RE

2)if α,β is RE, α⋅β,α|β,α∗ are REs

例:ω∈(a,b)∗ ,且倒数第3个是a :

(a|b)∗a(a|b)(a|b)

词法分析:RE⇒FA⇒ 词法分析程序

FA: 状态数目有限,是一个有始有终的过程模型

FA的组成:S,Σ,s0,F,move

S 表示状态集,Σ 表示字母表,s0 表示开始状态,F 表示结束状态集/终止状态集,move 表示映射

其中,s0∈S,F⊆S

若move 是n:1/1:1 ,则是一个function ,则FA为DFA,否则FA为NFA

由NFA变为DFA

Ncases :

存在ϵ− 边

有多个后继状态

1.






第3张图是一个ϵ− 闭包

2.


此时是一个子集构造



I0=ϵ−c({x})

I′0={x}

I′′0=I′0⋃{5}={x,5}

I′′′0=I′′0⋃{1}={x,5,1}

I′′′′0=I′′′0⋃∅=I′′′0

此时迭代完成,知I0={x,5,1}

我们规定初始状态是I0,然后这个状态是要算出来的,因为要算闭包



I0→I1 见上图

由于{5,3,1} 这个状态不存在,我们命名为I1

最终所有的状态都应该由上面ϵ 闭包或子集构造得到。



结论1: 最多情况下由2n−1 种状态,其中n 是一开始图中圈出来的x,1,2,3,4,5,6,y 的个数 。减去的一个是空集。

结论2:核相同,则ϵ−c 相同

if {y}⋂Ii≠∅ , 则Ii 是一个终态 。在此题中,F={I3,I4,I5,I6}

对DFA进行优化

总的思想是,减少状态数。使用的方法是,等价类划分,使用聚类的思想。

Division:

clustering(聚类)——自下而上

classifying(分类)——自上而下

在这里我们需要将Ii 以终态、非终态划分

state equivalence:

发出的边数相同

对应的标记相同(就是箭头上面的标记)

对应的后继状态等价

易见这是一个递归定义。

若两个状态相同,则两个状态等价(强等价)。

若后继状态相同,则两个状态等价(强等价)。

若后继状态属于同一个已存在的叶节点,则弱等价。



由一开始的初始态和终态,得出上图。



由于I0→aI1,I1→aI3,I2→aI1

此时可见I1 在左边,I3 在右边,因此将I0,I2 划分到左边,I1 划分到右边,得到上图。



同理,由b得到上图。

在每个叶节点中选一个节点,在最右边的叶节点中选I3



此时整个图已经变成了这样。这也叫做the minimized DFA

RE⇒NFA⇒DFA⇒DFAo⇒program

DFAo 表示优化过的DFA

注意,需要用到look back 来检查是否之前的后继状态在同一节点而之后的后继状态不在同一节点的情况。

如下例子:







过程略一下。

RE转NFA的方法

方法1:

一些RE转NFA的规则(人喜欢的方法,也是考试时用的方法):







方法2:

方法2是龙书上的算法,笔记上有,由于考试不考,实验要用,因此现在先不管。以后再说。

一个词法分析程序分析所有单词。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: