编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析

 词法分析:

  • 主要功能:词法分析器从输入中读入字符,并将它们组成词法单元对象
    • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
  • 主要步骤:
    • 预读:使用一个变量peek来保存当前已读入的数字或字符的下一个输入字符,来对已读入的字符进行预判,如果当前已读入字符能够识别,则peek设置为空白符。当词法分析器返回一个词法单元时,变量peek要么保存了当前词法单元的词素后的那个字符,要么保存空白符。
    • 剔除空白和注释:
      • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
      •  图2-29中的伪代码在遇到空格、制表符或换行符时不断读取输入字符,从而跳过了空白部分。变量peek存放了下一个输入字符。在错误消息中加入行号和上下文有助于定位错误。这个代码使用变量line统计输入中的换行符个数。

    • 识别和计算常量:
      • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
      •  图2-30中的伪代码读取一个整数中的数位,并用变量v累计得到这个整数的值。

    • 识别关键字和标识符:
      • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
      •  图2-31中的伪代码使用get操作来查找保留字。这个伪代码从输入中读取一个以字母开头、由字母和数位组成的字符串s。我们假定读取的s尽可能地长,即只要词法分析器遇到字母或数位,它就不断从输入中读取字符。当它遇到的不是字母或数位,比如它遇到了空白符,已读取的词素就被复制到缓冲区b中。如果字符串表中已经有一个s的条目,它就返回由words.get得到的词法单元。这里s可能是一个关键字,在表words初始化的时候这个s就已经在表中了;它也可能是一个之前被加入到表中的标识符。如果不存在s对应的条目,那么由id和属性值s组成的词法单元被加入到字符串表中,并被返回。

  • 词法分析器:
    • 主流程:
      • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
      • 返回词法单元对象的函数scan
    • 各个对象:
      • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
      • 类Token:
        • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
        • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
        •  类Token有一个tag字段,用于做出语法分析决定
      • 子类Num和子类Word:
        • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
        • 子类Num增加了一个字段value,用于存放整数值

        •  子类Word增加了一个字段lexem,用于保存关键字和标识符的词素

    • Lexer:
    • 编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析

参考-《编译原理(第二版)》

相关推荐