词法分析是编译的第一个阶段。


词法分析的主要任务

从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成同一的机内表示-词法单元(token)形式。

token<种别码,属性值>是一个二元组。

种别码表示单词的种别。

单词类型 种别 种别码
关键字 program、if、else、then、… 一词一码
标识符 变量名、数组名、记录名、过程名、… 多词一码
常量 整型、浮点型、字符型、布尔型、… 一型一码
运算符 算术(+、-、*、/、++、–)、关系(>、<、==、!=、>=、<=)、逻辑(&、 、~)
界限符 ;、(、)、=、{、}… 一词一码

给定一个程序设计语言,其关键字集合事先可以确定,因此为每一个关键字分配一个种别码,也就是一词一码。

标识符是程序员为程序中声明的数据对象或者过程起的名字,由于标识符是一个开放的集合,也就是说事先不能枚举所有的标识符,因此将所有的标识符同一作为一类单词并为它们分配同一个种别码,也就是多词一码,为了区分不同的标识符,使用token的第二个分量属性值来存放不同标识符具体的字面值。

常量与标识符类似,也是一个开放的集合,事先不能枚举所有的常量。为每种类型的常量分配一个种别码,也就是一型一码。为了区分同一类型下的不同常量,也是使用token的第二个分量属性值来存放每个常量具体的值。

运算符、界限符和关键字一样,事先可以确定,因此可以为每一个运算符和界限符分配一个种别码,也就是一词一码。

当然,对于运算符,可以为每一类运算符分配一个种别码,然后通过属性值存放具体的运算符。

例: 语法分析后得到的token序列

输入

1
while(value!=100){num++;}

输出

编号 单词 token
1 while <WHILE,->
2 ( <SLP,->
3 value <IDN,value>
4 != <NE,->
5 100 <CONST,100>
6 ) <SRP,->
7 { <LP,->
8 num <IDN,num>
9 ++ <INC,->
10 ; <SEMI,->
11 } <RP,->

种别码本身是整数,此处采用了宏定义的形式。

while是一个关键字,一词一码,可以通过种别码与其他单词区分开来,所以第二个分量为空。同样的道理,左括号、不等号、右括号、左大括号、右大括号、加加、分号也都是一词一码的,所以第二个参数也为空。

value和num为标识符,其种别码都是IDN,第二个分量属性值分别存放各自的字面值,通过字面值区分不同的标识符。

100是常量,种别码为CONST,第二个参数为其值本身。

最后修改日期:2020年5月23日

留言

撰写回覆或留言