网站大量收购独家精品文档,联系QQ:2885784924

7 中间代码.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7 中间代码

第七章 语义分析及中间代码生成 语义分析的工作有:类型检查、控制流检查,一致性检查,作用域分析等。 可以在语法分析的基础上加上语义规则,直接产生机器语言或汇编语言形式的目标代码。但这种编译方式不利于优化和移植,目标代码质量不高。 现在的编译系统,一般都是将源程序先翻译为某种中间代码,然后再将中间代码翻译成目标代码。这样使得编译程序在逻辑结构上更简单,同时也为代码优化和移植创造了条件。 本章各种语句的代码生成将结合SPL代码生成的方式对照分析,开展课堂讨论。 四元式与三元式和间接三元式作一些比较 四元式之间的联系是通过临时变量实现的。这一点和三元式不同。要更动一张三元表是很困难的,它意味着必须改变其中一系列指示器的值。但要更动四元式表是很容易的,因为调整四元式之间的相对位置并不意味着必须改变其中一系列指示器的值。因此,当需要对中间代码进行优化处理时,四元式比三元式要方便得多。 对优化这一点而言,四元式和间接三元式同样方便。 本章重点 了解各种中间代码形式,掌握四元式; 掌握拉链返填技术; 掌握控制语句的四元式生成。 了解说明语句的处理和类型检查 标号和转移语句: ………. goto L; ………. goto L; ………. goto L; ………. L: ……….. 拉链 返填 goto nil ………... L goto ………... goto L: ……….. 与拉链返填技术相关变量和函数: nextquad指示器:指向下一个将要形成但尚未形成的四元式的地址. nextquad初值为1,每执行一次emit之后, nextquad将自动增加1. merge(p1,p2)://函数过程,把p1,p2为链首的两条链合并为一,返回链首p2(p1); POINTER PROCEDURE merge(p1,p2); IF p2=0 THEN merge:=p1 ELSE BEGIN p:=p2; WHILE 四元式p的第四区段的内容不为0 DO P:=四元式p的第四区段的内容; //找p2尾把p1填进四元式p的第四区段; merge:=p2 END makelist(i):创建一个仅包含i的新表,i是四元式数组的一个索引(下标),或说i是四元式代码序列的一个标号。 backpatch(p,t): //过程”回填”,把p所链接的每个四元式的第四区段都填为t; PROCEDURE backpatch(p,t); BEGIN Q:=p; WHILE Q≠0 DO BEGIN q:=四元式Q的第四区段的内容; 把t填进四元式Q的第四区段; Q:=q END OF WHILE END 自下而上分析中使用回填翻译布尔表达式 布尔表达式文法: (1)E→E1 or M E2 (2) |E1 and M E2 (3) |not E1 (4) |(E1) (5) |id1 rop id2 (6) |true (7) |false (8)M→ε 插入非终结符号M是为了引入一个语义动作,以便在适当的时候获得即将产生的下一个四元式的序号。 使用一遍扫描的布尔表达式的翻译模式: // M.quad记录E2代码序列的第一条四元式序号。 E?E1 or M E2 {backpatch(E1.falselist,M.quad); E.truelist:=merge(E1.truelist,E2.truelist); E.falselist:=E2.falselist } E?E1 and M E2 {backpatch(E1.truelist,M.quad); E.truelist:=E2.truelist; E.falselist:=merge(E1.falselist,E2.falselist);} E?not E1 { E.truelist:=E1.falselist; E.falselist:=E1.truelist } E ?( E ) { E.truelist:= E1.truelist; E.fal

文档评论(0)

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

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

1亿VIP精品文档

相关文档