编译程序总框
词法分析器的设计
词法分析的任务:
从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,
词法分析器(Lexical Analyzer):扫描器(Scanner),执行词法分析的程序
功能:输入源程序、输出单词符号
单词符号的种类:
-
基本字:如 begin,repeat,for,…
-
标识符:用来表示各种名字,如变量名、数组名和过程名
-
常数:各种类型的常数
-
运算符:+,-,*,/,…
-
界符:逗号、分号、括号和空白
-
输出的单词符号的表示形式
- (单词种别,单词自身的值)
-
单词种别通常用整数编码表示
- 若一个种别只有一个单词符号,则种别编码就代表该单词符号。假定基本字、运算符和界符都是一符一种。
- 若一个种别有多个单词符号,则对于每个单词符号,给出种别编码和自身的值。
- 标识符单列一种;标识符自身的值表示成按机器字节划分的内部码
- 常数按类型分种;常数的值则表示成标准的二进制形式
词法分析作为一个独立的阶段: 结构简洁、清晰和条理化,有利于集中考虑词法分析一些枝节问题,但不一定不作为单独的一遍,将其处理为一个子程序
词法分析器的结构
单词符号的识别:超前搜索
标识符识别:字母开头的字母数字串,后跟界符或算符
常数识别:识别出算术常数并将其转变为二进制内码表示
算符和界符的识别:把多字符组成的算符和界符拼合成一个单词符号
几点限制——不必使用超前搜索
- 所有基本字都是保留字;用户不能用它们作自己的标识符
- 基本字作为特殊的标识符来处理,使用保留字表
- 如果基本字、标识符和常数(或标号)之间没有确定的运算符或界符作间隔,则必须使用一个空白符作间隔
状态转换图
状态转换图是一张有限方向图,结点代表状态,用圆圈表示,状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类,一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态,状态转换图可用于识别(或接受)一定的字符串若存在一条从初态到某一终态的道路,且这条路上所有弧上的标记符连接成的字等于α,则称α被该状态转换图所识别(接受)
状态转换图的实现
全局变量与过程
- ch 字符变量,存放最新读入的源程序字符
- strToken 字符数组,存放构成单词符号的字符串
- GetChar 子程序过程,把下一个字符读入到 ch 中
- GetBC 子程序过程,跳过空白符,直至 ch 中读入一非空白符
- Concat 子程序,把ch中的字符连接到 strToken
- IsLetter和 IsDisgital 布尔函数,判断ch中字符是否为字母和数字
- Reserve 整型函数,对于 strToken 中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0
- Retract 子程序,把搜索指针回调一个字符位置
- InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针
- InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针
词法分析器的实现
将状态图的代码一般
变量curState用于保存现有的状态,用二维数组表示状态图:stateTrans[state][ch]