第09章 语义分析和代码生成
- 格式:ppt
- 大小:167.50 KB
- 文档页数:35


编译原理 第七章 语义分析和中间代码生成
制作人:李明新 共46页第1页 13-8-20 第七章 语义分析和中间代码生成
知识结构:
语义分析
语法分析概述
语法制导翻译
逆波兰式表示
三元式表示
语义分析和中 中间语言 图型表示
间代码生成 四元式表示
三地址语句表示
赋值语句的翻译
布尔表达式的翻译
中间代码生成 控制语句的翻译
说明语句的翻译
过程语句的翻译
第一节 语法制导翻译概述
一、语义分析的任务
在词法分析和语法分析的基础上进一步分析其含义,主要的工作是进行静态语义检查和翻译。
二、语义分析的功能
1、类型检查
检查运算的合法性(运算对象的一致性)。 编译原理 第七章 语义分析和中间代码生成
制作人:李明新 共46页第2页 13-8-20 2、一致性检查
一个对象(标识符等)在一个分程序中只能被定义一次。
3、相关名字检查
如果一个名字必须出现多次,检查使用的名字是否相同的。
哈工大威海编译原理实验三语义分析与中间代码生成(DOC
X页)
哈尔滨工业大学(威海)计算机学院
编译原理实验报告 姓名 院系 计算机学院 学号 090410
任课教师 指导教师
实验地点 宋健二楼机房 实验时间
实验三 语义分析及中间代码生成 实验名称
同组人 无
预习报告(对实验主要内容的认识) 得分
(1) 通过本次试验,我应该加深对于编译原理制导方案的理解,并且加深对
于语法变换的所起到的作用;
(2) 对于试验中要用到得中间代码的格式规范,也应该进一步的分析和掌握
(3) 能够很好的使用到前面开发出来的词法分析器和语法分析器,将它们与
语义分析器结合起来,跟好的更系统的掌握编译原理这门专业技能 (4) 关于符号表以及token串表的维护,现在终于使其有所作用
实验内容(问题,思路,程序,结果) 得分
(1)开发环境:vs2010
(2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行
词法分析的字符串)(比如:int a;)
(3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果
(比如:int a 的输入对应的输出如下:int a;首先对于词法分析打印
出:
Int --- key //关键字 A ---str //字符串
; ---bor //边界符号
对于语法分析:
Accept //编译语句分析成功
对于输入字符串的语义分析和中间代码的生成如下中间代码:
)
(4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token
链表
(5)系统功能:
(2) 开发平台(操作系统、设计语言):
1、操作系统:windows 7
2、设计语言:c++
3、编译器:vs2010
(3) 设计方案;
1) 主数据流图
开始
词法分析
Token表的生成及修改
语法分析
修改token表
174
第七章 语义分析与代码生成
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
时,语义分析应该将这个说明所提供的信息填入符号表,即完成对符号表的 175 插入操作;当然也需要完成其它的语义分析工作,而后在确定是否可用规则
→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,条件语句的处理算法如下:
路漫漫其修远兮,吾将上下而求索
- 百度文库
11 第七章 语义分析和中间代码产生
本章概述
上一章我们介绍了属性文法和语法制导翻译,本章我们将把上章所介绍的方法和技术应用于语义分析和中间代码产生中。
主要学习内容:中间语言的形式——后缀式、图表示法、三地址代码,说明语句的语义分析,赋值语句的翻译,布尔表达式的翻译,控制语句的翻译,过程调用的处理,类型检查。
学习目标:熟悉几种中间语言的描述,掌握各种语句的翻译方法,会给出各种语句的语义规则和语义子程序。
学习重点和难点:如何把属性文法和语法制导翻译的方法和技术应用于语义分析和中间代码产生中,特别是表达式和控制语句的翻译。
7.1 中间语言
7.1.1 中间语言
虽然源程序可以直接翻译为目标语言代码。但是许多编译程序都采用了独立于机器的、复杂性介于源语言和机器语言之间的中间语言。常见的中间语言形式包括:后缀式,三地址代码(包括三元式,四元式,间接三元式),DAG图表示和抽象语法树等。
1. 后缀式
后缀式表示法是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法,因此又称逆波兰表示法。这种表示法是,把运算量(操作数)写在前面,把算符写在后面(后缀)。例如,把a+b写成ab+,把a*b写成ab*。
2. 抽象语法树
在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(Abstract Syntax Tree)。
3. DAG
与抽象语法树一样,对表达式中的每个子表达式,DAG(Directed Acyclic Graph)中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。两者不同的是,在一个DAG中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。
4. 三地址代码
三地址代码是由下面一般形式的语句构成的序列: 路漫漫其修远兮,吾将上下而求索