三、词法分析
词法分析是编译的基础,主要分析原程序中的字符流能否构成正确的单词。
词法分析的任务和功能
词法分析的功能
- 主要功能如下:
- 按构词规则识别单词,输出单词本身及其种别码。
- 滤掉源程序中的无用成分,如空格、注释、回车换行等。
- 调用出错处理程序,识别并定位错误。
- 调用符号管理程序,对识别出来的单词及其属性进行管理。
词法分析的任务
- 主要任务:扫描源程序,识别单词,转换并输出token串,查填符号表,输出相应的错误信息。
- 输入是文本形式的源程序,输出包括token文件、符号表、源程序清单和错误信息。
- token文件是词法分析最重要的输出形式,以二元形式输出,用于存放源程序中识别出的每个单词及其种别码。
- 符号表是用来记录源程序中出现的各种名字和常数。
单词类型和种别码
- 单词类型:
- 关键字
- 标识符
- 常数
- 运算符
- 界符
- 单词种别码:词法分析程序输出的是与源程序等价的单词的中间形式(token串)
- 一个单词的输出是如下二元形式:(种别码,单词的值)
- 种别码表示单词的种类,通常用整数编码表示。
- 编码基本原则是不同的单词能彼此区别且有唯一的表示。
- 一般而言,一种程序设计语言的关键字、界符和运算符都是固定的,可以采用一字一种;而标识符一般统归为一种;常数按类型分种。
词法分析器的设计
接口设计
总体设计
详细设计
单词识别和状态转换图
-
状态转换图是描述单词构成的构成规则的一种很好的工具,它描述了词法分析器为识别一个单词所要做的动作。
- 状态转换图是一张有限方向图。
- 节点用圆圈表示,称为状态。
- 状态之间用带箭头的弧线连接,称为边。
- 由状态s到状态r的边上标记的字符表示使状态s转换到状态r的输入字符或字符类。
符号表及其操作
-
符号表
- 符号表是一种数据结构,用于保存源程序中出现的名字及其相关的属性信息。
- 一个名字具有一系列属性值,包括名字的种属、数据类型、值以及内存中的存储地址等。
- 符号表要在编译的多个阶段中操作。
- 在词法分析阶段,符号表的内容只有一小部分可以在词法分析阶段填写,如单词的名字和长度等。
- 值和种属在语义分析阶段填写。
- 内存地址在目标代码生成阶段填写。
- 符号表结构示意图
入口 | 单词名称 | 长度 | 类型 | 种属 | 值 | 内存地址 |
---|---|---|---|---|---|---|
1 | variable | 8 | 整型 | 简单变量 | 未知 | 未知 |
… |
- 符号表的操作
- 插入操作:将名字s及其token值插入符号表中,返回相应的入口。
- 查询操作:查找符号表是否存在名为s的表项,如果找到,则返回相应的入口,否则返回0。
词法分析阶段的错误处理
- 在词法分析器的设计过程中,需要考虑错误处理,常见的错误有4类:
- 非法字符错。即出现了程序设计语言字符集以外的符号。
- 处理方法:保持一张合法字符表,每读取一个符号就记录当前符号的行列位置,同时判断它是否属于合法字符,若不属于,则报告在源程序的某个位置出现了第一类错误
- 单词拼写错。
- 一种属于关键词拼写错误,在词法分析阶段无法发现,等到语法分析阶段才能发现;另一种是某些符号出现在不应该出现的位置,使得词法分析程序不能正确地识别出一个单词。
- 第二种情况处理方法:将不能按前一个单词的构词方式构成单词的符号作为下一个单词的开始。
- 注解或字符常数不闭合。
- 处理方法:限定注解或字符串常数的长度。可以限定直到本行为止。
- 变量说明有重复。即变量重复定义。
- 处理方法:只有当词法分析程序兼管查填符号表的工作和说明语句的翻译时,才能发现重复说明的错误。
- 非法字符错。即出现了程序设计语言字符集以外的符号。