《第03章 词法分析与有穷自动机(2).ppt》由会员分享,可在线阅读,更多相关《第03章 词法分析与有穷自动机(2).ppt(59页珍藏版)》请在人人文库网上搜索。

1、3.4.5 DFA的化简,1. DFA的化简,所谓一个DFA M 的化简是指寻找一个状态数比 M 少的 DFA M ,使得 L(M)=L(M) 。,(1) 没有多余状态。,化简了的DFA满足两个条件:,(2) 它的状态集中没有两个状态是 互相等价的。,所谓有穷自动机的多余状态是指从该自动机的开始状态出发,任何输入串不能到达的状态。,3.4.5 DFA的化简,2. 多余状态,3.等价状态,设 DFA M(Q,f, S0, Z), s, t Q ,若对任何 *, f (s , )Z 当且仅当 f (t , )Z ,则称状态 s 和 t 是等价的。,例如,终态与非终态是可区别的。因为终态有一条到达自。

2、身的道路,而非终态没有到达终态的道路。,3.4.5 DFA的化简,如果 s 和 t 不等价, 则称 s 和 t 是可区别的。,5.化简方法,一致性条件: 状态s和t必须同时为 终态或非终态。,4.两个状态等价的条件:,蔓延性条件: 对于所有输入符号a, 状态 s 和 t 必须转到等价的状态里。,输入:一个DFA M 。,输出:接受与M相同语言的DFA M , 且其状态数最少。,3.4.5 DFA的化简,无多余状态下把M的状态集 Q划分成一些不相交的子集,使得每个子集中任何两个状态是等价的,而任何两个属于不同子集的状态都是可区别的。,化简方法:,然后在每个子集中任取一个状态作“代表”, 而删去子。

3、集中其余状态, 并把射向其余状态的箭弧都改作射向作“代表”的状态中。,3.4.5 DFA的化简,A,F,G,I,L,M,W,Z,E,H,K,O,R,T,X,A,M,W,H,T,下面给出化简算法的具体执行步骤:,1. 将DFA M的状态集Q分成两个子集:终态集F和非终态集F,形成初始分划。,2. 对使用如下方法建立新划分NEW:,(1) 把G划分成新的子集,使得G的两个状态s和t属于同一子集,当且仅当对任何输入符号a ,状态s和t转换到的状态都属于的同一子集。,对的每个状态子集G:,3.4.5 DFA的化简,用G划分出的所有新子集替换G, 形 成新的划分NEW;,如果NEW,则执行第4步;否则令。

4、 NEW,重复第2步。,划分结束后,对划分中的每个状态子集,选出一个状态作代表,而删去其它一切等价的状态,并把指向其它状态的箭弧改为指向这个作为代表的状态。,3.4.5 DFA的化简,例1. 将右面的DFA最小化,初始分划=(A,B,C,DE),A,B,C,Da=B,分析 由图可知,给定的DFA中无多余状态。,A,B,C,Db=C,D,E,=(A,B,CDE),A,B,Ca=B,A,B,Cb=C,D,=(A,CBDE),A,Ca=B,A,Cb=C,=(A,CBDE),a,例2. 将右面的DFA M最小化,1,2l =2,=(1,20),分析 由图可知,给定的DFA无多余状态。,初始分划=(1,。

5、20),1,2d =2,3.4.5 DFA的化简,3.4.6 有穷自动机到正规式的转换,1. 在 M 的转换图上添加两个结点: X 结和Y结。从X结点用连线连结到M的所有初态结点,从 M 的所有终态结点用连线连结到 Y 结,从而构成一新的非确定有穷自动机 M,它只有一个初态结 X和一个终态结Y。显然,L(M)=L(M)。即,这两个NFA是等价的。,3.4.6 有穷自动机到正规式的转换,2. 逐步消去M中的其它结点,直至只剩下X,Y结点。在消除结点过程中,逐步用正规式来标记相应的箭弧。,消除结点的过程是很直观的,只需反复使用下图的替换规则即可。,3.4.6 有穷自动机到正规式的转换,对于,代换为。

6、,对于,代换为,代换为,对于,3.4.6 有穷自动机到正规式的转换,例1. 设有穷自动机的状态图如图所示,试求该自动机识别语言的正规式。,R=(10|01)(10|01)*,3.5 正规文法与有穷自动机,前面提到程序设计语言的单词符号可用乔母斯基3型文法正规文法来描述 对于正规文法所描述的语言可用一种有穷自动机来识别 下面分别就左线性正规文法/右线性正规文法给出构造相应有穷自动机的方法,3.5 正规文法与有穷自动机,右线性正规文法到有穷自动机的转换方法,则相应的有穷自穷自动机 M = (Q , , f , q0 , Z ),1. 令 Q= VND (D VN) Z=D = VT q0=S,2.。

7、 对G中每一形 AaB (A ,BVN ,aVT) 的产生式 , 令 f (A , a)=B,设给定了一个右线性正规文法 G = (VN ,VT , P , S),a= AB 令f (A , )=B,AaB Aa,3.5.1 右线性正规文法到有穷自动 机的转换方法,3. 对G中每一形如Aa(AVN ,aVT) 的产生式, 令 f (A , a)=D,4. 对G中每一形如A (AVN )的产生 式, 令A为接受状态或令 f (A , )=D,例1 构造下述文法GZ的有穷自动机。,Z0A,A0A | 0B,B1A | ,M = (Q , , f , q0 , Z ),G = (VN ,VT , P。

8、 , S),M=(VN D, VT ,f, Z, D),M=( Z,A,B,D, 0,1),f, Z, D),f =? 根据规则来确定,f(Z,0)=A f(Z,1)= f(z, )= f(A,0)=A,B f(A,1)= f(A, )= f(B,0)= f(B,1)=A f(B, )=D,Z0A,A0A | 0B,B1A | ,AaB (A ,BVN ,aVT),令 f (A , a)=B,Aa(AVN ,aVT), 令 f (A , a)=D,A (AVN ), 令A为接受状态 或令 f (A , )=D,3.5.2 左线性正规文法到有穷自动 机的转换方法,则相应的有穷自穷自动机 M = 。

9、(Q , , f , q0 , Z ),1. 令 Q= VNq0 (q0 VN) Z=S = VT,2. 对G中每一形如 ABa (A ,BVN ,aVT) 的产生式, 令 f (B , a)=A,设给定了一个左线性正规文法 G = (VN ,VT , P , S),a= AB 令f (B , )=A,ABa Aa,3.5.2 左线性正规文法到有穷自动 机的转换方法,3. 对G中每一形如 Aa (AVN, aVT) 的产生式, 令 f (q0 , a) =A,例1. 构造下述文法GA的自动机。,其状态图如下图所示。,显然,该自动机是确定的。它识别的语言就是文法GA所描述的语言。 即 L(GA)。

10、=L(M)=00*11*,BB0 | 0,AA1 | B1,3.5.3 有穷自动机到正规文法的转换,设给定有穷自动机M = (Q , , f , q0 , Z ),则相应的正规文法 G = (VN ,VT , P , S),1. 令 VN = Q VT = S = q0,3. 若f (A,a)=B 且BZ时,则将产生式 AaB | a 或将产生式AaB、B 加到P中。,3.5.3 有穷自动机到正规文法的转换,若文法的开始符号S是一个终态,则 将产生式 S 加到P中。,例1 设有穷自动机 M=(S,A,a,b,0,1 ,f , S , A),M的状态转换图如图所示。,根据上述转换规则,与M等价的。

11、正规文法G为:,其中P:,自动机M所识别的语言L(M)=L(G)=(a|b)(0|1|a|b)*。,f (S,a)=A f (S,b)=A,f (A,a)=A f (A,b)=A,f (A,0)=A f (A,1)=A,其中,G=(S,A,a,b,0,1,P,S),SaA | bA | a | b,AaA | bA| 0A | 1A | a | b | 0 | 1,例3 设DFA M=(A,B,C,D,0,1, , A,B),该自动机相应的状态转换图如下图所示。,构造一个右线性文法G,使得L(G)=L(M)。, (A,0)=B (A,1)=D, (B,0)=D (B,1)=C, (C,0)=B。

12、 (C,1)=D, (D,0)=D (D,1)=D,其中:,从状态转换图可以看出, 状态D是多余的,可以去掉,于是得到与M等价的DFA M的状态转换图如图所示。,3.5.3 有穷自动机到正规文法的转换,3.5.3 有穷自动机到正规文法的转换,G=(A,B,C,0,1, P, A)其中P为,或,该自动机所识别的语言为 0(10)*。,A0B | 0,B1C,C0B | 0,根据转换规则所求右线性文法为,A0B,B1C | ,C0B,C,A,0,0,1,3.6 词法分析程序的编写方法,构造词法分析程序的方法:,第二种方法是利用词法分析程序的自动生成工具LEX自动生成词法分析程序,第一种方法是用手工。

13、方式,即根据识别语言单词的状态转换图,使用某种高级语言,例如C语言直接编写词法分析程序。,下面以某种简单语言为例,对第一种方法作简要的介绍。,例如,下表列出了某个简单语言的所有单词符号,以及它们的种别编码和单词值。,右图是一张识别前表的单词符号的状态转换图。,图中, 状态0为初态, 凡带双圈者均为终态; 状态17是识别不出单词符号的出错情况。 l 代表任一字母,d 代表任一数字。,根据这张转换图,我们用C语言直接编写出识别该语言所有单词的词法分析程序。,3.6 词法分析程序的编写方法,在例中,我们规定所有关键字, 用户不得使用它们作为自己定义的标识符,这样我们可以把关键字作为一类特殊的标识符来。

14、处理,不再专设对应的转换图。但需把它们预先安排在一个表格中,此表叫关键字表。当利用状态转换图识别出一个标识符时,就去查关键字表,以确定它是否是一个关键字。,其次规定,若关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔,即此时的空白符是有意义的。,根据状态转换图构造出词法分析程序最简单的办法是让每个状态对应一小段程序。,1. ch 字符变量,存放当前读进的源程序字符。,2. token 字符数组, 存放构成单词符号的字符串。,3. getch( )读字符函数,每调用一次从输入缓冲区中读进源程序的下一个字符放在ch中,并把读字符指针指向下一个字符。,4. getb。

15、c( )函数,每次调用时,检查ch中的字符是否为空白字符,若是空白字符,则反复调用getbc( ),直至ch中进入一个非空白字符为止。,首先,我们引进词法分析程序所用的全局变量和需调用的函数如下:,3.6 词法分析程序的编写方法,6. letter(ch) 和 degit(ch)布尔函数,它们分别判定 ch 中的字符是否为字母和数字, 从而给出true 或 false。,7. reserve( )整型函数,对token中的字符串查关键字表,若它是一个关键字, 则回送它的编码,否则回送标识符的种别码10。,5. concat( )函数,每次调用把当前ch中的字符与token中的字符串联接。例如,。

16、假定token字符数组中原有值为 “ab”, ch中存放着 “c”,经调用concat( )后,token数组中的值变为“abc”。,3.6 词法分析程序的编写方法,8. retract( )函数,读字符指针回退一个字符。,9. return( )函数,收集并携带必要的信息返回调用程序,即返回语法分析程序。,10. dtb( ) 进制转换函数, 它将token中的数字串转换成二进制数值表示, 并以此作为函数值返回。,根据该语言的状态转换图用C语言编写出词法分析程序如下:,Scaner( ) token=NULL; getch( ); getbc( ); if (letter(ch) while。

17、(letter(ch) | digit(ch) concat( ); getch( ); retract( ); c=reserve( ); if(c!=10) return(c,token); else return( 10,token); ,相对于状态转换图用C语言编写出词法分析程序如下:,else if(digit(ch) while (digit(ch) concat( ); getch( ); retract( ); return(11,dtb( ); ,else switch(ch) case+: return(13, ); break ; case-: return(14, );。

18、 break ; case*: return(15, ); break ; case/: return(16, ); break ; case) return(18, ); retract( ); return(19, ); break; case: : getch( ); if(ch= = =) return(22, ); retract( ); return(21, ); break; case;: return(23, ); break; default: error( ); break; ,由此可知, 只要构造出识别语言单词符号的有穷自动机, 就很容易构造出识别语言单词符号的词法分析程。

19、序。,3.6 词法分析程序的编写方法,作业,1、用正规式描述下列正规集: (1)C语言的十六进制整数; (2)以ex开始或以ex结束的所有小写字母构成的符号串; (3)十进制的偶数。 2、构造下列正规式所对应的最小化确定有限自动机: (1)(aa|b)*(a|bb)* (2)ab*c*d (3)(a|b)*| bb)*,本章小结,本章重点介绍了词法分析程序的设计思想和构造方法。主要内容有:,1. 词法分析程序的功能是从左到右扫描源程序字符串,根据语言的词法规则识别出各类单词符号。,输出单词符号的形式是二元组: (单词种别,单词自身值),本章小结,例如定义“标识符”单词的正规式是 l (l | 。

20、d)*,正规文法是 标识符 l |标识符l | 标识符d,2程序语言单词符号的两种定义方式,正规文法,正规式,本章小结,3有穷自动机有确定的和非确定两大类:,NFA N = (Q , , f , S , Z )其中f是多值映射函数,S为非空初态集。,有穷自动机通常表示为状态转换图,它是有穷自动机的非形式化描述。,DFA M = (Q , , f , S , Z )其中是f单值映射函数,S是唯一初态,本章小结,从单词两种定义方式中构造词法分析程序的过程是:,4正规式、正规文法和有穷自动机三者都是描述正规集的工具, 它们的描述能力是等价的,它们之间可相互转换。,5证明两正规式是等价的,如果它们的最。

21、小状态DFA是相同的。也可以利用正规式的基本等价关系将一个正规式化简来证明两正规式之间的等价性或两正规式识别的语言一样。,本章小结,本章小结,例1 构造正规式R=1(0|1)*101的状态最小化的DFA,分析 首先对R采用分裂法构造NFA,见下图:,对NFA采用子集法构造其等价的DFA的状态转换矩阵,见右表,A F B C D E,字符,状态,0,1,X,1,2,3,2,3,4,2,3,5,2,3,4,Y,2,3,2,3,1,2,3,2,3,4,2,3,2,3,4,2,3,5,2,3,4,2,3,2,3,4,Y,2,3,5,2,3,4,本章小结,对DFA采用分化的方法化简,得到状态最小化的DF。

22、A,见下图 :,例2. 构造一个DFA它接收=0,1上所有满足如下条件的字符串,每个1都有0直接跟在右边。,分析 首先给出描述语言的正规式R=(0|10)*,采用分裂法从正规式构造NFA,采用子集法将NFA确定化为DFA,采用分化方法将DFA化简,字符,状态,0,1,X,A,Y,B,A,Y,A,Y,B,B,A,Y,A,Y,分析 给出描述语言的正规文法,S0S | 1A | A 0S,根据右线性文法构造有穷自动机的方法, 构造出如下的状态转换图:,例2. 构造一个DFA它接收=0,1上所有满足如下条件的字符串,每个1都有0直接跟在右边。,S0A | 1B A1S | 1 B0S | 0,分析 根。

23、据正规文法转换成正规式的方法,首先给出该 正规文法对应的正规式方程组:,S=0A+1B (1) A=1S+1 (2) B=0S+0 (3),将(2)、(3)代入(1)得 S=01S+01+10S+10 (4),对(4)使用求解规则得 S=(01|10)(01|10),即正规文法所生成语言的正规式是(01|10)(01|10)。,例3. 给出下述文法所对应的正规式:,例4 将右图确定化和最小化。,图示是一个无 边转移的NFA,采用子集法将NFA确定化为DFA,采用分化方法将DFA化简,本章小结,字符,状态,a,b,0,1,0,1,0,1,1,1,0,1,0,本章小结,例4. 设字母表=a,b,给出上的正规式 R= b*ab(b|ab)*,1. 试构造状态最小化的DFA M,使得 L(M)=L(R)。,2. 求右线性文法G,使L(G)=L(M)。,本章小结,对正规式R=b*ab(b|ab)*采用分列法构造NFA,见下图。,对NFA采用子集法构造其等价的DFA的状态转换矩阵,见表。,X B A Y E F,字符,状态,a,b,X,1,2,1,2,4,5,Y,6,5,Y,3,3,3,1,2,1,2,4,5,Y,6,5,Y,5,Y,6,5,Y,本章小结,对DFA采用分化的方法得到状态最小化的DFA,见图。

利用自动机识别c 语言单词,第03章 词法分析与有穷自动机(2).ppt相关推荐

  1. c语言程序设计第2章,C语言程序设计第2章 结构化程序设计与算法.ppt

    C语言程序设计第2章 结构化程序设计与算法.ppt 现在人们公认的具有"良好风格"的程序设计方法之一是所谓的"结构化程序设计方法".其核心是规定了算法的三种基本 ...

  2. c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt

    C语言课程第6章 函数及编译预处理 6.1模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题. ...

  3. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  4. 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt

    C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  5. C语言笔记第03章:数组

    了解更多关注中南林业科技大学软件协会官网:https://www.csuftsap.cn/ 来自软件协会编辑,注册会员即可获取全部开源.md资源,请勿转载,归软件协会所有. 任何问题联系软件协会. 文 ...

  6. 【编译原理笔记03】词法分析:正则表达式、有穷自动机(FA)、DFA与NFA及RE的相互转换、DFA识别单词、语法检测

    本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA 文章目录 ...

  7. c语言用自动机识别字符串,自动机专题

    自动机专题 这里是针对注释.标识符.实常数的识别,各实现一个有穷状态自动机. 其实,可以将注释.标示符.实常数三个有穷状态自动机合并成一个自动机,将三种情况下的状态进行合并,针对每种状态在各种字符的条 ...

  8. python语言单词_python 单词

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 代码# 猜单词游戏import random #添加words = (pytho ...

  9. python语言单词_python单词_python 单词_python单词书 - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 代码# 猜单词游戏import random #添加words = (pytho ...

最新文章

  1. linux给所有主机发送公钥,发送公钥到多台远程主机
  2. matlab gm 1 1,MATLAB 如何用GM(1,1)做预测?请大神帮忙!
  3. 装服务器显示磁盘脱机,服务器磁盘处于脱机
  4. 【JAVA基础】一:聊聊笔试常见到的 “==、equal” 比较是否相等的内在差别
  5. Taro+react开发(40)封装组件1
  6. C# java 有关“字节序”的描述 .
  7. 面试突击 002 | Redis 是如何处理已过期元素的?
  8. ​Cell:粟硕/施莽团队利用宏转录组揭示“野味”动物携带和人类疾病密切相关的多种病毒...
  9. Web前端笔记-2D图形平面内平移定位(two.js)
  10. [从零开始学习FPGA编程-26]:进阶篇 - 基本组合电路-数据选择器(Verilog语言)
  11. HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
  12. C语言编程练习:猜数游戏
  13. IA-32:Privilege level
  14. 《特征值与特征向量》定义、意义及例子
  15. 南京城市公共自行车推出共享单车,停在车桩附近可免费使用
  16. android+通过菜单跳转页面,【风马一族_Android】通过菜单的点击,跳转到不同界面...
  17. 自建dnspod解析服务器,自建DNS解析及Glue Record 自建DNS解析域名
  18. 微信公众号微信小程序申请出现的问题
  19. hadoop集群-单词统计
  20. .*? 和 .*的区别

热门文章

  1. python 操作 csv 编码问题,繁体字体乱码
  2. C语言中的指针,指针存在的意义
  3. MATLAB【函数和图像】
  4. android自学视频!2021年Android进阶者的新篇章,附面试题答案
  5. 最详细的HIve常用函数整理及案例演示
  6. NOAA(美国国家海洋和大气管理局)逐月数据下载文件之官方说明文档(GSOM)
  7. 2022年全球市场智能纺织品总体规模、主要生产商、主要地区、产品和应用细分研究报告
  8. 【Java / Kotlin】Warning:Leaking ‘this‘ in constructor of non-final class
  9. a6400监听_横评 | 索尼A6400、A6500、松下G9、GH5S、富士X-T30和佳能M50
  10. Open vSwitch安装指定版本ovs