- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第七章语义分析与代码生成
7.1语法制导翻译
编译程序的实质性工作是翻译,即为源程序生成冃标代码。为此,我们 必须知道程序的含义是什么(语义分析)?应该翻译成什么(代码生成)?
在三、四章,我们主要讨论了源程序的识别,即判定一个源程序是否符 合源语言的文法。在讨论语法分析时曾说过,上下文无关文法不足以描述编 程语言的全部语法特征。为了说明这一点,让我们来看一个例子:
■
VAR
i:integer;
BEGIN
■
■
■
END;
■
■
■
如果j没有在外层块屮说明,那么赋值语句中出现的j就是非法的。这 是一种上下文敏感的成分。为了清塑地说明这一点,假定j是在自顶向下分 析过程中由非终极符V变量〉导出的,在这次推导Z前的句型为
a VARj: integer; P v变竝> Y
其中为符号串。推导后的句型为
a VARj: integer; P j Y
为了保证变量在使川前必须说明,需要冇如下形式的规则:
VAR j:integer; B <变量〉VAR j:integer; 0 j 而不是
v变量〉j
即v变量〉只有在一定的上下文中才可以展开成j。
上下文敏感成分的分析实质上是语法分析的内容。但是,因为我们的语 法分析是以上下文无关文法为基础的,没有考虑上下文敏感成分的处理,所 以必须在语义分析时加以考虑。这相当于把语言的敏感成分划归为语言的语 义范畴(尽管在概念上并非如此)。比如说在处理说明
VARj: integer
时,语义分析应该将这个说明所提供的信息填入符号表,即完成対符号表的
插入操作;当然也盂要完成其它的语义分析工作,而后在确定是否可用规则 v变量〉f j
进行推导时,就可通过对符号表的检索操作來完成。如果符号表中有标识符 j,而Hj又是个变量标识符,就可以用此规则进行推导。
除了敏感成分的处理之外,为了生成目标代码,所需要完成的一切操作 都属于语义分析的范畴。考虑如下条件语句:
IFETHENSi ELSE S2
为它生成的Fl标代码应具冇图7.1的结构(称为它的目标结构),其中,计 算E的目标指令、Si和S?的目标指令是在处理表达式和语句时生成的,处 理条件语句时所牛成的指令就是“jiimpfl。”和“jumph”。前者的含义为表 达式E的值为false时,程序转向I。的指令继续执行,后者为无条件转到h 的指令执行。问题在于编译程序在处理条件语句吋是从左向右进行的。因此, 当要生成jumpf指令时,不知道1。的值,因为$的目标这时尚未牛成,不 知道它究竟有多少条指令。在生成jump这条指令时也有同样问题。为了解 决这个问题,在生成jumpf和jump指令时,应先记录这两条指令木身的位 置,等以后再回填它们的转向目标。假设当前要生成的指令位置为A条件 语句的处理算法如下:
IF sy=ifsyTHEN
in symbol;
expression;!处理表达式)
IF表达式类型v boolsTHEN
error (n)
ENDIF;
lcl :=lc;
生成 jumpf 指令;lc:=lc+l;
IF sy=thensy THEN
insymbol;
statement;!处理语句}
IF sy=elsesy THEN
lc2:=lc;
生成jump指令;
lc:=lc+l;
回填jumpf指令的转向目标;
insymbol; 图 7.1
statement;!处理语句}
回填jump指令的转向冃标;
ELSE
回填jumpf指令的转向目标
ENDIF
ENDIF
ENDIF;
町以看出,除了检查表达式类型外(頌感成分的处理),语义分析丄作述包 括转向目标的回填等操作。
与第四章给出的条件语句的语法分析算法相比,上述算法只是增加了如 下几个操作:
opl:IF 表达式类型v bools THEN
error(n);
ENDIF;
lcl:=lc;
生成jumpf指令;
lc:=lc+l;
op2:lc2:=lc;
生成jump指令;
lc:=lc+l;
冋填jumpf指令的转向H标;
op3:回填jump指令的转向目标;
op4:回填jumpf指令的转向目标;
这相当于说上而的处理算法是根据如下文法规则写成的:
IF 语句 -IFv 表达式 xop 1 THEN 语句 ELSEvop2v 语句 op3
1F 语句IFv表达式xop 1 THENv语句〉op4
即在文法规则中恢入了相应的语义加工操作。于是,语义分析及代码生成可 以随着语法分析的进行,通过嵌入札I应的语义加工操作来完成。这种方法称 为语法制导翻译,因为语言的文法规则确定了相应的语义分析类型及住成代 码的性质,而且分析算法的主体控制是相应的文法规则。
本章后血将结合实例讨论各种典型的语言结构的语义分析及代码牛成。
7.2目标机
为了完成代码生成
原创力文档


文档评论(0)