下载此文档

编译原理第七章.ppt


文档分类:IT计算机 | 页数:约45页 举报非法文档有奖
1/45
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/45 下载此文档
文档列表 文档介绍
编译原理
主讲教师:雷向东
第七章语义分析和中间代码产生
紧接词法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译。静态语义检查通常包括:
(1) 类型检查;如果操作符作用于不相容的操作数,编译程序必须报告出错信息。
(2) 控制流检查;控制流语句必须使控制转移到合法的地方。如果不存在包括它的这样的语句,则应报错。
(3) 一致性检查;在很多场合要求对象只能被定义一次。(4) 相关名字检查。有时,同一名字必须出现两次或多次。其他如名字的作用域分析等也都是静态语义分析的工作。
虽然源程序可以直接翻译为目标语言代码,但是许多编译程序却采用了独立于机器的、复杂性介于源语言和机器语言之间的中间语言。这样的好处是:
(1) 于进行与机器无关的代码优化工作;
(2) 便编译程序改变目标机更容易;
(3) 便编译程序的结构在逻辑上更为简单明确。以中间语言为界面,编译前端和后端的接口更清晰。
静态语义检查和中间代码产生的编译程序中的地位
语法分析器
静态检查器
中间代码产生器
优化器
中间代码
常见中间语言形式:后缀式、四元式、三元式和间接三元式。
(1) 后缀式,又称逆波兰表示式,这种表示法是,把运算量(操作数) 写在前面,把算符写在后面(后缀)。这种表示法用不着使用括号。
例如,表达式 a* (b+ c)的后缀式为abc*
表达式(a+b)*(c+d)的后缀式为ab+cd+*
只要知道每个算符的目数,对于后缀式,不论文从哪一端进行扫描,都能对它正确进行唯一分解。
后缀表示形式可以从表达式推广到其它语言成分。

(2) 三地址代码
三地址代码是由下面一般形式的语句构成的序列:
x:=y op z
其中,x,y,z为名字、常数或编译时产生的临时变量;op代表运算符号加定点运算符、浮点运算符、逻辑运算符等等。每个语句的右边只能有一个运算符。例如,源语言表达式 x+y*z 可以被翻译为如下语句序列:
T1:=y*z
T2:=x+T1
其中,T1,T2为编译时产生的临时变量。三地址语句通常有三种表示方法:四元式、三元式、间接三元式。
(3) 四元式
一个四元式是一个带有四个域的记录结构,这四个域分别称为op、arg1、arg2及result。域op包含一个代表运算符的内部码。三地址语句 x;=y op z 可表示为:将y置于arg1域,z置于arg2域,x置于result域,:=为算符。通常,四元式中的arg1,arg2和result的内容都是一个指针,此指针指向有关名字的符号表入口。这样,临时变量也要填入符号表中。
例如,赋值语句a:=b*-c+b*-c的四元式为
Op
Arg1
Arg2
Result
(0)
uminus
c
T1
(1)
*
b
T1
T2
(2)
uminus
c
T3
(3)
*
b
T3
T4
(4)
+
T3
T4
T5
(5)
:=
T5
a
(4) 三元式
为了避免把临时变量填入到符号表,我们可以通过计算这个临时变量值的语句的位置来引用这个临时变量。这样表示三地址代码的记录只需要三个域:op、arg1和arg2。因为用了三个域,所以称之为三元式。例如,赋值语句a:=b*-c+b*-c的三元式为
Op
Arg1
Arg2
(0)
uminus
c
(1)
*
b
(0)
(2)
uminus
c
(3)
*
b
(2)
(4)
+
(1)
(3)
(5)
:=
a
(4)
(5)间接三元式
为了便于代码优化处理,另设一张指示器(称为间接码表)它将按运算符的顺序列出有关三元式在三元表中的位置。换句话说就是,我们用一张间接码表辅以三元式表的办法来表示中间代码。这种表示法称为间接三元式。
当在代码优化过程中需要调整运算顺序时,只需重新安排间接码表,无需改动三元式表。事实上,改动三元式表是很困难的,因为,许多三元式通过指示器紧密相联系。

编译原理第七章 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数45
  • 收藏数0 收藏
  • 顶次数0
  • 上传人分享精品
  • 文件大小1.33 MB
  • 时间2017-08-20