大连理工大学_编译方法中间代码及解释程序汇编.doc

大连理工大学_编译方法中间代码及解释程序汇编.doc

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

第七章 语义分析与代码生成 7.1 语法制导翻译 编译程序的实质性工作是翻译,即为源程序生成目标代码。为此,我们必须知道程序的含义是什么(语义分析)?应该翻译成什么(代码生成)? 在三、四章,我们主要讨论了源程序的识别,即判定一个源程序是否符合源语言的文法。在讨论语法分析时曾说过,上下文无关文法不足以描述编程语言的全部语法特征。为了说明这一点,让我们来看一个例子: VAR i:integer; BEGIN j:=i*i END; 如果j没有在外层块中说明,那么赋值语句中出现的j就是非法的。这是一种上下文敏感的成分。为了清楚地说明这一点,假定j是在自顶向下分析过程中由非终极符<变量>导出的,在这次推导之前的句型为 αVARj:integer;β<变量>γ 其中α,β,γ为符号串。推导后的句型为 αVARj:integer;βjγ 为了保证变量在使用前必须说明,需要有如下形式的规则: VAR j:integer;β<变量>→VAR j:integer;βj 而不是 <变量>→j 即<变量>只有在一定的上下文中才可以展开成j。 上下文敏感成分的分析实质上是语法分析的内容。但是,因为我们的语法分析是以上下文无关文法为基础的,没有考虑上下文敏感成分的处理,所以必须在语义分析时加以考虑。这相当于把语言的敏感成分划归为语言的语义范畴(尽管在概念上并非如此)。比如说在处理说明 VAR j:integer 时,语义分析应该将这个说明所提供的信息填入符号表,即完成对符号表的插入操作;当然也需要完成其它的语义分析工作,而后在确定是否可用规则 <变量>→j 进行推导时,就可通过对符号表的检索操作来完成。如果符号表中有标识符j,而且j又是个变量标识符,就可以用此规则进行推导。 除了敏感成分的处理之外,为了生成目标代码,所需要完成的一切操作都属于语义分析的范畴。考虑如下条件语句: IF E THEN S1 ELSE S2 为它生成的目标代码应具有图7.1的结构(称为它的目标结构),其中,计算E的目标指令、S1和S2的目标指令是在处理表达式和语句时生成的,处理条件语句时所生成的指令就是“jumpf l0”和“jump l1”。前者的含义为表达式E的值为false时,程序转向l0的指令继续执行,后者为无条件转到l1的指令执行。问题在于编译程序在处理条件语句时是从左向右进行的。因此,当要生成jumpf指令时,不知道l0的值,因为S1的目标这时尚未生成,不知道它究竟有多少条指令。在生成jump这条指令时也有同样问题。为了解决这个问题,在生成jumpf和jump指令时,应先记录这两条指令本身的位置,等以后再回填它们的转向目标。假设当前要生成的指令位置为lc,条件语句的处理算法如下: IF sy=ifsyTHEN insymbol; expression;{处理表达式} IF表达式类型< >boolsTHEN error (n) ENDIF; lc1:=lc; 生成jumpf指令;lc:=lc+1; IF sy=thensy THEN insymbol; statement;{处理语句} IF sy=elsesy THEN lc2:=lc; 生成jump指令; lc:=lc+1; 回填jumpf指令的转向目标; insymbol; 图7.1 statement;{处理语句} 回填jump指令的转向目标; ELSE 回填jumpf指令的转向目标 ENDIF ENDIF ENDIF; 可以看出,除了检查表达式类型外(敏感成分的处理),语义分析工作还包括转向目标的回填等操作。 与第四章给出的条件语句的语法分析算法相比,上述算法只是增加了如下几个操作: <op1>:IF表达式类型< >bools THEN error(n); ENDIF; lc1:=lc; 生成jumpf指令; lc:=lc+1; <op2>:lc2:=lc; 生成jump指令; lc:=lc+1; 回填jumpf指令的转向目标; <op3>:回填jump指令的转向目标; <op4>:回填jumpf指令的转向目标; 这相当于说上面的处理算法是根据如下文法规则写成的: <IF语句>→IF<表达式><op1>THEN<语句>ELSE<op2><语句><op3> <IF语句>→IF<表达式><op1>THEN<语句><op4> 即在文法规则中嵌入了相应的语义加工操作。于是,语义分析及代码生成可以随着语法分析的进行,通过嵌入相应的语义加工操作来完成。这种方法称为语法制导翻译,因为语言的文法规则确定了相应的语义分析类型及生成代码的性质,而且分析算法的主体控制是相应的文法规则。 本章后面将结合实例讨论各种典型的语言结构的语义分析及

文档评论(0)

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

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档