- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
幻灯片1
编译原理——练习2
王金伟
计算机与信息工程学院
天津师范大学
幻灯片2
7.1中间语言
中间语言
源程序的中间表示方法
中间语言的形式
后缀式
图表示法
三地址代码
2
幻灯片3
一.后缀式
把运算量(操作数)写在前面,把算符写在后面。
例如:a+b,写成ab+
1.表达式E的后缀表示递归定义
如果E是变量和常数,则E的后缀表示是E本身
如果E是形如E1 op E2的表达式,其中op是任意的二元算符,则E的后缀表示是E1’ E2’ op,其中E1’和E2’分别是E1和E2的后缀表示
如果E是形如(E1)的表达式,则E1的后缀表示也是E的后缀表示
注意:后缀表示不需要括号
3
幻灯片4
例:赋值语句 a := b *(- c)+ b *( - 34)
的后缀式:
a b c - * b 34 - * + :=
4
幻灯片5
习题1:给出下面表达式的后缀式:
(1) a*(-b+c)
(2) a+b*(c+d/e)
(3) -a+b*(-c+d)
(4) not A or not (C or not D)
(5) (A and B) or (not C or D)
(6) (A or B) and (C or not D and E)
解:
(1) ab@c+*
(2) abcde/+*+
(3) a@bc@d+*+
(4) A not C D not or not or
(5) A B and C not D or or
(6) A B or C D not E and or and
5
幻灯片6
三、三地址代码
1.一般形式
x := y op z
是一系列的上述形式
x, y, z是名字、常数和编译器产生的临时变量
op是算符,定点、浮点、逻辑,只能有一个
例:x + y * z翻译成
t1 := y * z
t2 := x + t1
三地址代码是AST或DAG的线性化表示
dag图对应的三地址代码可能比相应的语法树对应的三地址代码要优化,因为可以复用中间结果
包含三个地址:两个操作数,一个结果
6
幻灯片7
例子:
相应于a:=b * - c+b * -c的AST和DAG的三地址代码
t1 := -c t1:=-c
t2 := b* t1 t2:=b*t1
t3 := -c t5:=t2+t2
t4 := b* t3 a:= t5
t5 := t2+t4
a := t5
(a)对于AST的代码 (b)对于DAG的代码
7
幻灯片8
2.三地址代码的种类
(1)赋值语句:
x := y op z,op是二元算术算符或逻辑算符
(2)赋值语句:
x := op z,op是一元算符,如:负号,逻辑非not等
(3)复写语句:
x := y
(4)无条件转移:
goto L,L是下一步要执行的三地址语句的标号
(5)条件转移语句:
if x relop y goto L
根据逻辑运算的结果决定是否执行转移
if a goto L
a为真跳到L执行,否则执行if后边的语句
8
幻灯片9
(6)过程调用语句:param x和call p, n
n表示实参个数
例如:call p(x1 , x2 , … , xn ),表示成三地址语句:
param x1
param x2
… …
param xn
call p , n
过程返回:return y
y表示返回值
9
幻灯片10
(7)数组引用赋值
x := y[ i ]
x[ i ] := y
(8)地址和指针的使用
x := y
x := *y
*x := y
10
幻灯片11
3. 三地址代码的具体实现
三地址代码是一种抽象形式,其具体实现可用结构体来表示,有以下几种表示方法:
四元式 :op, arg1, arg2, result
三元式 :op, arg1, arg2
间接三元式:间接码表+三元式表
11
幻灯片12
(1)四元式
op, arg1, arg2, result
op:算符的内部编码
arg1和arg2分别表示两个操作数
result表示计算结果
arg1、arg2和result的内容通常是符号表条目指针
注意:
一元运算不需要使用arg2的域
param不使用arg2和result域
条件转移和无条件转移把目标语句的标号放在result中
12
幻灯片13
例
文档评论(0)