chp8.pptVIP

  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文档。上传文档
查看更多
chp8

(3)属性文法一般表示方法: 例8.2:无符号整数的属性文法 8.2.4一遍扫描的处理办法 在语法分析的同时计算属性值,无需构造实际的语法树;这种方法同下面两个因素有关: 使用继承属性构造a-4+5的语法树 静态语义审查 (1)类型检查。根据类型相容性要求,验证程序中执行的每个操作是否遵守语言的类型系统的过程,编译程序必须报告不符合类型系统的信息。 (2)控制流检查。控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存在包括它的这样的语句,则就报错。 (3)一致性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。 (4)上下文相关性检查。比如,变量名字必须先声明后引用;而有时,同一名字必须出现两次或多次,例如,Ada 语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。 (5)名字的作用域分析 翻译为中间语言的好处 (1)便于进行与机器无关的代码优化; (2)使编译程序改变目标机更容易; (3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。 产生赋值语句三地址代码的语法制导定义 例:根据上面的翻译模式,将布尔表达式: ab or cd and ef翻译成三地址代码 8.5.3 用作控制流语句的布尔表达式的翻译 布尔表达式在控制流语句中的作用:用于对语句的选择,其中间值无须保留。 如:if E then S1 else S2:如果E为真,转向S1,否则转向S2。因此需要给出E的“真”出口和“假”出口。 产生布尔表达式三地址代码的语义规则 产生布尔表达式三地址代码的语义规则(续) 使用翻译模式,实现一遍扫描完成布尔表达式作为条件转移的翻译 基本思路: 由于在生成某些跳转语句时,语句标号可能还是未知,因此需要采用回填技术来解决这个问题。 在生成跳转指令时,对于未知的目标,可以先建立一个链表,将这些具有相同的跳转目标的语句串起来,然后在确定了目标后,再进行回填。 跳转指令的三地址代码: (jnz,a,-,p) : if a goto p (jrop,x,y,p):if x rop y goto p rop:、=、、… (j,-,-,p) :goto p 布尔表达式的文法: (1)E→E1 or M E2 (2) |E1 and M E2 (3) |not E1 (4) |(E1) (5) |id1 relop id2 (6) |id (7)M→ε //M用来产生下一条语句的标号 翻译模式用到如下三个函数: 1.makelist(i):创建一个仅包含i的新表,i是四元式数组的一个下标(标号)。 2.merge(p1,p2):将由指针p1和p2指向的两个表合并,且返回一个指向连接后的表的指针。 3.backpatch(p,i):把i作为目标标号回填到p所指向的表中的每一个转移指令中的第四区段。 此处的“表”都是为“反填”所拉的链 8.6.2控制流语句的属性文法 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. 使用一遍扫描的布尔表达式的翻译模式 E?E1 or ME2 {backpatch(E1.falselist,M.quad); E.truelist:=merge(E1.truelist,E2.truelist); E.falselist:=E2.falselist } E?E1 and ME2 {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 ) {

文档评论(0)

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

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

1亿VIP精品文档

相关文档