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

编译原理第5章.ppt

  1. 1、本文档共122页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
布尔表达式语义动作的设计 5. E→ true { E.tr= next ; E.code= next ; emit( goto _ ) ; } 布尔表达式到四元式的翻译 布尔表达式到四元式的翻译 布尔表达式语义动作的设计 6. E→ false { E.fa= next ; E.code= next ; emit( goto _ ) ; } 布尔表达式到四元式的翻译 布尔表达式语义动作的设计 5. E→ i { E.tr= next ; E.fa= next +1; E.code= next ; emit(if i.place goto -); emit( goto _ ) ; } 5. E→ true 6. E→ false 布尔表达式到四元式的翻译 例如布尔表达式 a b∨c d 的翻译过程如下: 布尔表达式到四元式的翻译 a b∨c d E (1)∨c d 100 if a b goto 0 101 goto 0 { E(1).tr=100 ; E(1).fa=101 ; E(1).code=100 ; } E (1)∨ E (2) 102 if c d goto 0 103 goto 0 { E(2).tr=102 ; E(2).fa=103 ; E(2).code=102 ; } 布尔表达式到四元式的翻译 E { bp( E(1).fa, E(2).code) =bp( 101,102); E.fa=E(2).fa=103 ; E.tr=merg(E(1).tr, E(2).tr) = merg( 100,102)=102 ; E.code= E(1).code=100 } 100 if a b goto 0 101 goto 0 102 if c d goto 100 103 goto 0 102 E (1)∨E (2) 归约为E 布尔表达式到四元式的翻译 102 if c d goto 100 103 goto 0 100 if a b goto 0 101 goto 102 布尔表达式 a b∨c d E.tr=102 E.fa=103 简单说明语句的翻译 程序设计语言中,程序中的每个名字(变量名)都必须在使用前进行说明。说明语句的功能就是告知编译程序每一个变量的类型信息。 翻译说明语句时,设计的语义动作应将变量的类型信息填入符号表中。 简单说明语句的翻译 简单说明语句文法 namelist→ namelist , id | id D→ integer namelist│real namelist 简单说明语句的翻译 用上述文法的规则式进行归约时,按照自下而上制导翻译,首先将所有名字id归约为一个名字表namelist后,才能将namelist中所有名字的性质登录在符号表里。这样必须用一个队列(或栈)来保存namelist中的所有名字。 简单说明语句的翻译 我们希望在扫描过程中,每遇到一个名字,就把它及其性质及时登录在符号表中。归约过程中涉及到这些名字及其性质时,就可以直接到符号表中进行查找,而无需占用额外空间保存namelist 中名字的信息 简单说明语句的翻译 文法改写: D→D(1),id│integer id │real id (1) 函数FILL(id,A)的功能是把名字 id和性质A登录在符号表中。 对文法设计语义动作如下: (2)设置非终结符D的语义变量D.ATT, 记录说明语句所规定的相关名字性质。 简单说明语句的翻译 (1)D→integer id (2)D→real id (3)D→D(1), id { FILL(id, int) ; D.ATT=int } { FILL(id, real) ; D.ATT=real } { FILL(id, D(1).ATT) ; D.ATT=D(1).ATT } 过程或函数调用语句的翻译 一种描述过程或函数调用语句的文法如下: G[S]: S→call i(elist) elist→elist,E elist→E 过程或函数调用语句的翻译 S→call i(elist) { for(队列queue中的每一项P) emit(par,_,_,P); emit(call,_,_

文档评论(0)

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

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

1亿VIP精品文档

相关文档