编译原理 第5章 语法制导翻译技术和中间代码生成.pptVIP

  • 65
  • 0
  • 约1.86万字
  • 约 87页
  • 2018-04-13 发布于湖北
  • 举报

编译原理 第5章 语法制导翻译技术和中间代码生成.ppt

编译原理 第5章 语法制导翻译技术和中间代码生成

● example ● example ● example ● example ● example 属性计算方法 ● example ● example ◆ 属性计算算法设计 ◆ 属性计算算法设计 综合和继承属性 ● 属性的分类 ◆ 综合属性值的计算 ● 继承属性 ◆ 继承属性值的计算 4.三地址码 ● example ● 实现三地址码的数据结构 5.5自下而上语法制导翻译 ● 控制语句中IF语句的翻译 ● 控制语句中布尔表达式的翻译 ● While 语句中间代码的生成 例:赋值语句a=b*(c+d)相应的四元式代码为 (1) (+,c,d,t1) (2) (*,b,t1,t2) (3) (=,t2, ,a) ■ 举例 由上例可看出:如果op是一个算术或逻辑运算符,则总是新引进一个临时变量(上例中的t1,t2等)来存放运算结果。 四元式出现的顺序与表达式计算的顺序一致,四元式之间的联系是通过临时变量实现的。 四元式由于其表示更接近程序设计的习惯而成为一种普遍采用的中间代码形式。 ●表达式中间代码生成 Tn是编译过程中的临时变量,用以存储中间结果。 表达式的四元式变换如下: 例:求a=(b+c)*e+(b+c)/f的四元式 Quadruple四元式 Triple三元式 四元式的一般形式: 运算结果 操作数2 操作数1 操作符 例1 请写出算术表达式 2*a+(b-3) 的四元式表示 例2 请写出语句 x=(x+5)*y-6 的四元式表示 序号 三地址码 四元式 (1) x = y op z (op, y, z, x) (2) x = op y (op, y, , x) (3) x = y (=, y, , x) (4) goto L (j, , , L) (5) if x goto L (jnz, x, , L) (6) if x relop y goto L (jrelop, x, y, L) (7) param x (param, , , x) (8) call n, P (call, n, , P) (9) return y (return, , , y) (10) x = y[i] (=[], y[i], , x) (11) x[i] = y ([]=, y, , x[i]) (12) x = y (=, y, , x) (13) x = *y (=*, y, , x) (14) *x = y (*=, y, , x) 不同类的三地址码的四元式实现 ■三元式、间接三元式、四元式比较 在三元式表示中,每个语句的位置同时有两个作用:一是可作为该三元式的结果被其它三元式引用;二是三元式位置顺序即为运算顺序。 在代码优化阶段,当需要调整三元式的运算顺序时会遇到困难,这是因为三元式中的arg1,arg2也可以是指向某些三元式位置的指针,当这些三元式的位置顺序发生变化时,含有指向这些三元式位置指针的相关三元式也需随之改变指针值。因此,变动一张三元式表是很困难的。 四元式和间接三元式都不存在语句位置同时具有两种功能的现象,代码调整时要做的改动只是局部的。因此,中间代码优化时,四元式与间接三元式都比三元式方便的多。 ■练习 1、四元式之间的联系是通过( )实现的。 2、间接三元式表示法的优点为( ) A. 采用间接码表,便于优化处理 B. 节省存储空间,不便于表的修改 C. 便于优化处理,节省存储空间 D. 节省存储空间,不便于优化处理 3、表达式(~A+B)*(C+D)的逆波兰表示为( ) 4、写出赋值语句x=(a+b)*c/d的四元式序列。 临时变量 A ■练习 写出中缀表达式-a*(b+c)d+e t 的逆波兰表示以及四元式表示。 (一般用@表示一元运算符-,以区分) 一、中间代码有如下形式: ■ 表达式中间代码生成小结 1、逆波兰式 2、三元式 3、间接三元式 4、树形表示 5、四元式 6、三地址代码 二、表达式(b+c)*e/(b-c)+f的中间代码 ●简单赋值语句的(四元式)中间代码生成 四元式形式 : t :=arg1 op arg2 语义属性: id.name, E.place 函数: lookup(id.name) ; 过程: emit(t := arg1 op arg2); t: newtemp; 产生式和语义描

文档评论(0)

1亿VIP精品文档

相关文档