图1 编译程序总框
一、词法分析器要求
1.功能和输出形式
功能:输入源程序,输出单词符号
单词符号分类:关键字(begin、while、if等等)、标识符、常数、运算符(+、-、*、/等等)、界符(如 逗号、分号、括号 等等)
单词符号表示形式:二元式(单词种别,单词符号的属性值)
单词种别通常用整数编码。一般而言,标识符统归为一种,常数按类型(整、实、布尔)分种,关键字可视为一种,也可以一字一种,运算符采用一符一种,界符一般用一符一种。
特别的,若一个种别只含一个单词符号,种别编码就代表自身。若一个种别含有多个单词符号,则除了要给出种别编码外,还要给出相应的单词符号的属性值
二、词法分析器设计
1.输入、预处理
图2 词法分析器结构图
词法分析器工作过程:输入源程序 → 放入输入缓冲区 → 调用预处理子程序 → 装入扫描缓冲区 → 单词符号识别 → 输出单词符号
词法分析器对扫描缓冲区进行扫描时一般采用两个指示器:
起点指示器:指向当前正在识别的单词的开始位置(新单词的首字符)
搜索指示器:用于向前搜索以寻找单词的终点
为保证单词符号不被扫描缓冲区的边界打断,扫描缓冲区最好采用一分为二的区域,即使用两个半区,如下图所示:
工作过程:搜索指示器从单词起点出发,若搜索到半区的边缘仍未到达单词的终点,调用预处理程序,令其把后续的输入字符装进另半区。
我们认定,在搜索指示器对另半区进行扫描的期间内,现行的单词的终点必定能到达。
单词符号识别的方法:超前搜索
2.状态转换图
转换图是一张有限方向图 。结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记代表射出结点状态下可能出现的输入字符或字符类。
一张转换图只包含有限个状态,其中一个被认为是初态,同时至少有一个终态(用双圈表示)。
终态结上打个 * 意味着多读进了一个不属于标识符部分的字符,应把它退还给输入串
三、正规表达式与有限自动机
1.正规式与正规集
递归定义
(1)
ε 和 ∅ 都是 Σ 上的正规式,它们表示的正规集分别为{ε}和 ∅ ;