[编译原理学习笔记3-1] 词法分析器
文章目录
前言
编译程序首先是在单词级别上来分析和翻译源程序的。词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。
因此,词法分析是编译的基础。执行词法分析的程序称为词法分析器。
对词法分析器的要求
词法分析器的功能
输入源程序,输出单词符号。
这里的单词符号指的是一个程序语言的基本语法符号
可分为以下五种:
- 关键字
- 标识符
- 常数
- 运算符
- 界符
词法分析器输出的单词符号常常表示为二元式:
词类编码原则:
- 界符和运算符:一符一码。
- 关键字可分成一类,也可以一个关键字分成一类。一字一码。
- 常数可统归一类,也可按类型(整型、实型、布尔型等),每个类型的常数划分成一类。一类型一码。
- 所有的标识符分为一类。一类一码。
对于关键字、界符、运算符,其单词自身的属性值通常为空因为他们的词类编码就可以表示完整信息。
作为例子考虑下述C++代码段:
while (i>=j) i- -;
经词法分析器处理后,它将转换的单词符号序列:
< while, - >
< ( , - >
< id ,指向i的符号表项的指针 〉
< >= , - >
< id ,指向j的符号表项的指针>
< ) , - >
< id ,指向i的符号表项的指针 >
< - - , - >
< ; , - >
词法分析器于语法分析器的协作
词法分析器的设计
词法分析器的结构大致如下
输入、预处理
- 输入串放在输入缓冲区中。
- 预处理子程序:剔除无用的空白、跳格、回车和换行等编辑性字符;注解部分可出现在任何地方、句末符等
单词符号的识别:超前搜索
超前搜索:超前扫描许多个字符,超前到能够肯定词性为止。
状态转换图
状态转换图是一张有限方向图
- 结点代表状态,用圆圈表示
- 状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类
- 一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态
一个状态转换图可用于识别(或接受)一定的字符串
终态结上打星号表示多读进一个不属于标识符的字符,应退回给输入串。
几点重要限制——不必使用超前搜索
- 所有基本字都是保留字;用户不能用它们作自己的标识符
- 基本字作为特殊的标识符来处理;不用特殊的状态图来识别,只要查保留字表。
- 如果基本字、标识符和常数(或标号)之间没有确定的运算符或界符作间隔,则必须使用一个空白符作间隔。
即DO99k=1,10要写成
DO 99 K=1,10
状态装换图的实现
思想:每个状态结对应一小段程序
做法:
- 对不含回路的分叉结,可用一个CASE语句或一组IF-THEN-ELSE语句实现
``` GetChar( ); if (IsLetter( )) {…状态j的对应程序段…;} else if (IsDigit( )) {…状态k的对应程序段…;} else if (ch=‘/’) {…状态l的对应程序段…;} else {…错误处理…;} ```一个例子
- 对含回路的状态结,可对应一段由WHILE结构和IF语句构成的程序
- 终态结表示识别出某种单词符号,因此,对应语句为
RETURN (C,VAL)
其中,C为单词种别,VAL为单词自身值.