1.1简介
词法分析器是唯一一趟会操作输入程序中每个字符的处理过程。它的任务相对简单,聚合字符以形成源语言中的单词和标点。
为完成这种聚集和分类操作,词法分析器会应用一组描述输入程序设计语言的词法结构(也称 微语法)的规则;微语法规定了如何将字符组合为单词,以及反过来如何分开混合在一起的各个单词。
1.2识别单词
例举最简单的一种方式:逐字符处理 new
该代码片段对每一个字符执行了一次测试,图中右侧给出了简单的转移图来表示该片段。这个转移图表示了一个识别器,每个圆圈代表一个状态。接受状态以双层圆圈绘制,在识别器的转移图中,通常会省去目标为错误状态的转移。
识别多个单词,从同一个给定状态发出多条边。例举:识别 new 和 not 的识别器
通过合并初始状态并重新标记所有状态,可以合并用于识别 new/not 的识别器和用于 while 的识别器。
1.21识别器的形式化
转移图可以看作是形式化的数学对象,称为有限自动机(FA,Finite Automata),它定义了识别器的规格。
有限自动机是一个五元组(S,,
,S0,SA),各分量含义如下:
识别 new/not/while 的FA形式如下:
对于状态si和输入字符c的所有其他组合,定义(si,c)=se,se是指定的错误状态。这种五元组与转移图是等价的,给出一种表示,可以建立另一种表示。
FA在处理字符串时的情况:
1)状态连通输入字符转入下一个状态;以此类推,直至耗尽所有的输入,最后一次应用的结果仍然是一个状态。如果是个接受状态,那么FA就接受了该字符串。
2)某个字符x可能使FA转移到错误状态se。这种情况表明发生了词法错误,在FA接受的语言中,该字符串不是任何单词的有效前缀。
3)如果FA耗尽输入后,终止于se之外的某个非接受状态,此时FA同样会发现输入的一个错误。
1.12识别更复杂的单词
以无符号整数为例:一般来说,一个整数或者为0,或者由一个或多个数位组成,其中第一位可以是1到9的任意数字,后续数位可以是0到9的任意数字。
但这个转换图有几个问题:第一,无法终结,这违反了有限集S的规定;第二,从s2开始,这条路径上所有状态都是等价的,即它们的输出转移边上有同样的标签且均为接受状态。
如果我们允许转移图有环,即可显著简化FA。
就FA而言,这种有环的转移图是有意义的,但从实现角度,它比无环更为复杂。它无法直接转换成一组嵌套的 if-then-else 结构。环的引入,产生了对循环控制的需求,可以用 while 来实现。