语法制导和中间代码生成.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文档。上传文档
查看更多

条件转移语句的共同特点是:根据布尔表达式取值,分别执行不同的语句序列。问题:不同的语句序列结束后,如何使控制转向语句的结束。例如:ifE1thenifE2thenS1elseS2elseS3E1=1E2=1S1S2S3endstartYesNoYesNo参照布尔表达式的翻译方法,对非终结符S(和L),设立语义变量S.CHAIN(和L.CHAIN),用于记住需要在翻译完S(L)后回填转移目标的一串四元式第61页,共94页,星期日,2025年,2月5日1.代码结构E的代码S1的代码E.falseE.trueS1.CHAINS.CHAINifEthenS1代码结构ifEthenS1elseS2代码结构S2的代码JumpoutS1的代码E的代码S.CHAINE.falseE.trueS1.CHAINS2.CHAINout:第62页,共94页,星期日,2025年,2月5日E.truewhileEdoS1代码结构JumpbeginS1的代码E的代码S.CHAINE.falsebegin:S1.CHAIN第63页,共94页,星期日,2025年,2月5日2.文法的改写原因:在自下而上的语法制导翻译中,语义动作的执行是在使用产生式进行归约之后,并不允许在产生式的中间执行。为了能及时地执行语义动作(比如回填转移目标),需对源文法改写方法:在需要执行语义动作的地方把产生式分段,引入新的非终结符来表示它需要改写的产生式:把S→ifEthenS1 改写成 C→ifEthen(回填E.true) S→CS1第64页,共94页,星期日,2025年,2月5日把S→ifEthenS1elseS2 改写成 C→ifEthen (回填E.true) Tp→CS1else(产生转移, 回填E.false)S→TpS2把S→whileEdoS3 改写成 W→while(记住入口)Wd→WEdo(回填E.true)S→WdS3把L→L;S 改写成 Ls→L;(回填前一语句的出口) L→LsS第65页,共94页,星期日,2025年,2月5日改写后的文法(1)S→CS1 (2)S→TpS2 S→WdS3 (4)S→beginLendS→A (6)L→LsS L→SC→ifEthenTp→CS1elseW→whileWd→WEdoLs→L; 源文法:S→ifEthenS S→ifEthenSelseSS→whileEdoSS→beginLendS→AL→L;SL→S(8)(1)(8)(9)(2)(10)(11)(3)(4)(5)(12)(6)(7)第66页,共94页,星期日,2025年,2月5日8.4.1简单赋值语句的翻译简单赋值语句 是指不含复杂数据类型(如数组,记录等)的赋值语句。赋值语句的语义审查包括:每个使用性标识符是否都有声明?运算符的分量类型是否相容?赋值语句的左右部的类型是否相容?赋值语句的翻译目标: 在赋值语句右部表达式产生的四元式序列后加一条赋值四元式第29页,共94页,星期日,2025年,2月5日1.属性和语义规则中用到的变量、过程和函数属性:用id.name表示单词id的名字。用E.place表示存放E值的变量名在符号表的入口地址或临时变量编码。变量、函数和过程:用nextstat变量给出在输出序列中下一个四元式的序号用lookup(id.name)函数审查id.name是否出现在符号表中,是则返回id的入口地址,否则返回nil。用emit过程向输出序列输出一个四元式,emit每调用一次,nextstat的值增加1用newtemp函数生成临时变量,每次调用生成一个新的临时变量,如t1,t2,……用error过程进行错误处理。第30页,共94页,星期日,2025年,2月5日S→id:=E {p:=lookup(id.name);ifp≠nilthenemit(:=,E.place,-,p)elseerror}2.简单赋值语句的翻译(假定变量只有一种类

文档评论(0)

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

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

1亿VIP精品文档

相关文档