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

来源:互联网 发布:摄影测量info软件 编辑:程序博客网 时间:2024/05/16 11:08

本文主要来源于上课笔记

单词构造的两种方法:

  1. 正规文法

形如 AaB Aa

缺点是不直观

  1. 正规表达式

采用模板,好处是直观

1) aREϵ 属于特殊字符,ϵRE

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

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

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

词法分析:REFA 词法分析程序

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

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

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

其中,s0S,FS

moven:1/1:1 ,则是一个function ,则FA为DFA,否则FA为NFA

由NFA变为DFA

Ncases :

  1. 存在ϵ
  2. 有多个后继状态

1. NFA到DFA1

Markdown

Markdown

第3张图是一个ϵ 闭包

2. Markdown

此时是一个子集构造

Markdown

I0=ϵc({x})

I0={x}

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

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

I′′′′0=I′′′0=I′′′0

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

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

Markdown

I0I1 见上图

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

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

Markdown

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

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

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

对DFA进行优化

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

Division:

  1. clustering(聚类)——自下而上
  2. classifying(分类)——自上而下

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

state equivalence:

  1. 发出的边数相同
  2. 对应的标记相同(就是箭头上面的标记)
  3. 对应的后继状态等价

易见这是一个递归定义。

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

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

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

Markdown

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

Markdown

由于I0aI1,I1aI3,I2aI1

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

Markdown

同理,由b得到上图。

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

Markdown

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

RENFADFADFAoprogram

DFAo 表示优化过的DFA

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

如下例子:

Markdown

Markdown

Markdown

过程略一下。

RE转NFA的方法

方法1:

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

Markdown

Markdown

Markdown

方法2:

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

一个词法分析程序分析所有单词。

原创粉丝点击