编译原理教程04语义分析和中间代码生成.pdf

编译原理教程04语义分析和中间代码生成.pdf

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

第4章语义分析和中间代码生成

第4章语义分析和中间代码生成

4.1概述

4.2属性文法

4.3几种常见的中间语言

4.4表达式及赋值语句的翻译

4.5控制语句的翻译

4.6数组元素的翻译

4.7过程或函数调用语句的翻译

4.8说明语句的翻译

4.9递归下降语法制导翻译方法简介

习题四

第4章语义分析和中间代码生成

4.1概述

Ø语义分析的概念

Ø语法制导翻译方法

第4章语义分析和中间代码生成

4.1.1语义分析的概念

一个源程序经过词法分析、语法分析之后,表明该源程序在书写上

是正确的,并且符合程序语言所规定的语法。

但是语法分析并未对程序内部的逻辑含义加以分析,因此编译程序

接下来的工作是语义分析,即审查每个语法成分的静态语义。

如果静态语义正确,则生成与该语言成分等效的中间代码,或者直

接生成目标代码。

直接生成机器语言或汇编语言形式的目标代码的优点是编译时间短且

无需中间代码到目标代码的翻译,

而中间代码的优点是使编译结构在逻辑上更为简单明确,特别是使目

标代码的优化比较容易实现。

第4章语义分析和中间代码生成

静态语义检查是在编译时完成的,它涉及以下几个方面:

(1)类型检查,如参与运算的操作数其类型应相容。

(2)控制流检查,用以保证控制语句有合法的转向点。如

C语言中不允许goto语句转入case语句流;break语句需寻找

包含它的最小switch、while或for语句方可找到转向点,否则

出错。

(3)一致性检查,如在相同作用域中标识符只能说明一

次,case语句的标号不能相同等。

第4章语义分析和中间代码生成

语义分析阶段只产生中间代码而不生成目标代码的方法使编

译程序的开发变得较为容易,

但语义分析不像词法分析和语法分析那样可以分别用正规文

法和上下文无关文法描述。

由于语义是上下文有关的,因此语义的形式化描述是非常

困难的,

目前较为常见的是用属性文法作为描述程序语言语义的工

具,并采用语法制导翻译的方法完成对语法成分的翻译工作。

第4章语义分析和中间代码生成

4.1.2语法制导翻译方法

语法制导翻译的方法就是为每个产生式配上一个翻译子程序(

称语义动作或语义子程序),并在语法分析的同时执行这些子程序。

在语法分析过程中,当一个产生式获得匹配(对于自上而下分

析)或用于归约(对于自下而上分析)时,此产生式相应的语义子程

序就进入工作,完成既定的翻译任务。

语法制导翻译分为自下而上语法制导翻译和自上而下

导翻译,我们重点介绍自下而上语法制导翻译。

第4章语义分析和中间代码生成

假定有一个自下而上的LR分析器,我们可以把这个LR分析

器的能力加以扩大,使它能在用某个产生式进行归约的同时调用

相应的语义子程序进行有关的翻译工作。

每个产生式的语义子程序执行之后,某些结果(语义信息)必须

作为此产生式的左部符号的语义值暂时保存下来,以便以后语义

子程序引用这些信息。

此外,原LR分析器的分析栈

文法符号相对应的语义值。这样,分析栈可以存放三类信息:分

析状态、文法符号及文法符号对应的语义值。扩充后的分析栈如

图4–1所示。

第4章语义分析和中间代码生成

图4–1扩充后的LR分析栈

第4章语义分析和中间代码生成

作为一个例子,我们考虑下面的文

文档评论(0)

158****0159 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档