编译原理——词法分析(3)有穷自动机中DFA与NFA的理解

 

1.1词法分析器生成工具Lex

虽然在学习上,我们学习的是Lex,但是最近经常使用的是词法分析器生成工具是Flex,它可以为C语言生成代码,Vern Paxson于1987年以C语言写作了Flex,他引用了Jef Poskanzer为Ratfor写作的词法分析器。如果我们想为Java生成代码,可以使用JFlex。

在Flex中,它支持使用正则表达式来描述各个词法单元的模式,由此给出一个词法分析器的规约。Lex工具的输入表示方法称为Lex语言,而工具本身则称为Lex编译器。在它的核心部分,Lex编译器将输入的模式转换成一个状态转换图,并生成相应的实现代码,并存放到文件lex.yy.c中。

1.2 Lex的使用流程

       (1)用Lex语言写出一个输入文件,描述将要生成的词法分析器,下图的lex.l为输入文件。

       (2)Lex编译器将lex.l转换成C语言程序,存放该程序文件的文件名总是lex.yy.c。

       (3)文件lex.yy.c总是被C编译器编译为一个名为a.out的文件

       其他:C编译器的输出就是一个读取输入字符流并声成词法单元流的可运行的词法分析器。

编译后的C程序,在下图中被称为a.out,通常是一个被语法分析器调用的子例程,这个子例程返回一个整数值,即可能出现的某个词法单元名的编码。而词法单元的属性值,不管它是一个数字编码,还是一个只想符号表的指针,或者什么都没有,都保存在全局变量yylval中。这个变量有词法分析器和语法分析器共享。这么做可以同时返回一个词法单元名和一个属性值。

词法分析器的输入是源程序的字符流

2.1有穷自动机

有穷自动机是识别器,它们只能对每个可能的输入串简单地回答”是”或”否”。分为两类:第一类是不确定的有穷自动机(NFA),它对其边上的标号没有任何限制,一个符号标记离开同一状态的多条边,并且空串也可以作为标号。第二类是确定的有穷自动机,对于每个状态及自动输入字母表中的每个符号,它都有且只有一条离开该状态、以该符号为标号的边。

2.1.1 不确定的有穷自动机(有多条路径)

       由五个部分组成:(1)一个有穷的状态集合S (2)一个输入符号集合Σ,即输入字母表。空串不是Σ中的元素。(3)一个转换函数,为每个状态和Σ∪{∈}中的每个符号都给出了相应的后继状态的集合。(4)初始状态。(5)S的一个子集F被指定为接受状态的集合。

2.1.2 确定的有穷自动机(仅有一条路径)

       是不确定有穷自动机的一个特例,其中不同在:(1)没有输入∈之上的转换动作。(2)对每个状态s和每个输入符号a,有且仅有一条标号为a的边离开s。

NFA抽象地表示了用来识别某个语言中的串地算法,而相应地DFA则是一个简单具体地识别串地算法。

3. 通过查了一些资料,以下是自己对DFA和NFA区别的一些理解(如有错误或补充望指出,一起学习呀~):

(1)左边一个可以认为用DFA来表示空串,右边一个也能表示空串,是NFA,但是不是DFA。

(2)对于DFA,一个特定的符号输入,有且只能得到一个状态,而NFA就有可能得到一个状态集。(这个用转换表来看会特别明显!)

1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值