《编译原理课程教案》第5章:中间代码生成.ppt
《《编译原理课程教案》第5章:中间代码生成.ppt》由会员分享,可在线阅读,更多相关《《编译原理课程教案》第5章:中间代码生成.ppt(81页珍藏版)》请在三一办公上搜索。
1、语义分析和中间代码生成,第五章,本章要求,主要内容:语义分析和中间代码的功能,中间代码的形式,属性文法及语法制导的翻译程序,各种语句的语法制导的翻译过程重点掌握:属性文法,语义分析与处理的方法,中间代码的表示形式,各种语句的代码结构,各种语句的翻译方法,语义分析和中间代码生成所处的位置:,5.1 概述,.语义分析和中间代码生成在编译器中的位置:,静态语义检查:如:类型、运算、数组维数、越界等的检查语义处理:如:变量的存储分配、表达式的求值、语句的翻译(中间代码的生成)总目标:生成等价的中间代码,.功能及任务:P166,输入-语法分析单位,输出-用中间代码形式表示的文本-出错处理:定位、继续编译
2、,3.为什么要此阶段?逻辑结构清楚;利于不同目标机上实现同一种语言;利于进行与机器无关的优化,这些内部形式也能用于解释。4.什么是中间代码(Intermediate code)源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。5.中间代码的几种形式逆波兰、三元式、间接三元式、四元式、树,1、逆波兰式:运算对象写在前,运算符写在后(后缀表示形式)例:a+b ab+(a+b)*c ab+c*a+b*c abc*+a:=b*c+b*d abc*bd*+:=,5.2中间代码的几种形式,优点:易于计算机处理 利用栈,将扫描到的运算对象入栈,碰到运算符:若是双目运算符,则对栈顶的两
3、个运算对象实施该运算并将运算结果代替这两个运算对象进栈;若是单目运算符,对栈顶元素,执行该运算,将运算结果代替该元素进栈,最后结果即栈顶元素。,练习,写出下列算式的逆波兰表示a+b*(c+d/e)a:=b*(-c)+b*(-34)not A or not(C or not D),abcde/+*+a b c-*b 34-*+:=A not C D not or not or,后缀式的推广,(1)赋值语句A:=E,后缀式为:AE:=(2)转向语句GOTO L的后缀式为:Ljmp(3)条件语句if xy then m:=x else m:=y,2、三元式编号(运算符,第一运算数,第二运算数)如:a
4、:=b*c+b*d(1)(*,b,c)(2)(*,b,d)(3)(+,(1),(2))(4)(:=,(3),a)对于单目运算符,只有一个运算对象,另一个为空注意:在三元式中的编号既代表了序号,又代表了结果的存放位置。,3、四元式P172 是目前最常用的中间代码形式:(运算符,第一运算数,第二运算数,结果)例:a:=b*c+b*d(1)(*,b,c,t1)(2)(*,b,d,t2)(3)(+,t1,t2,t3)(4)(:=,t3,a)也可以写成赋值语句形式:(1)t1:=b*c(2)t2:=b*d(3)t3:=t1+t2(4)a:=t3,练习,求-B+C*D 的逆波兰表示形式、三元式和四元式,到
5、目前为止,已知 输入的语法单位,又知道 要翻译的结果的形式,翻译的方法是什么?,语义分析和翻译的方法:语义表示较流行的方法仍然是属性文法,翻译方法是语法制导的翻译。,属性文法,属性文法:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。属性:代表与文法符号相关的信息,如类型、值、代码序列、符号表的内容等。与变量一样,可以进行计算和传递,属性的加工过程就是语义的处理过程。,属性分两类:综合属性:用于自下而上传递信息继承属性:用于自上而下传递信息
6、注意:终结符只有综合属性,它由词法分析器提供;非终结符可有综合属性,也可有继承属性,它由词法分析器提供;文法的开始符号的所有继承属性作为属性计算前的初始值,产生式右边的文法符号的继承属性可以继承左边的文法符号的继承属性产生式左边的文法符号可以通过综合右边的文法符号的综合属性而得到但必须提供一个计算规则:计算规则中只能使用相应产生式中的文法符号的属性。实际应用中,一个结点的综合属性的值由其子结点的综合属性值决定(产生式右边)。一个结点的继承属性由此结点的父结点和/或兄结点的某些属性决定(产生式左边)。但产生式左边的继承属性和右边的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的
7、属性计算规则提供。,digitlexval:=3,Fval:=3,Tval:=3,Fval:=5,Tval:=15,*,Eval:=15,+,digitlexval:=4,Fval:=4,Tval:=4,Eval:=19,L,n,digitlexval:=5,若输入符号串为:3*5+4n,例:综合属性的计算,C语言中变量定义:int id1,id2,id3,综合属性的传递,继承属性的传递,例:继承属性的计算,语法制导的翻译方法,基于属性文法的处理过程通常是:,对单词符号串进行语法分析;,构造语法树;,根据需要遍历语法树;,在语法树的各结点处按语义规则进行计算。,语义规则描述的工作:属性计算、静
8、态语义检查、符号表的操作、代码生成等,通常写成过程和函数调用,称为语义子程序。,语法制导翻译的基本思想:在语法分析过程中,根据语言的语义定义,随时翻译已识别的那部分语法成分的全部含义。,语法制导的翻译方法:如果遍历语法树的操作和建立语法树的操作同时进行,称为语法制导的翻译方法。,语法制导翻译的两种方法,(1)在自下而上的语法分析中,使用和语法分析栈同步操作的语义栈进行语法制导翻译;(2)在自上而下的语法分析中(如递归下降分析),利用隐含的堆栈存储各递归子程序中的局部变量所表示的语义信息。,自下而上分析的语法制导翻译,语法分析是自下而上的情况时,语义计算的时机是:在用某一产生式进行规约的同时,执
9、行相应的语义动作。在分析完一个句子时,这个句子的“值”也就同时产生了。,例:属性文法如下,输入串为:3*5+4,其语法树如下图:,E,E1,+,T,T,T,*,F,F,3,5,F,4,在第一步规约时使用产生式6,执行的语义动作是将F.val的值置为单词digit的值3。把语法树中每个结点得语义值写在结点后的括号中,则第一步完成规约后的情形如右图所示:,E1,+,T,T,T,*,F,F(3),5,F,4,E,第一步规约,继续进行分析,逐步向上规约,得到下图所示的情形,最后用E E1+T规约到E时,它的值19就计算出来了。,E1(15),+,T(4),E,在自下而上的LR语法分析过程中,首先把它的
10、分析栈进行扩充,使得每个文法符号都带有语义值。修改后栈的结构如下图所示:,同时把LR分析器的能力扩大,使它不仅执行语法分析任务,且能在用某个产生式进行规约的同时进行相应的语义处理,完成属性文法中定义的语义动作。每步工作后的语义值保存在扩充的语义栈中。,例:在3*5+4的LR分析过程中增加了语义栈后的语法制导的实现过程。,LR分析表,文法,启示:,在刚才的翻译过程中有如下特点:句柄归约在先,语义动作在后。归约时,栈内句柄各符号的语义信息与该句柄同时出栈,整个句柄所表示的语义信息则赋给相应产生式左部非终结符的语义变量,并让该非终结符及其语义变量同时入栈。为了在某处调用语义动作,就必须先归约,因此,
11、有时需要改写文法。,常见语句的语法制导翻译,高级语言的两大类语句:说明语句:用于定义各种形式的有名实体及其 属性,如常量、变量、数组、记录(结构)、过程、子程序等。可执行语句:用于完成程序指定的功能。语义处理也按两大类处理:(1)说明语句的处理:把说明语句中定义的名字和属性登记在符号表中,用以检查名字的引用和说明是否一致,以便在翻译可执行语句时使用。一般说明语句的语义处理不生成目标代码,过程说明和动态数组的说明有相应的代码。(2)可执行语句:首先根据各源语句的语法结构和语义设计它的目标代码结构,找出源与目标的对应关系,然后根据语义规则进行翻译,生成四元式序列。,语义翻译过程中涉及的数据结构,语
12、义翻译过程中涉及的数据结构有符号表、四元式表和临时变量区。符号表:语义翻译过程中,在产生四元式时,通常不使用变量的名字,而是使用它们在符号表中的入口位置,一般用ENTRY(i)表示变量i在符号表中的入口。因此语义子程序需要查阅符号表,而在翻译说明语句时需要填写符号表中的相关项。四元式表:四元式表是按翻译过程中四元式产生的顺序组成的。通常设置一个专门的过程GENCODE(OP,ARG1,ARG2,Ti)来产生一个四元式,将该四元式输出到四元式列表中,并使四元式的编号加1。临时变量区:用于存放翻译过程中建立的临时语义变量。假设过程newt用来生成临时变量,每调用一次,生成一个新的临时变量,第一次调
13、用生成的是T1,第二次调用生成T2,说明语句的翻译,说明语句的作用:就是说明类型等属性信息,在翻译时主要是填符号表说明语句分多种,此处举例两种的翻译:变量说明语句的翻译常量说明语句的翻译,变量说明语句的翻译,.变量说明语句的文法描述,.变量说明语句的翻译,例如:var a,b,c:integer;,策略:先翻译第,产生式,再翻译,产生式,以便记录的类型,即在写程序时,读完一个说明语句,开始归约,再开始翻译,变量的类型朝前传递。,.翻译的语义动作,符号表:,FILL(entry(i),Type)表示将类型Type填入符号表中,entry(i)表示变量名i在符号表中的入口,VAR id1,id2,
14、id3:integer;的归约过程,常量说明语句的翻译,.常量说明语句的文法描述,.常量说明语句的翻译,策略:和变量说明一样,先翻译后面的产生式,再翻译前面的产生式,以便在归约时,执行语义动作,将常量的值、类型、种属填入符号表。,例:,Constant A=123,.翻译的语义动作,将常量INT在符号表中的入口或值直接填入常量符号i所指符号表的VAL栏,将常数的类型填入符号表的Type栏,3,4产生式的翻译与5,6产生式的翻译相同1,2产生式没有语义动作,将常数的种属填入符号表的Kind栏,可执行语句的翻译,定义的一些语义变量和过程GENCODE(OP,ARG1,ARG2,RESULT):语义
15、过程,产生一个四元式,并填入四元式表,编号自动增1。NEWT:函数,返回一个临时变量序号。在翻译可执行语句的过程中,可能需要使用临时变量,假定用NEWT过程来申请临时变量Ti,每申请一次,i增1。ENTRY(i):函数,查找变量i的入口地址;检查id.name是否在符号表中,如在则返回一指向该登陆项的指针,否则返回NULLE.PLACE:与给终结符E相联系的语义变量,可能是某变量的入口地址,或者为临时变量序号。,简单赋值语句的翻译,.简单赋值语句的文法描述,2.简单赋值语句的代码结构,例如:x:=2+3*2;,3.简单赋值语句的翻译 此处只假定是整数运算,例:赋值句A:=B+C*(-D)的自底
16、向上分析,因此,四元式表中增加了4条四元式:,简单算术表达式和赋值语句的翻译,(1)Sid:=E p:=lookup(id,name);if pnil then emit(p:=E.place)else error(2)EE1+E2 E.place:=newtemp;emit(E.place:=E1.place+E2.place)(3)EE1*E2 E.place:=newtemp;emit(E.place:=E1.place*E2.place)(4)E-E1 E.place:=newtemp;emit(E.place:=uminus E1.place)(5)E(E1)E.place:=E1.
17、place)(6)Eid p:=lookup(id,name);if pnil then E.place:=p else error,张素琴编编译原理(清华大学版),布尔表达式的翻译,1.布尔表达式的基本概念布尔表达式是将布尔运算符(and、or、not)作用到布尔变量或关系表达式上组成的表达式。关系表达式形如E1 rop E2,其中E1和E2是算术表达式,rop表示关系运算符、或。Sample语言规定布尔运算符的优先级从高到低为not、and、or,and和or都是左结合。2.布尔表达式的两个基本作用用作布尔赋值语句中的布尔运算。用作控制语句如if-then、if-then-else、whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理课程教案 编译 原理 课程 教案 中间 代码 生成
链接地址:https://www.31ppt.com/p-5903748.html