西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成6.pptVIP

西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成6.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文档。上传文档
查看更多
5.8 过程说明和过程调用的翻译 过程说明和过程调用是一种常见的语法结构,绝大多数语言都含有这方面的定义。其形式随语言的不同而有所不同。 过程说明方式 有些语言过程说明由关键字(PROCEDURE, FUCTION)引导,有些语言则可直接定义。 过程调用方式 对于子程序过程,通常须使用过程语句或CALL语句;对于函数过程,一般把它们作为表达式中的一个初等量来引用。 尽管过程说明和过程调用的形式因不同的语言而异,但在功能上和需做的语义处理工作上仍较类似。 应当指出,过程说明和过程调用的翻译,还依赖于形式参数与实在参数结合的方式以及数据存储空间的分配方式。 5.8.1 过程说明的翻译 过程说明的翻译需要做如下的工作: 1.在符号表中新登记一项,并填入有关的属性 这些属性通常有:种属(过程或函数等)、是否为外部过程、数据类型(对函数而言)、形参个数、形参的信息(供语义检查用,如种属、类型等)、过程的入口地址等等。 由于每个过程的登记项所需填写的信息较多,所以编译程序往往设置专门的过程名表,或者为过程名再建立一个附属的“过程信息向量”(见P229). 过程信息向量的内容主要是形参的信息,并以某种方式和过程名的登记项连接起来. 为每个形式参数分配相应的存储单元,称为形式单元,供形实结合时传递信息之用.并将形参的名字、相应形式单元的地址,以及此形参的其它一些属性记入符号表。 需要指出的是,对于具有嵌套结构的语言,为确保程序中全局量和局部量都能得到正确的引用,符号表及各量的数据空间是按嵌套的层次建立、分配的.有关这方面的问题将在第六章和第七章进行讨论。 过程说明的翻译(续) 2. 当扫描到过程说明中的过程体时,产生执行过程体的代码.此时需完成: (1)产生将返回地址推入堆栈的代码(因过程调用可以嵌套和递归, 所以应将各返回地址按调用的嵌套或递归层次依次压入栈保存,若转子指令能自动完成将返回地址送入堆栈,此项工作可省去)。 (2)产生形实结合的代码,即产生将实参的信息(实参的值或地址,它们在过程语句相应的代码序列中给出)分别送入相应形式单元的代码。接着,再产生执行过程体的代码. (3)产生有关从过程返回的代码(对于函数,在此之前应产生将函数值送入寄存器或指定地址的代码). 闭说明过程的处理 对于某些将过程说明写成闭说明的程序语言,在产生过程体的代码时,通常都把它处理为一个闭子程序的形式。 因此,在每一过程体的代码之前,应有一条跳过过程体的无条件转移指令. 但是,在产生此指令时,过程体的代码尚未生成,故只能产生一条不完全的转移指令,并记录此指令的位置,待以后回填.显然,对于过程说明可以嵌套的语言,为了记录这些待回填位置,需使用一个指令地址栈。 过程说明语句的文法 下面,我们给出经过拆分的过程说明语句的文法,它包括函数、有参过程和无参过程的定义.相应的属性翻译文法,可根据上述处理方案和相应的文法自行设计. ProcDefStatement → ProcName | ProcArgMSG ) ProcArgMSG → ProcName ( iden | ProcArgMSG , iden ProcName → ProcKey iden ProcKey → procedure | function 5.8.2 实参和形参间的信息传递 在执行过程调用时,首先应把实在参数传送给被调过程,以便被调过程能对实参执行相应的过程体。 所谓把实参传送给被调过程,就是把实参的信息(如实参的值或地址)送入相应的形参单元之中,在执行过程体时,就能从形参的形式单元中取得对应实参的值或地址。 可采用两种不同的代码结构来传递实参的信息: 1.先结合,后调用 在控制转入被调过程前,将各实参的信息送入相应形参单元; 2.先调用,后结合 将实参的信息依次排列在转子指令前,当执行转子指令而进入过程后,被调过程根据返回地址,找到存放实参信息的单元位置,再把各实参信息送入相应形参的形式单元,然后再执行过程的目标代码. 形实结合的方式 1.引用调用(Call by reference) 控制转入被调过程后,由被调过程将实参的地址写入相应的形式单元.过程体中对形式参数的任何引用或赋值,都按对相应形式单元间接访问的寻址方式为其产生代码。显然,执行过程时,对形参的赋值将会影响相应实参之值(右值).例如, PROCEDURE SWAP(VAR x,y:INTEGER);VAR t:INTEGER; BEGIN t:=x; x:=y; y:=t; END; 若按引用调用方式,则执行过程语句SWAP(i,A[i])相当于执行如下操作:(x、y是指针变量) x=i; y=A[i]; t=*x; *x=*y;*y=t; 执行上述操作之后,就交换了变量i和A[i

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档