编译原理课件第7章.ppt
《编译原理课件第7章.ppt》由会员分享,可在线阅读,更多相关《编译原理课件第7章.ppt(114页珍藏版)》请在三一办公上搜索。
1、2023/11/16,1,第7章语义分析与中间代码生成,7.1 中间代码的形式7.2 声明语句的翻译7.3 赋值语句的翻译7.4 类型检查7.5 控制结构的翻译7.6 回填7.7 switch语句的翻译7.8 过程调用和返回语句的翻译7.9 输入输出语句的翻译7.10 本章小结,2023/11/16,2,7.1 中间代码的形式,中间代码的作用过渡:经过语义分析被译成中间代码序列中间代码的形式中间语言的语句中间代码的优点形式简单、语义明确、独立于目标语言便于编译系统的实现、移植、代码优化常用的中间代码语法树节)逆波兰表示、三地址码(三元式和四元式)、DAG图表示,2023/11/16,3,7.1
2、.1 逆波兰表示,中缀表达式的计算顺序不是运算符出现的自然顺序,而是根据运算符间的优先关系来确定的,因此,从中缀表达式直接生成目标代码一般比较麻烦。波兰逻辑学家J.Lukasiewicz于1929年提出了后缀表示法,其优点为:表达式的运算顺序就是运算符出现的顺序,它不需要使用括号来指示运算顺序。,2023/11/16,4,7.1.1 逆波兰表示,例7.1 下面给出的是一些表达式的中缀、前缀和后缀表示。中缀表示前缀表示后缀表示a+b+abab+a*(b+c)*a+bcabc+*(a+b)*(c+d)*+ab+cd ab+cd+*a:=a*b+c*d:=a+*ab*cd abc*bd*+:=,20
3、23/11/16,5,7.1.2 三地址码,所谓三地址码,是指这种代码的每条指令最多只能包含三个地址,即两个操作数地址和一个结果地址。如x+y*z三地址码为:t1:=y*z t2:=x+t1三地址码中地址的形式:名字、常量、编译器生成的临时变量。,2023/11/16,6,7.1.2 三地址码,例7.2 赋值语句a:=(-b)*(c+d)-(c+d)的三地址码如图7.1所示,t1:=minus bt2:=c+dt3:=t1*t2t4:=c+dt5:=t3-t4a:=t5,图7.1 a:=(-b)*(c+d)-(c+d)的三地址码,2023/11/16,7,7.1.2 三地址码,1形如x:=y
4、op z的赋值指令;2形如x:=op y的赋值指令;3形如 x:=y的复制指令;4无条件跳转指令goto L;5形如 if x goto L(或if false x goto L)的条件跳转指令;6形如if x relop y goto L的条件跳转指令;7过程调用和返回使用如下的指令来实现:param x用来指明参数;call p,n和y=call p,n用来表示过程调用和函数调用;return y表示过程返回;8形如x:=yi和xi:=y的变址复制指令;9形如x:=&y、x:=*y和*x:=y的地址和指针赋值指令。,2023/11/16,8,四元式,四元式是一种比较常用的中间代码形式,它由
5、四个域组成,分别称为op、arg1、arg2和result。op是一个一元或二元运算符,arg1和arg2分别是op的两个运算对象,它们可以是变量、常量或编译器生成的临时变量,运算结果则放入result中。,图7.2(a)图7.1中三地址码的四元式表示,2023/11/16,9,三元式,为了节省临时变量的开销,有时也可以使用只有三个域的三元式来表示三地址码。三元式的三个域分别称为op,arg1和arg2,op,arg1和arg2的含义与四元式类似,区别只是arg1和arg2可以是某个三元式的编号(图7.2(b)中用圆括号括起来的数字),表示用该三元式的运算结果作为运算对象。,图7.2(b)图7
6、.1中三地址码的三元式表示,2023/11/16,10,7.1.3 图表示,类似于表达式的抽象语法树一样,在dag(directed acyclic graph)中,每个节点对应一个运算符,代表表达式的一个子表达式,其子节点则与该运算符的运算对象相对应,叶节点对应的是变量或者常量,可以看成是原子运算。利用dag可以很容易地消除公共子表达式例7.3 表达式a+a*(b-c)-(b-c)/d的dag如图7.5所示。,图7.5 a+a*(b-c)-(b-c)/d的dag图,对应的三地址码:t1:=b-ct2:=a*t1t3:=a+t2t4:=t1/dt5:=t3-t4,2023/11/16,11,生
7、成dag的语法制导定义,2023/11/16,12,7.2 声明语句的翻译,声明语句的作用为程序中用到的变量或常量名指定类型 类型的作用 类型检查:类型检查的任务是验证程序运行时的行为是否遵守语言的类型的规定,也就是是否符合该语言关于类型的相关规则。辅助翻译:编译器从名字的类型可以确定该名字在运行时所需要的存储空间。在计算数组引用的地址、加入显式的类型转换、选择正确版本的算术运算符以及其它一些翻译工作时同样需要用到类型信息。编译的任务在符号表中记录被说明对象的属性(种别、类型、相对地址、作用域等),为执行做准备,2023/11/16,13,7.2.1 类型表达式,类型可以具有一定的层次结构,因
8、此用类型表达式来表示。类型表达式的定义如下:1基本类型是类型表达式。典型的基本类型包括boolean、char、integer、real及void等。2类型名是类型表达式。3将类型构造符array应用于数字和类型表达式所形成的表达式是类型表达式。如果T是类型表达式,那么array(I,T)就是元素类型为T、下标集为I的数组类型表达式。4如果T1和T2是类型表达式,则其笛卡尔乘积T1T2也是类型表达式。,2023/11/16,14,7.2.1 类型表达式,5类型构造符record作用于由域名和域类型所形成的表达式也是类型表达式。记录record是一种带有命名域的数据结构,可以用来构成类型表达式。
9、例如,下面是一段Pascal程序段:type row=record address:integer;lexeme:array1.15 of char end;var table:array 1.10 of row;6如果T是类型表达式,那么pointer(T)也是类型表达式,表示“指向类型为T的对象的指针”。7类型表达式可以包含其值为类型表达式的变量。,2023/11/16,15,7.2.2 类型等价,许多类型检查的规则都具有如下的形式:if两个类型表达式等价then返回一种特定类型else返回type_error。如果用图来表示类型表达式,当且仅当下列条件之一成立时,称两个类型T1和T2是结
10、构等价的:T1和T2是相同的基本类型;T1和T2是将同一类型构造符应用于结构等价的类型上形成的;T1是表示T2的类型名。如果将类型名看作只代表它们自己的话,则上述条件中的前两个将导致类型表达式的名字等价两个类型表达式名字等价当且仅当它们完全相同,2023/11/16,16,7.2.3 声明语句的文法,P prog id(input,output)D;SD D;D|List:T|proc id D;SList List1,id|idT integer|real|array C of T1|T1|record DC num C|D 程序说明部分的语法变量S 程序体部分的语法变量T 类型的语法变量,
11、需要表示成类型表达式C 数组下标的语法变量,2023/11/16,17,语义属性、辅助过程与全局变量的设置,文法变量T(类型)的语义属性type:类型(表达式)width:类型所占用的字节数辅助子程序enter:将变量的类型和地址填入符号表中array:数组类型处理子程序全局变量offset:已分配空间字节数,用于计算相对地址,2023/11/16,18,7.2.4 过程内声明语句的翻译,声明语句的主要作用是为名字指定类型,从名字的类型可以确定它在运行时所需要的存储空间。数据对象的存储安排与目标机器的寻址方式有关。对声明语句的限制也影响数据对象的存储安排,2023/11/16,19,声明语句的
12、翻译模式,P offset:=0 DDD;DDid:T enter(id.name,T.type,offset);offset:=offset+T.widthTinteger T.type:=integer;T.width:=4Treal T.type:=real;T.width:=8Tarray num of T1 T.type:=array(num.val,T1.type);T.width:=num.val*T1.widthTT1 T.type:=pointer(T1.type);T.width:=4,PMDM offset:=0,2023/11/16,20,例 x:real;i:inte
13、ger 的翻译,enter(x,real,0),offset=0,offset=8,T.type=realT.width=8,offset=12,T.type=integerT.width=4,enter(i,integer,8),Did:T enter(id.name,T.type,offset);offset:=offset+T.width,2023/11/16,21,例 x:real;i:integer 的翻译,Poffset:=0Doffset:=0D;Doffset:=0 x:Tenter(x,T.type,offset);offset:=offset+T.width;Doffset
14、:=0 x:realT.type:=real;T.width:=8 enter(x,T.type,offset);offset:=offset+T.width;Dx:real(x,real,0);offset:=8;Dx:real(x,real,0);offset:=8;i:T enter(id.name,T.type,offset);offset:=offset+T.widthx:real(x,real,0);offset:=8;i:integerT.type:=integer;T.width:=4enter(i,T.type,offset);offset:=offset+T.widthx:
15、real(x,real,0);i:integer(i,integer,8);offset:=12,2023/11/16,22,7.2.5 嵌套过程中声明语句的翻译,所讨论语言的文法P prog id(input,output)D;S D D;D|id:T|proc id D;S 语义动作用到的函数mktable(previous):创建一个新的符号表;enter(table,name,type,offset)addwidth(table,width):符号表的大小;enterproc(table,name,newtable)在table指向的符号表中为name建立一个新表项;,2023/11/
16、16,23,P prog id(input,output)M D;S addwidth(top(tblptr),top(offset);pop(tblptr);pop(offset)M t:=mktable(nil);push(t,tblptr);push(0,offset)D D1;D2D proc id;N D1;S t:=top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t)Did:T enter(top(tblptr),id.name,T.type,top(o
17、ffset);top(offset):=top(offset)+T.widthN t:=mktable(top(tblptr);push(t,tblptr);push(0,offset),7.2.5 嵌套过程中声明语句的翻译,2023/11/16,24,program sort(input,output);var a:array0.10 of integer;x:integer;procedure readarray;var i:integer;begin aend;procedure exchange(i,j:integer);begin x:=ai;ai:=aj;aj:=x;end;pro
18、cedure quicksort(m,n:integer);var k,v:integer;function partition(y,z:integer):integer;var i,j:integer;begin a v exchange(i,j)end;begin end;begin end;,例 一个带有嵌套的pascal程序(图7.11),2023/11/16,25,表 头,空,sort,offset,tblptr,top,top,0,2023/11/16,26,表 头,空,sort,offset,tblptr,top,top,40,a array 0,2023/11/16,27,x
19、integer 40,a array 0,表 头,空,sort,offset,tblptr,top,top,44,2023/11/16,28,表 头,空,sort,readarrary,表 头,offset,tblptr,top,top,44,0,a array 0,x integer 40,2023/11/16,29,表 头,空,sort,readarrary,表 头,offset,tblptr,top,top,44,4,a array 0,x integer 40,i integer 0,2023/11/16,30,表 头,空,sort,readarrary,表 头 4,offset,tb
20、lptr,top,top,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,2023/11/16,31,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头,top,top,0,2023/11/16,32,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i inte
21、ger 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,2023/11/16,33,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,0,2023/11/16,34,表 头,空,sort,readarrary,表 头 4,offset,tblpt
22、r,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,4,k integer 0,2023/11/16,35,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quic
23、ksort,8,k integer 0,v integer 4,2023/11/16,36,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,0,2023/11/16,37,表 头,空,sort,readarrary,表 头 4,offset,tblp
24、tr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,4,i integer 0,2023/11/16,38,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表
25、 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,v integer 4,表 头,partition,8,i integer 0,j integer 4,2023/11/16,39,表 头,空,sort,readarrary,表 头 4,offset,tblptr,44,a array 0,x integer 40,i integer 0,readarray,指向readarray,exchange,表 头 0,top,top,exchange,指向exchange,表 头,quicksort,8,k integer 0,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课件
链接地址:https://www.31ppt.com/p-6599857.html