编译引论(第六章)
语义分析及中间代码生成
中间代码
-
中间代码生成在编译程序中的位置
-
中间代码
**即中间语言,独立于机器的,复杂性介于源语言和机器语言之间的一种表示形式。**中间代码是高级程序语言中,各种语法成分的语义结构表示;它介于源语言和目标语言之间。
-
采用中间语言的好处
- 便于进行与机器无关的代码优化工作
- 使编译程序改变目标机更容易;
- **使编译程序的结构在逻辑上更为简单明确。**以中间语言为界面,编译前端和后端的接口更清晰。
中间语言-后缀式
-
后缀式
- 后缀表示法也叫逆波兰表示法,它是最简单一种中间代码表示法,主要用于表示算数表达式。
- 即将运算对象写在前面,把运算符写在后面的表示法。
- 定义9.1 后缀式的递归定义如下:
- 如果E是一个变量或常量,则E的后缀式就是E本身;
- 如果E是形如E1 op E2的表达式,其中op是任意的二元运算符 ,那么, E的后缀式为E1’ E2’ op,其中E1’和 E2’分别是E1和E2的后缀式;
- 如果E是(E1)形式的表达式,那么,E1的后缀式就是E的后缀式。
-
后缀式的例子
(a+b) *(a+c) 的后缀式为 ab+ac+*
-a+b+c/d* (a+c) 的后缀式为 a-b+cd/ac+*+
-
后缀式的特点
-
后缀式形式的表达式计算顺序唯一,无需使用括号来明确计算顺序;
-
只要知道每个算符的目数,计算参与运算数的个数,对后缀式从左到右进行扫描,就能对它进行唯一的分解。例如
-
表达式和与它对应的逆波兰表达式中的运算对象顺序是完全一致的,即表达式中的所有运算对象,均按原序排在其逆波兰表达式中
-a+b+c/d* (a+c) 的后缀式为 a-b+cd/ac+*+
-
后缀式特别适合利用栈的结构进行计算
- 自左向右扫描表达式的后缀表示,每遇到一个对象就把它压入栈内
- 每遇到一个算符,就从栈顶取出相应个数的运算对象进行计算,再将结果压入栈顶
- 最后,栈顶元素就是表达式的运算结果
-
三地址代码
-
三地址代码的一般形式的语句构成的序列
x:=y op z
x,y,z: 名字,常数,编译时产生的临时变量;
op: 运算符号(如定点运算符,浮点运算符,逻辑运算符等)
称为三地址代码的原因:每条语句通常包含三个地址,两个用来表示操作数,一个用来存放结果。如表达式x+y*z的三地址代码为:
$T_1$:=y*z
$T_2$:=x+$T_1$
具体实现:三地址代码是中间代码的一种抽象形式。在编译过程中,三地址代码语言的具体实现通常有四元式和三元式
语法制导翻译
对语法分析后的语法单位要进行语义分析,包括 两个阶段:
- 静态语义审查;
- 如果静态语义正确,生成中间代码
静态语义审查
-
作用:验证语法结构合法的程序是否真正有意义
-
包含的内容
类型检查
- 条件表达式的类型是不是布尔型
- 验证指针地址访问只作用于指针
- 函数必须有正确的参数个数和参数类型
- …
什么是语法制导翻译
语法制导翻译(syntax_directed translations) 是在语法分析过程中,随着分析(推导或归约)的逐步进 展,每识别出一个语法结构,根据文法的每个规则所对 应的语义子程序进行翻译的方法;核心技术是构造属性翻译文法 —-在原文法产生式中插入语义动作符号,借以指明属性文法中属性求值时机和顺序。
通俗地说,所谓语法制导翻译技术,是指
语法分析技术 +属性翻译文法构造技术
语法制导翻译的基本思想
- 如何表示语义信息
- 为CFG的文法符号设置语义属性,用来表示语法成分对应的语义信息
- 如何计算语义属性
- 文法符号的语义属性值是用来与文法符号所在产生式(语法规则)相关联的语义规则来计算
- 对于给定的输入串x,构建x的语法分析树,并利用与产生式(语法规则)相关联的语义规则来计算分析树中各结点对应的语义属性值
两个概念
- 将语义规则同语法规则(产生式)联系起来要涉及两个概念
- 语义制导定义
- 语法制导翻译方案
语法制导定义
-
SDD是对CFG的推广
- 将每个文法符号和一个语义属性集合相关联
- 将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值
-
如果X是一个文法符号,a是X的一个属性,则用X,a表示属性a在某个标号为X的分析树结点上的值
语法制导翻译方案
-
SDT是在产生式右部嵌入了程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作放在花括号内
一个语义动作在产生式中的位置决定了这个动作的执行时间
SDD与SDT
- SDD
- 是关于语言翻译的高层次规格说明
- 隐蔽了许多具体实现细节,使用户不必显式地说明翻译发生的顺序
- SDT
- 可以看作是对SDD的一种补充,是SDD的具体实施方案
- 显式地指明了语义规则的计算顺序,以便说明某些实现细节
语法制导定义SDD
- 语法制导定义SDD是对CFG的推广
- 将每个文法符号和一个语义属性集合相关联
- 将每个产生式和一组语义规则相关联,用来计算该产生式中各文法符号的属性值
- 文法符号的属性
- 综合属性(synthesized attribute)
- 继承属性(inherited attribute)
综合属性(synthesized attribute)
-
在分析树结点N上的非终结符A的综合属性只能通过N的子结点或N本身的属性值来定义
-
终结符可以具有综合属性。终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有计算终结符属性值的语义规则
-
带有综合属性的SDD
继承属性(inherited attribute)
-
在分析树结点N上的非终结符A的继承属性只能通过N的父结点、N的兄弟结点或N本身的属性值来定义
-
终结符没有继承属性。终结符从词法分析器处获得的属性值被归为综合属性值
-
带有继承属性的SDD
属性文法(Attribute Grammar)
- 一个没有副作用的SDD有时也称为属性文法
- 属性文法的规则仅仅通过其它属性值和常量来定义一个属性值
语法制导翻译方案SDT
- 语法制导翻译方案(SDT)是在产生式右部中嵌入了程序片段(称为语义动作)的CFG
- SDT可以看作是SDD的具体实施方案
- 本节主要关注如何使用SDT来实现两类重要的SDD,因为在这两种情况下,SDT可在语法分析过程中实现>基本文法可以使用LR分析技术,且SDD是S属性的
- 基本文法可以使用LL分析技术,且SDD是L属性的
将S-SDD转换为SDT
- 将一个S-SDD转换为SDT的方法:将每个语义动作都放在产生式的最后
算术表达式四元式属性翻译文法设计
-
算术表达式四元式属性翻译文法设计
-