编译原理课件第7章.ppt

  1. 1、本文档共114页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章?语义分析与中间代码生成 7.1 中间代码的形式 7.2 声明语句的翻译 7.3 赋值语句的翻译 7.4 类型检查 7.5 控制结构的翻译 7.6 回填 7.7 switch语句的翻译 7.8 过程调用和返回语句的翻译 7.9 输入输出语句的翻译 7.10 本章小结 7.1 中间代码的形式 中间代码的作用 过渡:经过语义分析被译成中间代码序列 中间代码的形式 中间语言的语句 中间代码的优点 形式简单、语义明确、独立于目标语言 便于编译系统的实现、移植、代码优化 常用的中间代码 语法树(6.3.5节) 逆波兰表示、三地址码(三元式和四元式)、DAG图表示 7.1.1 逆波兰表示 中缀表达式的计算顺序不是运算符出现的自然顺序,而是根据运算符间的优先关系来确定的,因此,从中缀表达式直接生成目标代码一般比较麻烦。 波兰逻辑学家J. Lukasiewicz于1929年提出了后缀表示法,其优点为:表达式的运算顺序就是运算符出现的顺序,它不需要使用括号来指示运算顺序。 7.1.1 逆波兰表示 例7.1 下面给出的是一些表达式的中缀、前缀和后缀表示。 中缀表示 前缀表示 后缀表示 a+b +ab ab+ a*(b+c) *a+bc abc+* (a+b)*(c+d) *+ab+cd ab+cd+* a:=a*b+c*d :=a+*ab*cd abc*bd*+:= 7.1.2 三地址码 所谓三地址码,是指这种代码的每条指令最多只能包含三个地址,即两个操作数地址和一个结果地址。 如x+y*z三地址码为:t1 := y*z t2 := x+t1 三地址码中地址的形式: 名字、常量、编译器生成的临时变量。 7.1.2 三地址码 例7.2 赋值语句a:=(-b)*(c+d)-(c+d)的三地址码如图7.1所示 7.1.2 三地址码 1.形如x:=y op z的赋值指令; 2.形如x:= op y的赋值指令; 3.形如 x := y的复制指令; 4.无条件跳转指令goto L; 5.形如 if x goto L (或if false x goto L)的条件跳转指令; 6.形如if x relop y goto L的条件跳转指令; 7.过程调用和返回使用如下的指令来实现: param x用来指明参数; call p, n和y=call p, n用来表示过程调用和函数调用; return y表示过程返回; 8.形如x := y[i]和x[i] := y的变址复制指令; 9.形如x := y、x := *y和*x := y的地址和指针赋值指令。 四元式 四元式是一种比较常用的中间代码形式,它由四个域组成,分别称为op、arg1、arg2和result。op是一个一元或二元运算符,arg1和arg2分别是op的两个运算对象,它们可以是变量、常量或编译器生成的临时变量,运算结果则放入result中。 三元式 为了节省临时变量的开销,有时也可以使用只有三个域的三元式来表示三地址码。三元式的三个域分别称为op,arg1和arg2,op,arg1和arg2的含义与四元式类似,区别只是arg1和arg2可以是某个三元式的编号(图7.2(b)中用圆括号括起来的数字),表示用该三元式的运算结果作为运算对象。 7.1.3 图表示 类似于表达式的抽象语法树一样,在dag(directed acyclic graph)中,每个节点对应一个运算符,代表表达式的一个子表达式,其子节点则与该运算符的运算对象相对应,叶节点对应的是变量或者常量,可以看成是原子运算。 利用dag可以很容易地消除公共子表达式 例7.3 表达式a+a*(b-c)-(b-c)/d的dag如图7.5所示。 生成dag的语法制导定义 7.2 声明语句的翻译 声明语句的作用 为程序中用到的变量或常量名指定类型 类型的作用 类型检查:类型检查的任务是验证程序运行时的行为是否遵守语言的类型的规定,也就是是否符合该语言关于类型的相关规则。 辅助翻译:编译器从名字的类型可以确定该名字在运行时所需要的存储空间。在计算数组引用的地址、加入显式的类型转换、选择正确版本的算术运算符以及其它一些翻译工作时同样需要用到类型信息。 编译的任务 在符号表中记录被说明对象的属性(种别、类型、相对地址、作用域……等) ,为执行做准备 7.2.1 类型表达式 类型可以具有一定的层次结构,因此用类型表达式来表示。类型表达式的定义如下: 1.基本类型是类型表达式。 典型的基本类型包括boolean、char、integer、real及void等。 2.类型名是类型表达式。 3.将类型构造符array应用于数字和类型

文档评论(0)

wendan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档