编译原理NFA转化为DFA的转换算法及实现Word下载.doc

上传人:b****9 文档编号:13027117 上传时间:2022-10-02 格式:DOC 页数:17 大小:731KB
下载 相关 举报
编译原理NFA转化为DFA的转换算法及实现Word下载.doc_第1页
第1页 / 共17页
编译原理NFA转化为DFA的转换算法及实现Word下载.doc_第2页
第2页 / 共17页
编译原理NFA转化为DFA的转换算法及实现Word下载.doc_第3页
第3页 / 共17页
编译原理NFA转化为DFA的转换算法及实现Word下载.doc_第4页
第4页 / 共17页
编译原理NFA转化为DFA的转换算法及实现Word下载.doc_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

编译原理NFA转化为DFA的转换算法及实现Word下载.doc

《编译原理NFA转化为DFA的转换算法及实现Word下载.doc》由会员分享,可在线阅读,更多相关《编译原理NFA转化为DFA的转换算法及实现Word下载.doc(17页珍藏版)》请在冰豆网上搜索。

编译原理NFA转化为DFA的转换算法及实现Word下载.doc

2.1.3NFA与DFA的矩阵表示 5

2.1.4NFA向DFA的转换的思路 6

3DFA的化简 6

3.1化简的理论基础 6

3.2化简的基本思想 7

4程序设计 7

4.1程序分析 7

4.1.1流程图 7

4.1.2子集构造法 9

4.2实现代码 11

1.前言

1.1选题的依据和必要性

由于很多计算机系统都配有多个高级语言的编译程序,对有些高级语言甚至配置了几个不同性质的编译程序。

从功能上看,一个编译程序就是一个语言翻译程序。

语言翻译程序把源语言书写的程序翻译成目标语言的等价程序。

经过编译程序的设计可以大大提高学生的编程能力。

编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化[1]。

由于现在有很多词法分析程序工具都是基于有穷自动机的,而词法分析又是语法分析的基础[2],所以我们有必要进行有穷自动机的确定化和最小化。

1.2课题意义

编译程序的这些过程的执行先后构成了编译程序的逻辑结构[3]。

有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具[4]。

NFA转化为DFA的理论在词法构造至整个编译器构造过程中起着至关重要的作用,同时它们被广泛应用于计算机科学的各个领域,它们与计算机其它学科也有着密切的联系。

2NFA转化为DFA的算法及实现

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。

内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。

进行NFA转换为DFA的词法分析和语法分析,首先要对目标对象有有所了解,这就需要对NFA、DFA进一步了解。

2.1基本定义

NFA,也称不确定的有穷自动机,是由一个五元式定义的数学模型,特点是它的不确定性,即在当前状态下,读入同一个字符,可能有多个下一状态。

DFA,也称确定的有穷自动机,也是由一个五元式定义的数学模型,相对的特点是它的确定性,即在当前状态下,读入同一个字符,最多有一个后继状态。

2.1.1NFA的概念

NFA(nondeterministicfinite-stateautomata)即非确定有限自动机,一个非确定的有限自动机NFAM’是一个五元式:

NFAM’=(S,Σ∪{ε},δ,S0,F)

其中S—有限状态集

S0—初态集F—终态集

δ—转换函数S×

Σ∪{ε}→2S

(2S--S的幂集—S的子集构成的集合)

状态转换图如图2.1.1:

S

1

Z

0

P

0,1

图2.1.1NFA状态转换图

2.1.2DFA的概念

DFA(deterministicfinite-stateautomata)即确定有限自动机,一个确定的有限自动机DFAM是一个五元式:

M=(S,Σ,δ,S0,Z)

其中:

S—有限状态集

Σ—输入字母表

δ—映射函数(也称状态转换函数)

Σ→S

δ(s,a)=S’,S,S’∈S,a∈Σ

S0—初始状态S0∈S

Z—终止状态集ZÍ

a

b

a,b

图2.1.2DFA状态转换图

2.1.3NFA与DFA的矩阵表示

一个NFA或者DFA还可以用一个矩阵[5]表示,矩阵也可以说是状态转换表,它的优点是可以快速访问给定的状态在给定的输入字符时能转换到的状态集。

矩阵,每个状态一行,每个输入符号和ε(如果有需要的)各占一列,表的第i行中与输入符号a对应的表项是一个状态集合,表示NFA或者DFA在状态i输入a时所能到达的状态集合(DFA的集合唯一),即δ(i,a)[6]。

(7)

如图2.1.1可用表2.3.1.表示:

表2.3.1NFA状态转换表

输入

状态

1

{P}

{S,Z}

{}

{Z}

Z

如图2.1.2可用表2.3.2表示:

表2.3.2DFA状态转换表

2

3

2.1.4NFA向DFA的转换的思路

从NFA的矩阵表示中可以看出,表项通常是一状态的集合,而在DFA的矩阵表示中,表项是一个状态,NFA到相应的DFA的构造的基本思路是:

DFA的每一个状态对应NFA的一组状态DFA使用它的状态记录在NFA读入一个输入符号后可能达到的所有状态[4]。

2.2NFA和DFA之间的联系

在非确定的有限自动机NFA中,由于某些状态的转移需从若干个可能的后续状态中进行选择,故一个NFA对符号串的识别就必然是一个试探的过程。

这种不确定性给识别过程带来的反复,无疑会影响到FA的工作效率。

而DFA则是确定的,将NFA转化为DFA将大大提高工作效率,因此将NFA转化为DFA是有其一定必要的。

3DFA的化简

得到新的DFA之后,并没有完成任务,因为通过NFA转化成DFA不一定是最简的,也就是说,有多余的状态可以被删除,而我们需要的是得到一个唯一的最简的DFA[12],也就是说,NFA转化为DFA之后,还需要化简,也就是最小化。

3.1化简的理论基础

DFA的化简是指:

寻找一个状态数最少的DFAM,使得L(M)=L(M’)。

化简的方法是消去DFAM中的多余状态(或无用状态),合并等价状态。

DFA中的多余状态是指这样的状态:

从开始状态出发,读入任何输入串都不能到达的那个状态;

或者从这个状态没有通路到达终态。

两个状态S和T等价是指:

如果从状态S出发能读出某个字W而停于终态,从T出发也能读出同样的字W而停于终态;

反之,从T出发能读出同样的字W而停于终态,从S出发也能读出某个字W而停于终态。

3.2化简的基本思想

化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表[13-15],这种方法称为“分割法”。

具体过程是:

(1)将M的所有状态分成两个子集——终态集和非终态集;

(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;

(3)重复第

(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。

这时DFA的状态被分成若干个互不相交的子集。

(4)从每个子集中选出一个状态做代表即可得到最简的DFA。

4程序设计

通过本设计所要求达到的目的是:

充分理解和掌握NFA,DFA以及NFA确定化过程的相关概念和知识,理解和掌握子集法的相关知识和应用,现在需要编程[16-18]实现对输入NFA转换成DFA输出的功能。

4.1程序分析

4.1.1流程图

程序总框图如图4.1所示:

总模块

NFA图结构

状态转换表

DFA图结构

初始化状态转换矩阵

状态转换操作

图4.1.1程序总框图

开始

输入NFA,初始化NFA

初步转化为DFA

结束

重命名化简

图4.1.2功能图

4.1.2子集构造法

已证明:

非确定的有限自动机与确定的有限自动机从功能上来说是等价的,也就是说,我们能够从:

NFAM’DFAM

使得L(M)=L(M’)

为了使得NFA确定化,我们首先给出两个定义:

定义1:

集合I的ε-闭包:

令I是一个状态集的子集,定义ε-closure(I)为:

1)若s∈I,则s∈ε-closure(I);

2)若s∈I,则从s出发经过任意条ε弧能够到达的任何

状态都属于ε-closure(I)。

状态集ε-closure(I)称为I的ε-闭包

定义2:

令I是NFAM’的状态集的一个子集,a∈Σ

定义:

Ia=ε-closure(J)

其中J=∪δ(s,a)

——J是从状态子集I中的每个状态出发,经过标记为a的弧而达到的状态集合。

——Ia是状态子集,其元素为J中的状态,加上从J中每一个状态出发通过ε弧到达的状态。

给定如图2所示的NFA:

ε

4

图4.1.3

与之等价的DFA如图3:

{0,1}

{2,4}

{4}

{3}

图4.1.4

求开始状态闭包

标记F令它为集合C中的唯一成员

集合C中存在尚未被标记子集

标记T

对子集T中的每个输入字母求U=Ia子集

将U加入C中

结束语

图4.1.5子集构造法的流程图

这样就完成了从正规表达式101(0|1)*011到DFA的转化。

4.2实现代码

#include<

iostream>

string>

#defineMAXS100

usingnamespacestd;

stringNODE;

//结点集合

stringCHANGE;

//终结符集合

intN;

//NFA边数

structedge{

stringfirst;

stringchange;

stringlast;

};

structchan{

stringltab;

stringjihe[MAXS];

voidkong(inta)

{

inti;

for(i=0;

i<

a;

i++)

cout<

<

'

'

;

}

//排序

voidpaixu(string&

a)

inti,j;

charb;

for(j=0;

j<

a.length();

j++)

if(NODE.find(a[i])>

NODE.find(a[i+1]))

b=a[i];

a[i]=a[i+1];

a[i+1]=b;

}

voideclouse(charc,string&

he,edgeb[])

intk;

f

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

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

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

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