词法分析
回看第一章的总框,此章为介绍词法分析器
在进行词法分析之前,源程序仅仅是一串字符序列
词法分析的任务
- 从左至右逐个字符地对源程序进行扫描,产生一个个单词符号
词法分析器(Lexical Analyzer)
- 扫描器(Scanner)
- 执行词法分析的程序
词法分析器的功能
功能
-
输入源程序、输出单词符号
单词符号的种类有以下几类
- 基本字:如 begin,repeat,for,...
- 标识符:用来表示各种名字,如变量名、数组名和过程名
- 常数:各种类型的常数
- 运算符:+,-,*,/,...
- 界符:逗号、分号、括号和空白
词法分析器的输出
作为编译程序的一个模块,词法分析器与其他模块之间有接口和交互行为,词法分析器识别出的单词会交给语法分析器,单词识别出的结果的输出形式一般是一个二元组形式,包括单词的种类和单词的本身的值
输出的单词符号的表示形式
-
(单词种别,单词自身的值)
- 单词种别通常用整数编码表示
- 若一个种别只有一个单词符号,则种别编码就代表该单词符号。假定基本字、运算符和界符都是一符一种。
- 若一个种别有多个单词符号,则对于每个单词符号,给出种别编码和自身的值。
- 标识符单列一种;标识符自身的值表示成按机器字节划分的内部码
- 常数按类型分种;常数的值则表示成标准的二进制形式
eg: C程序
while (i>=j) i--;
输出单词符号
< while, - >
< (, - >
< id, 指向i的符号表项的指针 >
< >=, - >
< id, 指向j的符号表项的指针 >
< ), - >
< id, 指向i的符号表项的指针 >
< --, - >
< ;, - >
词法分析器在编译器中地位
如图所示,源程序首先输入到词法分析器,按照词法规则取出一个单词,将该单词输入到语法分析器,语法分析器得到单词并进行下一步处理,当语法分析完毕后,取出下一个单词,此时语法分析和词法分析都会和符号表交互