#编译原理
-
编译器的结构
第一章 概述
1-1词法分析概述
-
词法分析的主要内容
-
从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。
-
将识别出的单词转换成统一的机内表示——词法单元(token)形式。
token:<中别码,属性值>
-
-
例:词法分析后得到的token序列
1-2语法分析概述
-
语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)
-
语法分析树描述了句子的语法结构
-
例1:赋值语句的分析树
-
例2:变量声明语句的分析树
-
文法:
-
输入:
int a, b, c -
分析树:
-
-
1-3语义分析概述
-
语义分析的主要任务
-
收集表示符的属性信息
-
种属(Kind)
简单变量、复合变量(数组、记录、…)、过程、…
-
类型(Type)
整形、实型、字符型、布尔型、指针型、…
-
存储位置、长度
-
值
-
作用域
-
参数和返回值信息
参数个数、参数类型、参数传递方式、返回值类型、…
-
-
收集的信息将存入符号表中
-
语义检测
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 数组下标不是整数
- 对非数组变量使用数组访问操作符
- 对非过程名使用过程调用操作符
- 过程调用的参数类型或数目不匹配
- 函数返回类型有误
-
1-4中间代码生成和编译器后端
-
常用的中间表示形式
- 三地址吗(Three-address Code)
- 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
- 语法结构树/语法数(Syntax Trees)
- 三地址吗(Three-address Code)
-
常见的三地址指令
补:x=y[i]中 y对应的是基地址,而i为偏移地址,并非数组下标
地址可以具有如下形式之一
> 源程序中的名字(name)
>常量(constant)
>编译器生成的临时变量(temporary)
- 三地址指令的表示
- 四元式(Quadruples)
- (op, y, z, x)
- 三元式(Triples)
- 间接三元式(Indirect triples)
- 四元式(Quadruples)
- 三地址指令的四元式表示
三地址指令序列唯一确定了 运算完成的顺序
-
中间代码生成的例子
-
目标代码生成器
- 目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
- 目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
-
代码优化
- 为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼得
第二章 词法分析
2-1词法语法分析基本概念
-
字母表(Alphabet)
- 字母表Σ是一个有穷符号集合
- 符号:字母、数字、标点符号、…
- 字母表Σ是一个有穷符号集合
-
字母表上的运算
-
字母表Σ1和Σ2的乘积
-
Σ1Σ2 = {ab|a∈Σ1, b∈Σ2}
例:{0,1}{a,b}={0a,0b,1a,1b}
-
-
字母表Σ的n次幂(power)
-
字母表Σ的正闭包(positive closure)
- Σ+=Σ∪Σ2∪Σ3∪···
- Σ+=Σ∪Σ2∪Σ3∪···
-
字母表Σ的克林闭包(Kleene closure)
- Σ*=Σ0∪Σ+=Σ0∪Σ∪Σ2∪Σ3∪···
- Σ*=Σ0∪Σ+=Σ0∪Σ∪Σ2∪Σ3∪···
-
-
串(String)
- 设Σ是一个字母表,∀x∈∑* ,x称为是∑上的一个串
- 串是字母表中符号的一个有穷序列
- 串s的长度,通常记作==|s|,是指s中符号的个数==
- 例: |aab|=3
- 空串是长度为0的串,用ε(epsilon)表示
- |ε|= 0
- 设Σ是一个字母表,∀x∈∑* ,x称为是∑上的一个串
-
串上的运算——连接
- 如果 x和y是串,那么x和y的连接(concatenation) 是把y附加到x后面而形成的串,记作xy
- 例如,如果 x=dog且 y=house,那么xy=doghouse
- 空串是连接运算的单位元( identity),即,对于任 何串s都有,εs = sε = s
- 如果 x和y是串,那么x和y的连接(concatenation) 是把y附加到x后面而形成的串,记作xy
-
串上的运算——幂
-
串s的幂运算
-
s1 = s0s = εs = s,s 2 = ss,s 3 = sss,…
-
例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,…
-
-