- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章:中间代码生成 概述 三地址码 声明语句 赋值语句 布尔表达式 第八章:中间代码生成:概述 编译器的分析综合模型 分析部分:源程序=〉基本块=〉中间表示 综合部分:中间表示=〉目标程序 图8-1:中间代码生成器的位置 使用中间表示(形式)的优点 重置目标比较容易 可在中间表示上应用与机器无关的代码优化器 如何实现? 语法制导翻译 第八章:中间代码生成:概述 中间表示 后缀表示(表达式) 语法树/分析树和DAG:图8-2 图8-3:语法制导定义产生语法树/DAG 语法树:mkunode和mknode每次返回新节点指针 图8-4:图8-2a中语法树的两种表示 DAG: mkunode和mknode尽可能返回现存节点指针 三地址码 第八章:中间代码生成 概述 三地址码 声明语句 赋值语句 布尔表达式 第八章:中间代码生成:三地址码 三地址码的一般形式 x := y op z 三地址码是语法树或DAG的线性表示 图8-5:图8-2中的语法树和DAG相对应的三地址码 第八章:中间代码生成:三地址码 三地址语句的类型(通用) x := y op z x := op y x := y x := y[i]及x[i] :=y x := y, x := *y及*x := y goto L if x relop y goto L p(x1,x2…xn) param x1 param x2 … param xn call p,n return y 第八章:中间代码生成:三地址码 语法制导翻译生成三地址码 临时名字成了语法树的内节点 图8-6:S属性定义生成赋值语句的三地址码 图8-7:为while语句生成代码的语义规则 第八章:中间代码生成:三地址码 三地址语句的实现 抽象形式:三地址语句 具体实现:通过带有操作符合操作数的记录结构来实现 四元式 三元式 间接三元式 第八章:中间代码生成:三地址码 三地址语句的实现 四元式 带有四个域的记录结构:op,arg1,arg2,result arg1,arg2,result域的内容正常情况下指向这些域所代表的名字在符号表表项的指针 临时名字在生成时一定要被写入符号表 图8-8a:三地址语句的四元式表示 第八章:中间代码生成:三地址码 三地址语句的实现 三元式 为了避免临时名字在生成时被写入符号表中,可以通过计算临时值的语句的位置来引用它 带有四个域的记录结构:op,arg1,arg2 arg1,arg2指向符号表(对于程序员定义的名字或常量)的指针或者三元组结构(对于临时变量)的指针 图8-8b:三地址语句的三元式表示 图8-9:更多三元式表示 第八章:中间代码生成:三地址码 三地址语句的实现 间接三元式 列出指向三元式的指针,而不是列出三元式本身 图8-10:三地址语句的间接三元式表示 第八章:中间代码生成:三地址码 三地址语句的实现 表示方法比较:间址的使用 使用四元式表示,定义或使用临时变量的三地址语句可以通过符号表直接访问临时变量的地址 使用四元式表示,符号表在值的计算及使用之间提供了一次额外间址,有利于优化。 使用三元式表示,移动一条定义临时值的语句需要我们改变在arg1及arg2数组中所有对该语句的引用,难以优化。 使用间接三元式表示,可以通过statement列表的重新排序来移动语句。 第八章:中间代码生成 概述 三地址码 声明语句 赋值语句 布尔表达式 第八章:中间代码生成:声明语句 过程中的声明语句 单个过程中所有的声明语句作为一个组来处理(Pascal,C,Fortran) 使用一个全局变量offset跟踪下一个可用的相对地址 图8-11:计算声明语句中名字的类型和相对地址 重写产生式P-{offset:=0} D 以便所有的动作都出现在产生式右部的未端 P-MD M-ε{offset:=0} 第八章:中间代码生成:声明语句 跟踪作用域信息 嵌套过程 当看到嵌套的过程时,应暂时挂起对外围过程声明语句的处理 假定每个过程都有一个单独的符号表,当遇到过程声明D-proc id; D1;S时,便创建一个新的符号表,并在此符号表中为D1中的声明创建相应的表项。新表有一个指针指回外围过程的符号表;由id代表的名字本身是该外围过程的局部名字。 第八章:中间代码生成:声明语句 跟踪作用域信息 嵌套过程 图8-12:嵌套过程的符号表 图8-13:处理嵌套过程中的声明语句 两个栈:1)一个存放嵌套过程的外围符号表;2) 1)一个存放嵌套过程的外围offset 第八章:中间代码生成:声明语句 记录中的域名 图8-14:为记录中的域名建立符号表 记录的布局与过程的活动记录的布局相似 第八章:中间代码生成 概述 三地址码 声明语句 赋值语句 布尔表达式 第八章:中间代码生成:赋值语句 表达式的类
文档评论(0)