编译原理简明教程(第2版)第7章

合集下载

编译原理-刘善梅-第7章 语义分析和中间代码产生6 127页PPT文档

编译原理-刘善梅-第7章 语义分析和中间代码产生6 127页PPT文档

第七章 语义分析和中间代码产生
中间语言 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理
赋值语句的翻译
1.简单算术表达式及赋值语句
id:=E 对表达式E求值并置于变量T中 id.place=T
从赋值语句生成三地址代码的S-属性文法
非终结符号S有综合属性S.code,它代表 赋值语句S的三地址代码。
三元式 四元式 间接三元式
7.1.1 后缀式
后缀式表示法:Lukasiewicz发明的一种表示 表达式的方法,又称逆波兰表示法。
一个表达式E的后缀形式可以如下定义:
1. 如果E是一个变量或常量,则E的后缀式是E 自身。
2. 如果E是E1 op E2形式的表达式,其中op是任 何二元操作符,则E的后缀式为E1 E2 op,其 中E1 和E2 分别为E1 和E2的后缀式。
a+a*(b-c)+(b-c)*d的DAG
+
+
*
a
-
* d
b
c
a有两个父结点(+,*); 表达式b-c也有两个父结点;
a:=b*(-c)+b*(-c)的图表示法
assign
assign
a
+
a
*
*
b uminus b uminus
+
*
b
uminus
c
c
抽象语法树
c DAG
a:=b*(-c)+b*(-c)的抽象语法树对应的代码
T4:=b*T3
T5:=T2+T4
a
+
a:=T5
*
b

编译原理 第7章习题解答

编译原理 第7章习题解答

第七章习题解答7.1 给定文法:S→(A)A→ABBA→BB→bB→c①构造它的基本LR(0)项目集;②构造它的LR(0)项目集规范族;③构造识别该文法活前缀的DFA;④该文法是SLR文法吗?若是,构造它的SLR分析表。

7.2 给定文法:E→EE+E→EE*E→a①构造它的LR(0)项目集规范族;②它是SLR(1)文法吗?若是,构造它的SLR(1)分析表;③它是LR(1)文法吗?若是,构造它的LR(1)分析表;④它是LALR(1)文法吗?若是,构造它的LALR分析表。

7.3 给出一个非LR(0)文法。

7.4 给出一个SLR(1)文法,但它不是LR(0)文法,构造它的SLR分析表。

7.5 给出一个LR(1)文法,但它不是LALR(1)文法,构造它的规范LR(1)分析表。

7.6 给定二义性文法:① E→E+E② E→E*E③ E→(E)④ E→id用所述的无二义性规则和(或)另加一些无二义性规则,例如,给算符*、+施加某种结合规则。

①构造它的LR(0)项目集规范族及识别活前缀的DFA;②构造它的LR分析表。

习题参考答案7.1 解:文法的基本LR(0)项目集为S→.(A) S→(.A) S→(A.) S→(A).A→.ABB A→A.BB A→AB.B A→ABB.A→.B A→B. B→.b B→b.B→.c B→c.构造该文法的识别活前缀的DFSA如下图所示:I文法的识别活前缀的DFSA该文法的LR(0)项目集规范族={I0,I1,I2,I3,I4,I5,I6,I7,I8}因为在构造出来的识别活前缀的DFA中,每一个状态对应的项目集都不含有移进-归约、归约-归约冲突,所以该文法是LR(0)文法,当然也是SLR文法。

因为 FOLLOW(S)={#}FOLLOW(A)=FIRST{)}∪FIRST(BB)={),b,c}FOLLOW(B)=FIRST(B)∪FOLLOW(A)={b,c,)}其对应的SLR(1)分析表如下表所示。

编译原理ppt第七章

编译原理ppt第七章
1 目标
提升生成的目标代码的性能和效率。
2 优化方法
通过代码转换和代码生成技术进行优化,如常量传播、死代码删除等。
3 效果
优化后的代码可以提高程序的执行效率,减少资源消耗。
图片来源
编译系统组成
了解编译系统的组成对于理解整个 编译过程非常重要。
词法分析器
词法分析器将源代码分解成一个个 词法单元,如标识符、关键字、运 算符。
编译原理ppt第七章
通过这一章的学习,你将深入了解编译系统的组成和各个阶段的作用,包括 词法分析器、语法分析器、语义分析器、中间代码生成以及编译器的优化。
课程概述
1 理解编译原理的重要性 2 学习编译原理的实际
应用
编译原理是计算机科学的基
3 掌握编译器的工作原理
通过学习编译器的各个阶段,
础,掌握它有助于开发高效
了解编译系统可以更好地理
你将能够设计和实现自己的
且可靠的软件。
解代码运行的过程,进而改
编译器。
进代码的性能和可维护性。
编译系统概述
定义
编译系统是一种将源代码转换 为目标代码的软件工具。
组成
编译系统由多个阶段组成,每 个阶段负责不同的任务。
功能
编译系统可以进行词法分析、 语法分析、语义分析等操作, 最终生成可执行的目标代码。
编译器的优化
编译器的优化可以提高代码的性能 和效率。
编译系统的阶段
1
词法分析器
将源代码转换为一系列词法单元,如标识符、
语法分析器
2
关键字、运算符等。
根据语法规则分析词法单元的组合,生成抽象语法。3语义分析器
对抽象语法树进行语义检查,如类型匹配、
中间代码生成

编译原理_第7章

编译原理_第7章

29
§7.3 赋值语句的翻译
3.例题:写出下列代码段中表达式的翻译制导过 程及其所产生的四元式 begin Integer:B、C、D、X;
X:=-B*(C+D);
end
符号表 <B> B <C> C <D> D <X> X Int Int Int Int (1) (2) (3) (4) 四元式 Op - + * := arg1 <B> <C> T1 T3 arg2 <D> T2 - result T1 T2 T3 X
语义处理分两步:
1.静态语义分析,即验证语法结构合法的程序是否真正有意义。
2.若静态语义正确,语义处理则要执行真正的翻译。 即要么生成程序的一种中间表示形式(中间代码),
要么生成实际的目标代码。
静态语义检查包括:
(1)类型检查; (2)控制流检查; (3)一致性检查; (4)相关名字检查。
2
第七章
8
§7.1 中间语言
例子:如图所示,为a+a*(b-c)+(b-c)*d的DAG
+
+
* a b c
*
d
9
§7.1 中间语言
2.抽象语法树
例子:(1)a:=b*-c+b*-c的图表示法
assign a * b uminus c b + * uminus c DAG
10
assign
a + * b uminus c
数据区中的相对地址offset.
(3)综合属性: T.type-名字的类型; T.width-名字的域宽(即该类型名字所占用 的存储单元个数)
22
§7.2 二、保留作用域信息

编译原理第七章习题参考答案

编译原理第七章习题参考答案

第1 题已知文法A→aAd|aAb|ε判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

答案:文法:A→aAd|aAb|ε拓广文法为G′,增加产生式S′→A若产生式排序为:0 S' →A1 A →aAd2 A →aAb3 A →ε由产生式知:First (S' ) = {ε,a}First (A ) = {ε,a}Follow(S' ) = {#}Follow(A ) = {d,b,#}G′的LR(0)项目集族及识别活前缀的DFA 如下图所示在I0 中:A →.aAd 和A →.aAb 为移进项目,A →.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

在I0、I2 中:Follow(A) ∩{a}= {d,b,#} ∩{a}=所以在I0、I2 中的移进-归约冲突可以由Follow 集解决,所以G 是SLR(1)文法。

构造的SLR(1)分析表如下:对输入串ab#的分析过程:第2 题若有定义二进制数的文法如下:S→L·L|LL→LB|BB→0|1(1) 试为该文法构造LR 分析表,并说明属哪类LR 分析表。

(2) 给出输入串101.110 的分析过程。

答案:文法:S→L.L|LL→LB|BB→0|1拓广文法为G′,增加产生式S′→S若产生式排序为:0 S' →S1 S →2 S →L3 L →LB4 L →B5 B →06 B →1由产生式知:First (S' ) = {0,1}First (S ) = {0,1}First (L ) = {0,1}First (B ) = {0,1}Follow(S' ) = {#}Follow(S ) = {#}Follow(L ) = {.,0,1,#}Follow(B ) = {.,0,1,#}G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:在I2 中:B →.0 和 B →.1 为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

编译原理(第2版)7-1语义出理概述

编译原理(第2版)7-1语义出理概述
编译器构造工具
如GCC、Clang等,这些工具集成了完整的 编译器前端和后端,可以方便地实现语义分 析。
工具库
如ANTLR、Bison等,这些工具可以自动生成解析 器和词法分析器,然后在此基础上进行语义分析。
集成开发环境(IDE)
如Eclipse、Visual Studio等,这些IDE提供 了丰富的编译和调试工具,可以方便地实现 语义分析。
3
语义等价
判断两个程序是否在语义上等价,即具有相同的 行为。
语义优化
死代码消除
01
识别并删除程序中不会执行的代码。
常量折叠
02
将常量表达式的结果在编译时计算出来,避免在运行时进行计
算。

公共子表达式消除
03
消除重复计算的表达式,减少程序中的冗余计算。
04
语义分析的实现
语义分析的实现方法
基于抽象语法树(Abstract Syntax Tr…
中间表示通常采用三地址代码 (Three-Address Code,TAC) 的形式,是一种类似于汇编语言
的低级语言。
中间表示可以方便地进行各种 优化操作,如常量折叠、死代 码消除等。
中间表示还可以方便地转换为 目标机器代码,提高编译器的 可移植性和可维护性。
03
语义分析的关键技术
类型检查
静态类型检查
语义分析的展望
• 人工智能技术的应用:随着人工智能技术的发展,一些新的算法和工具可以应 用于语义分析中。例如,深度学习模型可以用于自动构建抽象语法树(AST) 和进行语义歧义消解。
• 静态分析的改进:静态分析是一种在编译时检测源代码中错误的技术。随着静 态分析技术的不断改进,它将在语义分析中发挥更大的作用。例如,更精确的 类型推断和更强大的错误检测能力可以提高编译器的质量。

编译原理(第2版)课后习题答案详解

编译原理(第2版)课后习题答案详解

第1 章引论第1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

编译原理课件第7章

编译原理课件第7章

P→MD M→ {offset := 0 }
D→D ; D
D→id : T {enter( , T.type, offset );
offset := offset + T.width}
T→integer {T.type := integer; T.width := 4}
T→real {T.type := real; T.width := 8}
D→id : T {enter( , T.type, offset ); offset := offset + T.width}
P
offset=0
D
D
;
offset=8
D
offset=12
id
:
T
id
:
T
real
enter(x,real,0)
2020/2/3
T.type=real T.width=8
• type row = record
• address: integer;
• lexeme: array[1..15] of char
• end;
• var table : array [1..10] of row;
6.如果T是类型表达式,那么pointer(T)也是类型表 达式,表示“指向类型为T的对象的指针”。
integer T.type=integer
T.width=4
enter(i,integer,8)
20
例 x:real; i:integer 的翻译
P{offset:=0}D {offset:=0}D;D {offset:=0}x:T{enter(x,T.type,offset);

《编译原理》教学课件-第7章 中间代码生成 7-2说明语句

《编译原理》教学课件-第7章 中间代码生成 7-2说明语句

D→id:T {enter(top(tblptr),,T.type,top(offset));
top(offset):=top(offset)+T.width }
N → { t:=mktable(top(tblptr));
push(t,tblptr);push(0,offset) }
图7.6 处理嵌套过程中的说明语句
3
每一个过程都建立一张独立的符号表 在符号表中有一个指针指向其外围过程的符号
表 在一个过程中,对于它内部定义的过程,都有
一个指针指向其内部过程的符号表
4
主程序:sort
readarray exchange quicksort
partition
5
sort
nil
header
a
x
readarray
offset:=offset+T.width }
Tinteger
{T.type:=interger; T.width=4;}
Treal
{T.type:=real; T.width=8;}
Tarray [num] of T1 { T.type:=array(num.val, T1.type);
T.width:=num.val*T1.width }
enterproc(table,name,newtable)在指针table指示的符 号表中为名字为name的过程建立一个新项
8
7.2.3 记录中的域名
Trecord LD end { T.type:=record(top(tblptr));
T.width:=top(offset);
pop(tblptr); pop(offset); }

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教.pptx

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教.pptx

#include <stdio.h> int lineno = 1; %}
number {digit}+(\.{digit}+?(E[+]?{digit }+)?
line
*.\n
%%
13.2 词法分析自动生成工具 13.2.1 LEX系列词法分析自动生成工具简介
{ws} if
{ /* 没有动作或没有返回 */ } {return (IF);}
2. 第1和第2个双百分号之间出现的是:规则部分,由一系列带有C代码的正则表达 式组成,每个转换规则的格式为 模式 {动作};其中每个模式是一个正则表 达式,可以使用声明部分给出的正则定义。当匹配相对应的正则表达式时,这些 动作对应的C代码片段就会被执行。
3. 第2个双百分号之后出现的是:规则部分各个动作需要使用的所有辅助函数,这 部分是可选内容。
13.2.1 LEX系列词法分析自动生成工具简介
2.正则表达式的Lex约定
正则表达式(regular expression):是一种可以用于模式匹配和替换的强有力 的工具。
【例13.2】为一个带符号的数集写出正则表达式,这个集合可能包含一个小数 部分或一个以字母E开头的指数部分。
参考解答: (“+”|“-”)?[0-9]+( “.” [0-9]*)?(E(“+”|“”)?[0-9]+)?
“<=”
{yylval = LE; return(RELOP);}
“=” “<>”
{yylval = EQ; return(RELOP);} {yylval = NE; return(RELOP);}
“>”
{yylval = GT; return(RELOP);}

编译原理chapter7 语义分析及中间代码生成

编译原理chapter7 语义分析及中间代码生成

编译原理
chapter7
语义分三元式 三元式顾名思义就是带有三个域的记录结构。 三元式顾名思义就是带有三个域的记录结构。 一般形式为: (i)( ,arg1,arg2) 一般形式为: )(op, )( , ) 其中,( )为三元式的编号, 其中,(i)为三元式的编号,也代表了该式的运算 ,( 结果, , 的含义与四元式类似, 结果,op,arg1,arg2的含义与四元式类似,区别在 , 的含义与四元式类似 于arg可以是某三元式的序号,表示用该三元式的结果 可以是某三元式的序号, 可以是某三元式的序号 作为运算对象。 作为运算对象。
编译原理
chapter7
语义分析和中间代码生成
对于文法G[E]: E →E+T | T 例:对于文法 T→ digit 产生式 ) E→ E(1)+T E→ T T→ digit 语 法 分 析 栈 T + E … # 语义子程序 ) {E.Val=E(1).Val+T.Val} {E.Val=T.Val} {T.Val=digit} T.Val 语 义 ‘+’ ) E(1).Val 分 析 … 栈 #
编译原理
chapter7
语义分析和中间代码生成
三地址代码可以看成是抽象语法树一种线性表示。 三地址代码可以看成是抽象语法树一种线性表示。 线性表示 例: a=b*-c+b*-c = a + T1=-c T2=b*T1 T3=-c
*
b
* - b
c
c
T4=b*T3 T5=T2+T4 a=T5
编译原理
语义分析和中间代码生成
图表示法—抽象语法树 图表示法 抽象语法树 在语法树中去掉一些对翻译不必要的信息后 在语法树中去掉一些对翻译不必要的信息后,获得 去掉一些对翻译不必要的信息 的更有效的源程序的中间表示, 的更有效的源程序的中间表示,这种经过变换后的语法 树称为抽象语法树。 树称为抽象语法树。 内部结点代表操作符,它的孩子代表对应的操作数。 内部结点代表操作符,它的孩子代表对应的操作数。 例:a+a*(b-c)+(b-c)*d ( ) ( ) + + a a b

编译原理-第七章解析资料

编译原理-第七章解析资料

中间代码 中间 中间代码 生成器 代码 优化器
静态语义检查和中间代码生成器的位置
2018/10/26
TJNU-COCIE-WJW
5
第七章 语义分析和中间代码产生
中间语言 7.2 说明语句 7.3 赋值语句的翻译 7.4 分情况语句 7.5 回填技术 7.6 类型检查
7.1
2018/10/26 TJNU-COCIE-WJW 6
TJNU-COCIE-WJW 28
2018/10/26
例子:语句a:=b*-c+b*-c 的三元式表示
op arg1 arg2
(0) (1) (2) (3) (4) (5)
uminus * uminus * + Assign
c b c b
(1)
(0) (2) (3) (4)
a
2018/10/26
TJNU-COCIE-WJW
例:x
+ y * z翻译成 t1 := y * z t2 := x + t1
TJNU-COCIE-WJW 16
2018/10/26
1.一般形式(续)
三地址代码是AST或DAG的线性化表示

DAG图对应的三地址代码可能比相应的AST
对应的三地址代码要优化,因为可以复用中 间结果
2018/10/26
29
注意: 有些三地址语句要多个三元式表示 例子: x[i] := y op arg1 arg2 (0) [ ]= x i (1) := (0) y
y := x[i] op arg1 (0) =[ ] x (1) := y arg2 i (0)
2018/10/26
TJNU-COCIE-WJW

编译原理(第2版)7-1语义出理概述

编译原理(第2版)7-1语义出理概述

(3)一致性检查。在很多场合要求对象只能被定义一次。例 如Pascal语言规定同一标识符在一个分程序中只能被说明一 次,同一case语句的标号不能相同,枚举类型的元素不能重 复出现等等。
(4)相关名字检查。有时,同一名字必须出现两次或多次。
例如,Ada 语言程序中,循环或程序块可以有一个名字,
出现在这些结构的开头和结尾,编译程序必须检查这两个地
方用的名字是相同的。 整理ppt
11
(5)名字的作用域分析
类型检查程序的设计
1.辨认语言中可用的类型
2.辨认具有类型的语言结构 3.辨认语言的语义规则
基础 类型的基本概念
整理ppt
12
类型的基本概念
• 数据类型的三要素:
用于区别这种数据类型的数据对象的属性
这种类型数据对象可以具有的值
可以施用在这种类型的数据对象上的操作
存储(相对)位置等信息。
整理ppt
6
语义处理
PL/0编译程序的语义处理(一)call语句的处理
if sym = callsym
then
begin
getsym;
if sym <> ident then error(14)
else begin
i := position(id);
if i = 0 then error(11)
归纳:语义分析(静态语义处理)
(1)类型检查。验证程序中执行的每个操作是否遵守语言的 类型系统的过程.,编译程序必须报告不符合类型系统的信 息。
(2)控制流检查。控制流语句必须使控制转移到合法的地方。 例如,在C语言中break语句使控制跳离包括该语句的最小 while、for或switch语句。如果不存在包括它的这样的语句, 则就报错。

编译原理简明教程(第2版)第7章

编译原理简明教程(第2版)第7章
《编译原理简明教程》
普通高等教育“十二五”规划计算机教材
---太原理工大学 ---计算机科学与技术学院 ---冯秀芳、崔冬华、段富等
目 录
•第一章 引言 •第二章 形式语言理论基础 •第三章 自动机理论基础 •第四章 词法分析 •第五章 语法分析—自顶向下分析方法 •第六章 语法分析—自底向上分析方法 •第七章 语义分析及中间代码的生成 •第八章 代码优化 •第九章 目标代码的生成 •第十章 符号表 •第十一章 目标程序运行时的存储组织与分配 •第十二章 出错处理 •第十三章 编译程序自动生成工具简介 •第十四章 面向对象语言的编译 •第十五章 并行编译技术

7.1 7.2

基本概念 几种常见的中间语言
7.1
7.1.1
基本概念
语义分析的概念
语义分析:分析语法结构的含义,将其表示成中 间语言或生成目标指令。 语义形式化(或形式语义学):是个专门的研究课 题,如操作语义学、公理语义学、指称语义学等。 不论哪种方法,其本身的符号系统比较繁杂,其 描述文本不易读,因此都不能成为标准的形式语 义系统。
(2)属性文法:
例:G[E]属性文法:
E .t T .t E .t E .t T .r E .t | T .r E .t | T .t F .tT .t T .t * F .r T .t | / F .r T .t | F .t ( num | id ) | ( E .t )
约定几个符号: (1)BL 表示转向某标号处 (2)BT 表示条件为真转 (3)BF 表示条件为假转 (4)BR 表示无条件转
1.
赋值语句的逆波兰式
<左部>:=<表达式> <左部><表达式>:= 例: x:=a+b*c xabc*+:=

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教案]第1章

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教案]第1章

第一章 引言
学习目标
了解和掌握高级程序设计语言与编译程序的关系 了解和掌握编译程序的功能 了解和掌握编译程序的体系结构 了解和掌握编译程序的工作过程 了解和掌握编译程序的组织方式 了解和掌握编译程序的构造方法
“编译原理”,“编译技术”是计算机专 业一门重要的专业课。目的是系统地向学生讲 授编译程序的基本结构。阐述编译原理的一般 理论和常用的有效方法与技术。 学习本课后,使学生掌握编译理论和方法 方面的基本知识,具有设计、实现、分析和维 护编译程序等方面的初步能力。 主要内容:形式语言与自动机、词法分析、 语法、语义、中间语言代码生成、优化、存储 组织与分配、程序的查错与处理等。
目 录
1.1 1.2 1.3 1.4 编译程序、汇编程序、解释程序 编译过程概述 编译程序的结构框图 编译程序的开发
1.1程序的翻译及运行
计算机系统: 硬件 软件:系统软件:OS、编译系统、诊断 系统 应用软件等 程序设计语言: 机器 汇编 高级 翻译程序:指能把A语言程序翻译成与之等价的B语言程
“中间代码”是一种含义明确、便于处理的记号系统。 如:三元式、四元式、逆波兰式。 例:四元式(运算符,第一运算量,第二运算量,结果) z = (x + 3)*y/w;(+, x, 3, T1) (*, T1, y, T2 ) (/, T2 , w, z)
四、代码优化
优化的任务在于对前阶段产生的中间代码进行加工变换,以期在 最后阶段产生出更为高效(节省时间和空间)的目标代码。优化的主要 方面有:公共子表达式的提取、循环优化、删除无用代码等。有时, 为了便于“并行运算”,还可以对代码进行并行优化处理。优化所依 循的原则是程序的等价变换规则。 优化涉及的范围很广。

编译原理演示文稿7

编译原理演示文稿7

例:设有类Pascal程序段 program example(input,output);
type student=record no:integer; name:array[1..10] of char; score:integer end;
weekday=(sun,mon,tue,wed,thu,fri,sat); var st:array[1..50] of student;
name :array[1..20] of char; next:link end; 的无类型结构树或无环 有向图相等即可。检查类型等价也分成静态检查和动态检查。 由编译程序能完成的类型检查叫做静态类型检查;由目标程 序运行时所作的类型检查就称为动态类型检查。一般地,如 果要在生成的目标代码中完成类型检查,则目标代中不但要 保存数据的值,而且还保存该数据的类型,则可完工成相应 的动态类型检查。因算法语言的类型检查多数是静态的类型 检查,在这里仅介绍了静态的类型检查。
7.1.4 控制结构 一种程序设计语言的控制结构是该语言在程序运行期间
用于改变控制流的语言特征集合。它包括有条件控制转移, 条件执行、循环控制、过程序调用、转移和出口。编译程序 在翻译时必须保证源程序不能违法控制结构的语义。如 Pascal中只能从循环体内转向循环体外、C语言中不能从一 个函数转向另一个函数、BASIC中不能在循环体内修改循环 变量的值,而C没有这种限制。 例:错误的控制结构 begin
定义7.1 数据类型是对该类型数据(变量或常量)的取值是 否合法以及对该类型据的运算是否合法的一种说明。
实现和完成数据类型的合法性检查,它包括以下任务:
(1) 检查运算符作用在运算对象上的合法性,这一合法性保 证了该运算能产生正确的运算结果。

编译原理第七章

编译原理第七章

对例6.1的文法用拓广文法表示成: S′→S[0] S→aAcBe[1] A→b[2] A→Ab[3] B→d[4] 现对句子abbcde的可归前缀列出: S[0] ab[2] aAb[3] aAcd[4] aAcBe[1]
构造识别其活前缀及可归前缀的有限自动机如图7.2。 每一个终态都是句柄识别态,用双圈表示。带"*"号的状态既为句柄识
观察产生式右部的非终结符。 2、应用LR(0)CONTEXT(A→β)=LC(A).β求得包含句柄 的活前缀。 3、由此可构造以文法符号为字母表的识别(包括句柄) 活前缀的不确定有限自动机。 4、应用子集法对上述的不确定有限自动机进行确定化 得到识别可归前缀的确定有限自动机。
结论:对任何一个上下文无关文法只要能构造出识别 可归前缀的有限自动机,就可以构造其相应的分析表。
if ACTION[Si,a]=Sj then begin PUSH j,a (进栈)
ip 前进(指向下一输入符号)
end
else
if ACTION[Si,a]=rj(若第j条产生式 为A→β) then begin
pop |β| 项
对于上面的分析过程我们可以知道:
若当前栈顶状态为Sk push GOTO[Sk,A] 和A(进栈) end
在文法G中每个产生式的右部适当位置添加一个圆点构成项目。
例如,产生式S→aAcBe对应有6个项目:
[0] S→·aAcBe [2] S→aA·cBe [4] S→aAcB·e
7.2.1 可归前缀和子前缀
为了在以后的LR分析中不致引起混淆,现对原文法进行拓广。 若原文法G的开始符号为S,在G中加产生式S′→S后得新的文法G′, 则称G′为原文法G的拓广文法,而S′为拓广后文法G′的开始符号。 对文法进行拓广的目的是为了对某些右部含有开始符号的文法,在 归约过程中能分清是否已归约到文法的最初开始符,还是在文法右 部出现的开始符号,拓广文法的开始符号S′只在左部出现,这样 确保了不会混淆。

编译原理教程课后习题答案——第七章

编译原理教程课后习题答案——第七章

第七章目标代码生成7.1 对下列四元式序列生成目标代码:T=A-BS=C+DW=E-FU=W/TV=U*S其中,V是基本块出口的活跃变量,R0和R1是可用寄存器。

【解答】简单代码生成算法依次对四元式进行翻译。

我们以四元式T=a+b为例来说明其翻译过程。

汇编语言的加法指令代码形式为ADD R, X其中,ADD为加法指令;R为第一操作数,第一操作数必须为寄存器类型;X为第二操作数,它可以是寄存器类型,也可以是内存型的变量。

ADD R,X指令的含意是:将第一操作数R与第二操作数相加后,再将累加结果存放到第一操作数所在的寄存器中。

要完整地翻译出四元式T=a+b,则可能需要下面三条汇编指令:MOV R, aADD R, bMOV T, R第一条指令是将第一操作数a由内存取到寄存器R中;第二条指令完成加法运算;第三条指令将累加后的结果送回内存中的变量T。

是否在翻译成目标代码时都必须生成这三条汇编指令呢?从目标代码生成的优化角度考虑,即为了使生成的目标代码更短以及充分利用寄存器,上面的三条指令中,第一条和第三条指令在某些情况下是不必要的。

这是因为,如果下一个四元式紧接着需要引用操作数T,则第三条指令就不急于生成,可以推迟到以后适当的时机再生成。

此外,如果必须使用第一条指令,即第一操作数不在寄存器而是在内存中,且此时所有可用寄存器都已分配完毕,这时就要根据寄存器中所有变量的待用信息(也即引用点)来决定淘汰哪一个寄存器留给当前的四元式使用。

寄存器的淘汰策略如下:(1) 如果某寄存器中的变量已无后续引用点且该变量是非活跃的,则可直接将该寄存器作为空闲寄存器使用。

(2) 如果所有寄存器中的变量在基本块内仍有引用点且都是活跃的,则将引用点最远的变量所占用寄存器中的值存放到内存与该变量对应的单元中,然后再将此寄存器分配给当前的指令使用。

因此,本题所给四元式序列生成的目标代码如下:MOV R0, ASUB R0, C /*R0=T*/MOV R1, CADD R1, D /*R1=S*/MOV S, R1 /*S引用点较T引用点远,故将R1的值送内存单元S*/MOV R1, ESUB R1, F /*R1=W*/SUB R1, R0 /*R1=U*/MUL R1, S /*R1=V*/7.2 假设可用的寄存器为R0和R1,且所有临时单元都是非活跃的,试将以下四元式基本块:T1=B-CT2=A*T1T3=D+1T4=E-FT5=T3*T4W=T2/T5用简单代码生成算法生成其目标代码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构的含义:主要指程序中所用标识符及 与其相关的数据对象的含义。 源程序的含义 控制结构的含义:如if语句、for循环等结构 由语言来定义。 例:int m,n; float x,y; 语义:类型------程序说明部分 值---------程序执行部分
控制结构的含义有两种确定形式
形式化: 如 E → E+T|E-T|T 先“*,/”后“+, -” T → T*F|T/F|F 左结合 …… p →(E)|i 非形式: 如 赋值语句含义,非形式化的规定 V:=e
例: FOR i=1 TO 100 DO s:=s+i 展开 i:=1; (1) i1:= 10: IF i<=100 THEN (4) 10: (6) i100<=23 BF BEGIN (11)ssi+:= s:=s+i; (16)ii1+:= i:=i+1; (21)10BL GOTO 10 (23) END
E TE E T { writecode (' ' ); } E | T { writecode (' ' ); } E | T FT T * F { writecode ('*' ); }T | / F { writecode (' /' ); }T | F ( num | id ){ writecode ( ch ); } | ( E )
第七章 语义分析及中间代码的生成
学习目标
语义分析的概念 常见的中间语言形式: 逆波兰表示、四元式表示、三元式表示 常见语法成分的逆波兰表示、四元式表示、 三元式表示、三地址代码表示
词法→ 语法 →语义 →中间代码 编译程序的任务:源程序 →目标程序 两者语法结构上可以不同,但语义 上是等同的
例:if(a<b) then x:=a+b else x:=a-b (1)ab< 或: ab<13BFxab+:= (4)13BF 18BRxab-:= (6)xab+:= (11)18BR (13)xab-:= (18)
4.
循环语句的逆波兰式
For i:=m To n Do s for(i=m;i<=n;i++) {s} 首先展开, i:=m; 10: IF i<=n THEN BEGIN S; i:=i+1; GOTO 10; END
如:x:=a-b*c S
语法树和抽象语法树如下:
assign(:=) E
E E c E * b x E a
V :=
x
a
b
*
c
抽象语法树的特点:结构紧凑、容易构造、结点数 少的图形表示。
7.2.2
逆波兰表示(后缀式)
例:a+b*c abc*+ (a+b)*c ab+c* a+b*c/(d-e) abc*de-/+ + a / * b c d e 抽象语法树 逆波兰式是抽象语法树的线性表示。 即:后序遍历抽象语法树便得到逆波兰式。
码或目标代码。
7.1.2
属性文法技术
属性文法:给文法中的符号附上属性。 1. 增量式文法 增量式文法:文法中加入语义动作符号。 一般形式:A(α|{f(…);})*
α∈V* 语义动作 作用:在语法分析时,遇到带有语义动作的花括 号即执行语义动作,执行完后再进行下一 步分析。
例:表达式文法G[E]:
4. 循环语句的三元式
FOR i:=1 TO 100 DO sum:=sum+i 首先展开: 三元式: i:=1 (1)(:=,1,i) 10:IF i<=100 THEN (2)(<=,i,100) BEGIN (3)(BF,(9),(2)) sum:=sum+i; (4)(+,sum,i) i:=i+1; (5)(:=,(4),sum) GOTO 10 (6)(+,i,1) END (7)(:=,(6),i) (8)(BR,(2),_) (9)
7.2.3
四元式
1.四元式 (运算符,运算量1,运算量2,中间结果) 例: a*b+c*d (*, a, b, T1) (*, c, d, T2) (+,T1,T2,T3) 对于单目运算符 ⊕,⊖ 如+a,-a ( ⊕ ,a,_,T) ( ⊖ ,a,_,T)
2. 表达式和赋值语句的四元式
例:(1)a+b*c/d
对于表达式“12-a/b”,带有动作的语法树如下:
E T F 12 T’ ε E’ T F {writecode(‘-’)} T’ ε
E’
{writecode(‘12’)}
a {writecode(‘a’)} T’ b
/ F {writecode(‘/’)}
{writecode(‘b’)}
执行相应的子程序后打印出逆波兰式12ab/-
1.三元式
三元式
(运算符,运算量1,运算量2)
例:(a+b)*c
(1)(+, a, b)
(2)(*, (1),c)
2.
表达式和赋值语句的三元式
a+b*(c-d)-e/f (1)(-, c, d ) (2)(*, b, (1)) (3)(+, a, (2)) (4)(/, e, f ) (5)(-,(3),(4))
(*,b,c,T1) (2)-b*(c+d) ( ⊖,b,_, T1) (+,c,d, T2) (*, T1, T2, T3)
(3)x:=-b*(c+d)
(⊖,b,_, T1)
(/,T1,d,T2)
(+,a,T2,T3)
(+,c,d, T2)
(*,T1 ,T2,T3)
(:=, T3,_,x)
3. 转向语句和条件语句的四元式
约定几个符号: (1)BL 表示转向某标号处 (2)BT 表示条件为真转 (3)BF 表示条件为假转 (4)BR 表示无条件转
1.
赋值语句的逆波兰式
<左部>:=<表达式> <左部><表达式>:= 例: x:=a+b*c xabc*+:=
x:=a*b-c/d xab*cd/-:=
2.
GOTO语句的逆波兰式
2. 属性文法
(1)文法的属性: 指与文法符号相关信息,如它的类型、值、代码序列、符 号表内容等。 属性 继承属性:用于“自上而下”传递信息(非终结符可有)
综合属性:用于“自下而上”传递信息(VT或VN)
指在语言的文法中增加了属性的文法。 记号N.t表示与非终结符N相联的属性t 属性有助于更详细地指定文法中的代码生成动作。
(2)属性文法:
例:G[E]属性文法:
E .t T .t E .t E .t T .r E .t | T .r E .t | T .t F .tT .t T .t * F .r T .t | / F .r T .t | F .t ( num | id ) | ( E .t )
语义分析的基本任务
1.类型的确定:数据对象的数据类型 2.类型的检查:对运算及运算量的类型检查 3.确认含义:确认控制结构的含义 4.其它语义检查:不允许体外到体内等.
目前许多编译程序采用语法制导翻译的 方法。(不是一种形式化系统,但比较接近形
式化)
以语法分析为主导的语义处理,即在语法
分析的过程中嵌入语义处理程序,生成中间代
《编译原理简明教程》
普通高等教育“十二五”规划计算机教材
---太原理工大学 ---计算机科学与技术学院 ---冯秀芳、崔冬华、段富等
目 录
•第一章 引言 •第二章 形式语言理论基础 •第三章 自动机理论基础 •第四章 词法分析 •第五章 语法分析—自顶向下分析方法 •第六章 语法分析—自底向上分析方法 •第七章 语义分析及中间代码的生成 •第八章 代码优化 •第九章 目标代码的生成 •第十章 符号表 •第十一章 目标程序运行时的存储组织与分配 •第十二章 出错处理 •第十三章 编译程序自动生成工具简介 •第十四章 面向对象语言的编译 •第十五章 并行编译技术
GOTO <语句标号> <语句标号> BL 例: GOTO 10 10 BL
3.
条件语句的逆波兰表示
IF (e) THEN S1 ELSE S2 逆波兰式:<e的逆波兰式> <顺序号1> BF <S1的逆波兰式> <顺序号2> BR <S2的逆波兰式>
例: IF m<n THEN k:=i*j+2 ELSE k:=i*j-2 (1)mn< 或: mn<15BFkij*2 (4)15 BF 22BRkij*2-:= (6)kij*2+:= (13)22BR (15)kij*2-用空间少 缺点:没有保存运算结果的属性, 不利于修改、优化
间接三元式
增加一个间接码表(按三元式执行顺序列出三元式的编号) 例: x:=(a-b)*c 三元式 间接码表 三元式表 b:=a-b (1)(-,a,b) (1) (1)(-,a,b) y:=c*(a-b) (2)(*,(1),c) (2) (2)(*,(1),c) (3)(:=,(2),x) (3) (3) (:=,(2),x) (4)(:=,(1),b) (1) (4)(:=,(1),b) (5)(-,a,b) (4) (5)(:=,(2),y) (6)(*,c,(5)) (2) (7)(:=,(6),y) (5)
7.2
几种常见的中间语言
采用中间语言的优点: 有利于重定目标,即一种中间表示可以生成不同的目 标语言。 有利于提高目标代码的质量,因为可对中间语言进 行与机器无关的优化。
相关文档
最新文档