编译原理-词法分析

前言:

参考网易公开课-西安交大编译原理

一、词法分析器的要求

1. 词法分析器的功能和输出格式

功能:输入源程序,输出单词符号

单词符号:一个程序语言的基本语法符号

单词符号的分类:

  • 关键字:有程序语言定义的具有固定意义的标识符(for/if等)。选择语言后确定
  • 标识符:用来表示各种名字(变量名,数组名,过程名等)。选择语言后不确定
  • 常数:整型、实型、布尔型、字符型等。选择语言后不确定
  • 运算符:+、-、*、/等。选择语言后确定
  • 界符:逗号、分号、括号、注释等等。选择语言后确定

词法分析器输出格式:二元组------->  (单词类别,单词自身性)

例子:

编译原理-词法分析_第1张图片

编译原理-词法分析_第2张图片

二、词法分析与语法分析的关系

1. 分离词法分析和语法分析的优点:

  • 使程序有条理
  • 词法分析可以使用正则文法自动构造scanner
  • 有利于提高语法分析效率
  • 可以改善词法分析细节,甚至一个语法分析配几个scanner

2. 把词法分析作为独立的一遍

  • scanner当作一遍

编译原理-词法分析_第3张图片

  • 把scanner当做子程序

编译原理-词法分析_第4张图片

三、词法分析器过程

前提:

  • 把scanner作为独立子程序

  • 词法分析器任务为输出单词符号

1. 预处理

必要性:编辑性字符(空白符、回车符等)除了出现在文字或者常数中以外,在别处出现无意义

功能:剔除无用字符

编译原理-词法分析_第5张图片

需要解决的问题:

问题1:需要判断字符是否能组成单词

解决方法:使用起始指针和搜索指针,两指针之间为单词

编译原理-词法分析_第6张图片

问题2:读入输入缓冲时可能出现被单词截断的情况

解决方法:将缓冲区切分为两个逻辑相连的缓冲区,每次只读取一个缓冲区数据,下一次读入的缓冲数据与上一次的相连

编译原理-词法分析_第7张图片

问题3:缓冲区最小多大

解决方法:单词长度的最大字符

综上,扫描缓冲区的结构为:

编译原理-词法分析_第8张图片

2. 单词符号的识别--超前搜索

超前搜索作用:单词符号识别

不同类型单词的搜索:

a. 标识符的识别

格式:多数为"字母/数字"串

界定:标识符后多数跟算符或界符

超前搜索方法:超前看一个字符

b. 关键字的识别

格式:不同关键字对后续影响不同。

超前搜索方法:不同关键字需要有不同超前搜索终止条件。

c. 常数的识别

搜索方法:超前搜索,超前搜索一个字符。

d. 算符和界符的识别

对于"++"/"--"等复合成的算符,需要超前搜索。

3. 状态转换图

简介:

状态图:有限方向图。结点表示状态,状态之间使用箭弧连接,箭弧上的标记代表射出结状态下可能出现的输入字符或字符串。

状态图功能:识别一定的字符串。

初态:一张转换图的启动条件,至少有一个,用圆圈表示。

终态:一张转换图的结束条件,至少有一个,用双圆表示。

*:表示多读进了一个字符。

示例图:

编译原理-词法分析_第9张图片

编译原理-词法分析_第10张图片

综合例子:

编译原理-词法分析_第11张图片

编译原理-词法分析_第12张图片

4. 状态图的实现

编译原理-词法分析_第13张图片

流程:

第一步:从输入缓冲区中取一个字符。(GETCHAR方法)

第二步:确定在本状态下,哪一条弧对应刚刚输入的字符标识。如果找到,控制就跳转到该弧指向的状态,否则寻找该单词失败。

失败:先行指针需要重新回到开始指针处,并用另一个状态图来搜索另一个单词。若搜索完所有状态图后,仍然没有匹配上,则为词法错误。

 

你可能感兴趣的:(编译原理)