词 法 分 析 程 序 的 功 能
编译过程的第一步是进行词法分析,词法分析的任务是对字符串表示的源程序从左到右地进行扫描和分解,根据语言的词法规则识别出一个一个具有独立意义的单词符号。
执行词法分析的程序称为词法分析程序,或称词法分析器或扫描器。
单 词 符 号 及 输 出 单 词 的 形
词法分析程序是以字符串形式的源程序作为输入,以单词符号或单词符号表示的源程序作为输出。
3.2.1 语言的单词符号
语言的单词符号是指语言中具有独立意义的最小语法单位,即单词符号是程序语言的基本语法单位。程序语言的单词符号一般可分为下面 5 种:
(1 )关键字,也称基本字,例如, C 语言中的 if , else , while , do等,这些字在语言中具有固定的意义,一般不作为标识符使用。
(2 )标识符,表示各种名字,如变量名、常量名、数组名和函数名等。
(3 )常数,各种类型的常数,如整型常数 125 、实型常数 0.718 、布尔型常数 TRUE 等。
(4 )运算符,如 + - * / < 等。
(5 )界符,如 , ; ( ) : 等。
一个程序语言的关键字、运算符和界符的个数是确定的,而对于标识符或常数的使用个数通常是不确定的。
3.2.2 词法分析程序输出单词的形式
词法分析程序所输出的单词符号通常表示成如下的二元式:
(单词种别,单词自身的值)
- 单词种别
单词种别表示单词的种类,它是语法分析需要的信息,一个语言的单词符号如何划分种类、分成几个种类、怎样编码,这是一个技术性的问题,它主要取决于处理上的方便,通常的方法是让每种单词对应一个整数码,其目的是最大限度地把各个单词区别开来。基本字可将其全体视为一种,也可以一字一种。采用一字一种的分法处理起来较为方便。标识符一般统归为一种。常数可统归为一种,也可按类型(整型、实型、布尔型等)分种。运算符和界符可采用一符一种的分法,也可以统归为一种。
- 单词自身的值
单词自身的值是编译中其他阶段所需要的信息。我们可采用下面的方法来确定它的值。
(1 )如果一个种别只含一个单词符号,那么对于这个单词符号,种别编码就完全代表它自身的值。
(2 )如果一个种别含有多个单词符号,那么对于它的每个单词符号,除了给出种别编码之外,还应给出单词符号的自身值,以便把同一种类的单词区别开来。标识符自身值是标识符自身的字符串;常数自身值是常数本身的二进制数值。我们也可用指向某类表格中一个特定项目的指针值来区分同类中不同的单词。例如,对于标识符,用它在符号表的入口指针作为它自身值;常数用它在常数表的入口指针作为它的自身值。
假定基本字、运算符和界符都是一符一种,标识符自身的值用自身的字符串表示,常数自身的值用常数本身的值(转变成标准二进制形式)表示,则程序段 if (a >1 ) b =100 ;在经词法分析程序扫描后,它所输出的单词符号串是:
( 2 ,) 基本字 if
(29 ,) 左括号(
(10 , 'a' ) 标识符 a
(23 ,) 大于号 >
(11 , ' 1 ' 的二进制) 常数 1
(30 ,) 右括号 )
(10 , 'b' ) 标识符 b
(17 ,) 赋值号 =
(11 , ' 100 ' 的二进制)常数 100
(26 ,) 分号 ;
这里,假设标识符的种别编码为整数 10 ,常数的种别编码为整数 11 ,基本字 if 种别编码为2 ,赋值号的种别编码为 17 ,大于号的种别编码为 23 ,分号的种别编码为 26 ,左括号的种别编码为 29 ,右括号的种别编码为 30 。