[工学]编译原理 第七章——语义分析和中间代码生成.pptVIP

[工学]编译原理 第七章——语义分析和中间代码生成.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[工学]编译原理 第七章——语义分析和中间代码生成

第七章 语义分析和中间代码生成 静态语义检查 类型检查。验证程序中执行的每个操作是否遵守语言的类型系统的过程.,编译程序必须报告不符合类型系统的信息。 控制流检查。控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存在包括它的这样的语句,则报错。 一致性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。 相关名字检查。有时,同一名字必须出现两次或多次。例如,Ada 语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。 中间语言 常见的中间语言的形式: 后缀式(逆波兰式) 三地址代码 - 三元式 - 四元式 - 间接三元式 DAG图 后缀式 又称逆波兰表示法,把运算量(操作数)写在前面,把算符写在后面(后缀)。 如:a+b 写成 ab+ a+b*c 写成 abc*+ 定义: 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) 写成 (a+b)*(c+d) 写成 将表达式翻译为后缀式的语义规则 E.code表示E的后缀式,op为二元操作符,“||”表示后缀形式的连接。 图表示法 DAG 抽象语法树 DAG: 无循环有向图。对表达式的每个子表达式,DAG中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。 在一个DAG图中,代表公共子表达式的结点具有多个父结点。 如表达式a+a*(b-c)+(b-c)*d的DAG图为: 又如 a:=b*-c+b*-c a:=b*-c+b*-c的抽象语法树可表示为: 三地址代码 三地址代码是由下面一般形式的语句构成的序列:X :=Y op Z。其中,X,Y,Z为名字,常数或编译时产生的临时变量,op代表运算符号。 每个语句右边只能有一个运算符。 如:x+y*z 可翻译为: a:=b*-c+b*-c的三地址代码为: a:=b*-c+b*-c的三地址代码为: a:=b*-c+b*-c的三地址代码为: 三地址语句的种类 X :=Y op Z X := op Y X :=Y goto L if x relop y goto L 或if a goto L 用于过程调用的param x 和call p,n及return y x :=y[i] 及 x[i] :=y x :=y, x :=*y, *x :=y 四元式 带有四个记录域:op,arg1,arg2,result。 一元运算符不用arg2 条件或无条件转移语句将目标标号置于result param类运算符仅使用arg1域 如a:=b*-c+b*-c 三元式 带有三个记录域:op,arg1,arg2。 对一目运算符arg1,arg2只用其一,多目运算符可用若干相继三元式表示。 如:x[i] :=y x := y[i] 如a:=b*-c+b*-c 间接三元式 不直接使用三元式,而是另设一张指示器(称为间接码表),它将按运算的先后顺序列出有关三元式在三元式表中的位置。 如: X:=(A+B)*C Y:=D*(A+B) 表示为: 说明语句 说明语句的翻译模式 P→D {offset:=0} D→D;D D→id:T {enter(id.name,T.type,offset); offset:=offset+T.width} T→integer {T.type:=integer T.width:=4} T→real {T.type:=real

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档