词法分析是编译的第一个阶段
1.1、词法分析的任务
从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。
将识别出的单词转换成统一的机内表示——词法单元(token)形式
token:< 种别码,属性值 >
token是一个2元组,由种别码和属性值构成。
种别码表示单词的种别,那么程序设计语言中的单词的类型都包含哪些呢?
1.2、大体上分为5类
1、给定一个程序语言,它的关键字是可以提前确定的,这种是一个单词会给定一个种别码
2、标识符是一个开放的集合,也就是不能事先枚举所有的标识符,因此将所有的标识符统一作为一类单词,给它分配一个种别码。为了区分不同类型的标识符,使用token的第2个分量-属性值,不同类型的标识符,属性值是不同的
3、常量,与标识符类似,也是开放的集合。但是不同类型的常量构成方式不同,因为为每一个类型分配一个种别码。所以是一型一码。同一种常量下的不同常量也是用token的第2个分量进行区分
4、运算符和界限符,也是可以提前确定的。所以会给每一个运算符和每一个界限符分配一个种别码,也就是一词一码
语法分析是编译的第2个阶段。
2.1、语法分析的任务
从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)
2.2、赋值语句分析树
第2行是词法分析后生成的token序列
下面是该语句的分析树
可以看到,一个表达式加上或者乘以另外一个表达式,就会变成另外一个更大的表达式。而一个标识符加上一个等号,加上一个表达式,最后跟上一个分号就会变成一个赋值语句
2.3、变量声明语句的分析树
表示的是一个类型T连上一个IDS,再连上一个分号可以构成一个声明语句。其中
D Declaration 声明
T Type 类型
IDS Identity Sequence 标识符序列
其中type只能是int | real | char | bool 中的一种
IDS 可以理解为一个标识符本身可以构成IDS,此外 一个标识符序列加上一个逗号,再加上一个标识符可以构成一个更大的标识符序列
看这个例子
int a , b , c ;
它的分析树如图
a本身是一个标识符,可以构成IDS,一个IDS加上一个逗号,再加上一个标识符b可以构成一个更大的标识符序列.int是一个类型,连上一个IDS和右边的分号最后构成声明语句D
发表评论