编译原理——词法分析(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就有可能得到一个状态集。(这个用转换表来看会特别明显!)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值