天天看点

自己动手构造编译系统:编译、汇编与链接2.1.1 词法分析

<b>2.1.1  词法分析</b>

  

      编译器工作之前,需要将用高级语言书写的源程序作为输入。为了便于理解,我们使用c语言的一个子集定义高级语言,本书后续章节的例子都会使用c语言的一些基本语法作为示例。现在假定我们拥有一段使用c语言书写的源程序,词法分析器通过对源文件的扫描获得高级语言定义的词法记号。所谓词法记号(也称为终结符),反映在高级语言语法中就是对应的标识符、关键字、常量,以及运算符、逗号、分号等界符。见图2-2。

  例如语句:

var2=var1+100;

   该语句包含了6个词法记号,它们分别是:“var2”“=”“var1”“+”“100”和分号。

  对词法分析器的要求是能正常识别出这些不同形式的词法记号。词法分析器的输入是源代码文本文件内一长串的文本内容,那么如何从文本串中分析出每个词法记号呢?为了解决这个问题,需要引入有限自动机的概念。

  有限自动机能解析并识别词法记号,比如识别标识符的有限自动机、识别常量的有限自动机等。有限自动机从开始状态启动,读入一个字符作为输入,并根据该字符选择进入下一个状态。继续读入新的字符,直到遇到结束状态为止,读入的所有字符序列便是有限自动机识别的词法记号。

  图2-3描述了识别标识符的有限自动机。c语言标识符的定义是:一个不以数字开始的由下划线、数字、字母组成的非空字符串。图中的自动机从0号状态开始,读入一个下划线或者字母进入状态1,状态1可以接受任意数量的下划线、字母和数字,同时状态1也是结束状态,一旦它读入了其他异常字符便停止自动机的识别,这样就可以识别任意一个合法的标识符。如果在非结束状态读入了异常的字符,意味着发生了词法错误,自动机停止(当然,上述标识符的有限自动机不会出现错误的情况)。

图2-3  标识符有限自动机

  我们以赋值语句“var2=var1+100;” 中的变量var2为例来说明有限自动机识别词法记号的工作过程。

  识别var2的自动机状态序列和读入字符的对应关系如表2-1所示,结束状态之前识别的字符序列即为合法的标识符。

  使用有限自动机,可以识别出自定义语言包含的所有词法记号。把这些词法记号记录下来,作为下一步语法分析的输入。如果使用一遍编译方式,就不用记录这些词法记号,而是直接将识别的词法记号送入语法分析器进行处理。

继续阅读