6、4.2词法分析器的设计
1、词法分析器的结构
预处理子程序在扫描器的调用下,将源程序输入到输入缓冲区,预处理子程序读取输入缓冲区的字符进行文本的预处理。
经过预处理后规范性更好的文本被送到扫描缓冲区,预处理子程序返回到扫描器,
扫描器继续从缓冲区中读取预处理后的文本,根据词法规则识别出单词的符号。
扫描缓冲区
两个半区互补使用
2、单词符号的识别:超前搜索
- 基本字识别:
- 例如:
DO99K = 1, 10 DO 99 K = 1 , 10
DO99K=1.10
IF(5.EQ.M)GOTO55 IF ( 5 .EQ.M) GOTO 55
IF(5)=55
-
- 上面情况需要超前搜索才能确定哪些是基本字
- 标识符识别
- 字母开头的字母数字串,后跟界符或算符
- 常数识别
- 识别出算术常数并将其转变为二进制内码表示
5.EQ.M
5.E08
- 算符和界符的识别
- 把多字符组成的算符和界符拼成一个单词符号
- 几点限制——不必要使用超前搜索
- 所有基本字都是保留字;用户不能用它们作自己的标识符
- 基本字作为特殊的标识符来处理,使用保留字表
- 如果基本字、标识符和常数(或标号)之间没有确定的的运算符或界符做间隔,则必须使用空白符作间隔
DO99K = 1 , 10
要写成DO 99 K = 1, 10
3状态转换图
- 状态转换图是一张有限方向图
- 结点代表状态,用圆圈表示
- 状态之间用箭弧连接,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类
- 一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态
- 状态转换图可用于识别(或接受)一定的字符串
- 若存在一条从初态到某一终态的道路,且这条路上所有弧上标记符连接成的字等于α,则称α被该状态转化图所识别(接受)
*代表不包括其他
识别整常数的状态转换图
- 词法分析器的设计示例
- 一个简单的程序设计语言-单词表
4、状态转化图的实现
- 每个状态节点对应一小段程序
- 不含回路的分叉结点
- 可用一个case语句或一组if-then-else语句实现
- 含回路的状态结点
- 对应一段由while结构和if语句构成的程序
- 终态结点
- 表示识别出某种单词符号,对应返回语句
- 全局变量与过程
- ch字符变量,存放最新读入的源程序字符
- strtoken字符数组,存放构成单词符号的字符串
- get har子程序过程,把下一个字符读入到ch中
- getbc子程序过程,跳过空白符,直至ch中读入一非空白符
- concat子程序,把ch中的字符连接到strtoken
- IsLetter和IsDisgital布尔函数,判断ch中字符是否为字母和数字
- Reserve整数函数,对于strToken中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0(标识符)
- Retract子程序,把搜索指针回调一个字符位置(回退)
- InsertId整型函数,将strToken中的标识符插入符号表,返回符号表指针(地址)
- InertConst整型函数过程,将strToken中的常数插入常数表,返回常数表指针
- 将状态图的代码一般化
- 变量curState用于保存现有的状态
- 用二维数组表示状态图:stateTrans[state][ch]