1、目录1.需求分析21.2 NFA和DFA之间的联系32.概要设计33.详细设计43.1 子集构造法43.2 具体转换过程63.3 程序设计93.3.1 常量定义93.3.2 数据结构定义93.3.3 主要函数流程图114.测试分析145.用户手册166.课程总结161.需求分析1.1 NFA和DFA的概念NFA(nondeterministic finite-state automata)即非确定有限自动机, 一个非确定的有限自动机NFA M是一个五元式: NFA M=(S, , , S0, F)其中 S有限状态集 输入符号加上,即自动机的每个结点所射出的弧可以是中一个字符或是. S0初态集
2、F终态集 转换函数 S 2S (2S -S的幂集S的子集构成的集合)DFA(deterministic finite-state automata)即确定有限自动机,一个确定的有限自动机DFA M是一个五元式: M=(S, ,, S0, Z) 其中: S 有限状态集 输入字母表 映射函数(也称状态转换函数) SS (s,a)=S , S, S S, a S0 初始状态 S0 S Z终止状态集 ZS1.2 NFA和DFA之间的联系在非确定的有限自动机NFA中,由于某些状态的转移需从若干个可能的后续状态中进行选择,故一个NFA对符号串的识别就必然是一个试探的过程。这种不确定性给识别过程带来的反复,
3、无疑会影响到FA的工作效率。而DFA则是确定的,将NFA转化为DFA将大大提高工作效率,因此将NFA转化为DFA是有其一定必要的。2.概要设计通过本课程设计教学所要求达到的目的是:充分理解和掌握NFA,DFA以及NFA确定化过程的相关概念和知识,理解和掌握子集法的相关知识和应用,编程实现对输入NFA转换成DFA输出的功能。程序总框图如图1所示:总控模块NFA图结构状态转换表机构图操作初始化状态转换矩阵状态转换操作图1 程序总框图3.详细设计3.1 子集构造法已证明:非确定的有限自动机与确定的有限自动机从功能上来说是等价的,也就是说,我们能够从:NFA M DFA M使得 L(M)=L(M)为了
4、使得NFA确定化,我们首先给出两个定义:定义1:集合I的-闭包:令I是一个状态集的子集,定义-closure(I)为:1)若sI,则s-closure(I);2)若sI,则从s出发经过任意条弧能够到达的任何 状态都属于-closure(I)。 状态集-closure(I)称为I的-闭包定义2:令I是NFA M的状态集的一个子集, a 定义: Ia=-closure(J) 其中J = (s,a)J是从状态子集I中的每个状态出发,经过标记为a的弧而达到的状态集合。Ia是状态子集,其元素为J中的状态,加上从J中每一个状态出发通过弧到达的状态。给定如图2所示的NFA:bbaab0123 4图2与之等价
5、的DFA如图3:bab0,12,443a图33.2 具体转换过程为了说明跟清晰,我们使用实例说明,构造正规式101(0|1)*011的DFA?解:首先构造相应的NFA,如图4所示:10111001012356478图4将其写成M五元式则为:M=(0,1,2,3,4,5,6,7,8,0,1,,0,8)其中为: (0,1)1 (1,0)2 (2,1)3 (3,)4 (4,)5 (4,0)4 (4,1)4 (5,0)6 (6,1)7 (7,1)8 它所对应的状态转换矩阵如表1:表1状态010112233444455667788根据NFA转化为DFA的子集法转换法进行转换,对应的状态转换矩阵见表2:表
6、2II0I1011223,4,53,4,54,5,64,54,5,64,5,64,5,74,54,5,64,54,5,74,5,64,5,84,5,84,5,64,5对上表重新命名后的状态转换矩阵见表3:表3II0I1011223345446545647745将其写成M五元式则为:M=(0,1,2,3,4,5,6,7,0,1,0,5)其中为: (0,1)1 (1,0)2 (2,1)3 (3,0)4 (3,1)5 (4,0)4 (4,1)6 (5,0)4 (5,1)5 (6,0)4 (6,1)7 (7,0)4 (7,1)5 与表3对应的状态转换图如图5所示:110001101101236745图
7、5这样就完成了从正规表达式101(0|1)*011到DFA的转化。3.3 程序设计3.3.1 常量定义#define MAX 10#define NumMaxChar 10#define NumMAXTN 10 #define INFINIT 327673.3.2 数据结构定义NFA图结构定义如下:typedef struct edge /边int dest;char cost;struct edge *link; /指向下一边*Edge; typedef struct vertex /顶点char data; /状态Edge adj; /边*Vertex; typedef struct gr
8、aph /图Vertex NodeTable;int NumVertex;int MaxNumVertex;int NumEdge;*Graph;状态转换表机构定义如下:typedef struct tablenode /转换表节点char newname; /新命名char chMAX; /顶点集合*TableNode; typedef struct tablequeue /转换表列TableNode TNMAX; /转换表节点数组char transword; /转换条件int NumTn; /添加的顶点数*TableQueue; typedef struct transmatrix /状
9、态转换矩阵TableQueue TQ; /转换表列组int transnum; /转换表列数*TranMatrix;3.3.3 主要函数流程图void Smove函数流程图如图6所示:00非0非00非0开始int i,j,k=0,check,len;Edge p;while(t2k!=0)k+;for(i=0;iMAX;i+)for(j=0;jNumVertex;j+)if(g-NodeTablej.data=t1i) p=g-NodeTablej.adj;while(p!=NULL)if(p-cost=transword) check=CheckChar(t2,g-NodeTablep-de
10、st.data);if(check=1) t2k=g-NodeTablep-dest.data;k+;p=p-link;elsep=p-link;len=k;BubbleSort(t2,k);结束图6void Show_TranMatrix函数流程图如图7所示:000非0非0非0开始int i,j,k;printf(状态转换矩阵:n);for(j=0;jtransnum;j+)printf(转换字符:%c ,TM-TQj.transword);printf(n);for(k=0;kMAX;k+)for(j=0;jtransnum;j+)if(TM-TQj.TNk-newname=0) printf(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1