第六章中间代码江西师范大学课件.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 中间代码 中间代码的形式 表达式的翻译 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 优点 形式简单、语义明确、便于翻译 独立于目标语言 图表示法:抽象语法树 语法制导翻译以语法树作基础, 实际上, 语法树可以作为一种合适的中间语言形式。 现在对语法树进行改造,去掉那些对翻译不必要的信息,将语法树进行抽象 --- 抽象语法树。 在抽象语法树中,每个叶结点都表示诸如常量或变量这样的运算对象,而其它内部结点则表示运算符。 语法制导翻译既可以基于语法分析树也可以基于抽象语法树进行,采用的基本方法是一样的。 为下面文法的句子 x = a-4*c 建立抽象语法树: S?V=E V?id E? E+E | E-E | E*E | (E) | id | num 为每个运算量或运算符号都建立一个结点。 可以根据表达式的运算顺序自下而上的构造 --- 手工构造。 逆波兰表示法 逆波兰表示法又称后缀式表示法。逆波兰表示法是波兰逻辑学家卢卡西维奇发明的一种表示表达式的方法。这种方法是,把运算量(操作数)写在运算符的前面,把运算符写在运算量的后面(后缀)。 例:a+b ab+ a*(b+c) abc+* (a+b)*(c+d) ab+cd+* 表达式的逆波兰表示 一个表达式的后缀式可以如下递归定义: 1. 如果E是一个变量或常量,则E的后缀式是E自身。 2. 如果E是 E1 op E2 形式的表达式,这里op是任何二元操作符,则E的后缀式为 E1’ E2’ op,这里E1’ 和E2’分别为E1和E2的后缀式。 3. 如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。 后缀式与抽象语法树的关系 后缀式是抽象语法树的线性表示形式。是树的后序遍历(左,右,根)的一个序列。 例如: a = b * - c+b * -c 的抽象语法树。 无环有向图(DAG) DAG指出了表达式中公共子表达式。 结点N(一个公共子表达式),可能有多个父结点。 a+a*(b-c)+(b-c)*d DAG的值编码方法 三地址代码 三地址代码是由下面一般形式的语句构成的序列: x = y op z 其中,x、y、z为名字、常数或编译时产生的临时变量;op代表运算符号。 每个三地址语句的右边只能有一个运算符。 例, 表达式 x+y*z 翻译为三地址代码: t1 = y*z t2 = x+t1 t1, t2是编译时产生的临时变量。 三地址代码:说明 1. 之所以称为三地址代码,是因为三地址代码语句类似与汇编指令, 涉及三个地址 x、y和z,其中y、z表示操作数,x存放结果。地址常用属性place(addr)表示。 名字.place:指向符号表名字入口的指针 临时变量.place:临时变量值存放的单元地址 常数.place:指向常数表中常数入口的指针 2.在三地址代码中,一条指令的右侧最多有一个运算符。 3. 三地址代码是抽象语法树的线性化表示 --- 树的每个内部结点对应一个三地址语句。 按树自下而上的顺序写出每个内部结点对应的三地址代码。 注: 临时变量的名字对应抽象语法树的内部结点(算符结点), 表达式中的每个运算都要引入一个新的临时变量存放计算结果, 要多少引入多少。 画出赋值语句 x=a-b*c 的抽象语法树 。给出其三地址表示。 (8) 变址赋值语句 x = y[i]; =[ ] 变址取数 x[i] = y ; [ ]= 变址存数 (9) 地址和指针赋值语句 x = &y; x = * y; * x = y; 四元式需要较多的临时单元。四元式之间 的联系通过临时变量实现, 三元式之间的联系通过指针实现。 中间代码优化处理时,四元式比三元式方便得多, 间接三元式与四元式同样方便,四元式和三元式两种实现方式需要的存储空间大体相同。 写出赋值语句:A=B*(C-D)-E/F↑G 的逆波兰表示、三元式表示、四元式表示。 思考题 简单算术表达式和赋值语句到四元式的翻译? (4) E? - E1 { E.addr:=NewTemp; Gen(minus, E1.addr, _ ,E.addr)} (5) E?( E1

文档评论(0)

优美的文学 + 关注
实名认证
内容提供者

优美的文学优美的文学优美的文学优美的文学优美的文学

1亿VIP精品文档

相关文档