最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx
《最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx》由会员分享,可在线阅读,更多相关《最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、语义分析语义分析(fnx)(fnx)与中间代码生成与中间代码生成第一页,共七十一页。语义分析的位置语义分析的位置(wi zhi)(wi zhi)和作用和作用紧跟在语法分析和语法分析之后,编译程序要做的工紧跟在语法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译作就是进行静态语义检查和翻译(fny)。编译器必须要检查源程序是否符合源语言规定的语法编译器必须要检查源程序是否符合源语言规定的语法和语义要求。这种检查称为静态检查,检查并报告程和语义要求。这种检查称为静态检查,检查并报告程序中某些类型的错误。序中某些类型的错误。语法分析器语法分析器记号流记号流类型检查器类型检查器语法树语
2、法树中间代码中间代码生成器生成器语法树语法树中间表示中间表示第二页,共七十一页。静态静态(jngti)(jngti)语义检查语义检查静态语义检查通常包括:静态语义检查通常包括:类型类型(lixng)检查:如果操作符作用于不相容的操作数,检查:如果操作符作用于不相容的操作数,编译器应该报错编译器应该报错控制流检查:引起控制流从某个结构中跳转出来的语控制流检查:引起控制流从某个结构中跳转出来的语句必须能够决定控制流转向的目标地址句必须能够决定控制流转向的目标地址唯一性检查:有时,有的对象只能被定义一次。比如,唯一性检查:有时,有的对象只能被定义一次。比如,同一同一case语句的标号不能相同,枚举类
3、型的元素不能语句的标号不能相同,枚举类型的元素不能重复。重复。与名字相关的检查:有时候要求同一名字在特定位置与名字相关的检查:有时候要求同一名字在特定位置出现两次或多次(如,标识结构的开始和结尾)出现两次或多次(如,标识结构的开始和结尾)第三页,共七十一页。中间中间(zhngjin)(zhngjin)语言语言第四页,共七十一页。源语言的中间表示源语言的中间表示(biosh)(biosh)方法方法抽象语法树抽象语法树后缀式后缀式三地址代码(包括三元式、四元三地址代码(包括三元式、四元(s yun)式、间接三元式)式、间接三元式)DAG图表示图表示第五页,共七十一页。后缀后缀(huzhu)(huz
4、hu)式式后缀式表示又称逆波兰表示法。后缀式表示又称逆波兰表示法。这种表示法是:把运算量(操作数)写在前面,把算符写在后面这种表示法是:把运算量(操作数)写在前面,把算符写在后面(后缀)。(后缀)。一个表达式的后缀形式可以如下定义:一个表达式的后缀形式可以如下定义:如果如果E是一个变量或常量,则是一个变量或常量,则E的后缀式是的后缀式是E自身自身如果如果E是是E1opE2形式的表达式,这里形式的表达式,这里op是任何二元操作符,则是任何二元操作符,则E的后缀的后缀式为式为E1E2op。这里。这里E1和和E2分别是分别是E1和和E2的后缀式。的后缀式。如果如果E是是(E1)形式的表达式,则形式的
5、表达式,则E1的后缀式就是的后缀式就是E的后缀式的后缀式这种表示法用不着使用括号。这种表示法用不着使用括号。只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都能对它正确能对它正确(zhngqu)的进行唯一分解的进行唯一分解第六页,共七十一页。后缀后缀(huzhu)(huzhu)式式表达式翻译为后缀式的语义规则表达式翻译为后缀式的语义规则(guz)描述:描述:其中其中E.code表示表示E的后缀式,的后缀式,op表示任何二元操作符,表示任何二元操作符,“|”表表示后缀形式的连接示后缀形式的连接产生式产生式语义规则语义规则EE1
6、 op E2E.code := E1.code | E2.code | opE(E1) E.code := E1.codeEidE.code := id第七页,共七十一页。图表示法图表示法图表示法主要包括图表示法主要包括DAG( Directed Acyclic Graph )与抽象语法树与抽象语法树语法树描述了源程序的自然层次结构。语法树描述了源程序的自然层次结构。DAG以更紧凑的形式给出了相同的信以更紧凑的形式给出了相同的信息。两者不同息。两者不同(b tn)的是:的是:在一个在一个DAG中代表公共子表达式的结点具有多个父结点中代表公共子表达式的结点具有多个父结点在一颗抽象语法树中公共子表
7、达式被表示为重复的子树。在一颗抽象语法树中公共子表达式被表示为重复的子树。assign+a*uminusbcuminusbca:= b*-c + b*-cassign+a*uminusbcabc uminus * bc numinus *+ assign第八页,共七十一页。抽象抽象(chuxing)(chuxing)语法树语法树语法树中的边不会显式的出现在后缀表达式中,可以根据结点出现的顺序及结点语法树中的边不会显式的出现在后缀表达式中,可以根据结点出现的顺序及结点上的操作符所要求的操作数的个数来恢复。其恢复过程类似使用上的操作符所要求的操作数的个数来恢复。其恢复过程类似使用(shyng)栈对
8、后缀栈对后缀表达式求值。表达式求值。如果函数如果函数mknode(op, child)和和mknode(op, left, right)尽可能返回一个指向一个存在尽可能返回一个指向一个存在的结点的指针以代替建立新的结点,那么就会生成的结点的指针以代替建立新的结点,那么就会生成DAG图。图。产生式产生式语义规则语义规则Sid := ES.nptr := mknode(assign, mkleaf(id, id.place), E.nptr) EE1 + E2E.nptr := mknode(+ , E1.nptr, E2.nptr) EE1 * E2E.nptr := mknode(* , E1
9、.nptr, E2.nptr)E- E1E.nptr := mknode(uminus, E1.nptr) E(E1)E.nptr := E1.nptr EidE.nptr := mkleaf(id , id.place)第九页,共七十一页。抽象语法抽象语法(yf)(yf)树的表示形式树的表示形式assignida+*uminusuminusidbidbidcidc0idb1idc2uminus13*024idb5idc6uminus57*468+379ida10assign9811第十页,共七十一页。三地址三地址(dzh)(dzh)代码代码三地址代码是下列一般形式的语句序列三地址代码是下列一
10、般形式的语句序列x := y op z其中,其中,x、y和和z是名字,常量或编译器生成的临时变量是名字,常量或编译器生成的临时变量op代表任何操作符(定点运算符、浮点运算符、逻辑运算符等)代表任何操作符(定点运算符、浮点运算符、逻辑运算符等)这里不允许组合的算术表达式,因为语句右边只有一个这里不允许组合的算术表达式,因为语句右边只有一个(y )操作符。操作符。像像x+y*z这样的表达式要翻译为如下;这样的表达式要翻译为如下;T1 := y * zT2 := x + T1其中其中T1 ,T2为编译时产生的临时变量。为编译时产生的临时变量。第十一页,共七十一页。三地址三地址(dzh)(dzh)代码
11、代码这种复杂算术表达式和嵌套控制流语句的拆解使得三这种复杂算术表达式和嵌套控制流语句的拆解使得三地址码适用于目标代码生成及优化。地址码适用于目标代码生成及优化。由程序计算出来的中间值的名字的使用使得三地址码由程序计算出来的中间值的名字的使用使得三地址码容易被重排列容易被重排列而不像后缀表达式那样而不像后缀表达式那样三地址码可以三地址码可以(ky)看成是语法树或看成是语法树或DAG的线性表示。的线性表示。三地址码的得名原因是每条语句通常包含三个地址,三地址码的得名原因是每条语句通常包含三个地址,两个是操作数地址,一个是结果地址。两个是操作数地址,一个是结果地址。在实际的实现中,有程序员定义的名字
12、被一个指向改在实际的实现中,有程序员定义的名字被一个指向改名字的符号表表项的指针所代替。名字的符号表表项的指针所代替。第十二页,共七十一页。三地址码三地址码assign+a*uminusbcuminusbcassign+a*uminusbct1 := -ct2 := b * t1t3 := -ct4 := b * t3t5 := t2 + t4a := t5t1 := -ct2 := b * t1t3 := t2 + t2a := t3第十三页,共七十一页。三地址语句三地址语句(yj)(yj)的类型的类型三地址语句类似于汇编语言三地址语句类似于汇编语言(hu bin y yn)代码。语句可以代
13、码。语句可以由符号标号,而且存在各种控制流语句。由符号标号,而且存在各种控制流语句。符号标号代表存放中间代码的数组中三地址代码语句符号标号代表存放中间代码的数组中三地址代码语句的下标。下面列出本书中使用的三地址语句的种类:的下标。下面列出本书中使用的三地址语句的种类:形如形如x:= y op z的赋值语句,其中的赋值语句,其中op为二元算术算符或为二元算术算符或逻辑算符逻辑算符形如形如x:= op y的赋值语句,其中的赋值语句,其中op为一元算符。为一元算符。形如形如x:= y的复制语句,将的复制语句,将y的值赋给的值赋给x形如形如goto L的无条件跳转语句,即下一条将被执行的的无条件跳转语
14、句,即下一条将被执行的语句是带有标号语句是带有标号L的三地址语句的三地址语句第十四页,共七十一页。三地址三地址(dzh)(dzh)语句的类型语句的类型下面列出本书中使用的三地址语句的种类:下面列出本书中使用的三地址语句的种类:形如形如if x relop y goto L或或 if a goto L的条件跳转语句。的条件跳转语句。第一种形式使用关系运算符号第一种形式使用关系运算符号relop(等)等)第二种第二种a为布尔变量或常量为布尔变量或常量用于过程调用的语句用于过程调用的语句param x和和call p, n,以及返回语句,以及返回语句return y。源程序中的。源程序中的过程调用过
15、程调用p(x1,x2,xn):param x1param x2param x2call p, n n表示表示(biosh)实参个数。实参个数。return y中中y为过程返回的一个值为过程返回的一个值第十五页,共七十一页。三地址三地址(dzh)(dzh)语句的类型语句的类型下面列出本书中使用的三地址语句的种类:下面列出本书中使用的三地址语句的种类:形如形如x := yi及及xi := y的索引赋值。的索引赋值。形如形如x := &y, x := *y和和*x := y的地址和指针赋值。的地址和指针赋值。设计中间代码形式时,运算符的选择是非常重要的。设计中间代码形式时,运算符的选择是非常重要的。
16、算符种类应足以用来实现源语言中的运算算符种类应足以用来实现源语言中的运算(yn sun)。一个小型算符集合较易于在新的目标机器上实现。一个小型算符集合较易于在新的目标机器上实现。局限的指令集合会使某些源语言运算表示成中间形式局限的指令集合会使某些源语言运算表示成中间形式时代码加长,需要在目标代码生成时做较多的优化工时代码加长,需要在目标代码生成时做较多的优化工作。作。第十六页,共七十一页。生成三地址码的生成三地址码的S-S-属性属性(shxng)(shxng)文法文法S具有综合属性具有综合属性S.code,代表赋值语句,代表赋值语句S的三地址码的三地址码非终结符非终结符E有如下性质:有如下性质
17、:E.place表示存放表示存放E值的名字值的名字E.code表示对表示对E求值的三地址语句序列求值的三地址语句序列函数函数(hnsh)newtemp的功能是每次调用它时,将返回一的功能是每次调用它时,将返回一个不同临时变量的名字。如个不同临时变量的名字。如T1,T2,.用用gen(x := y + z)表示生成三地址语句表示生成三地址语句x:=y+z。在实际实现中,三地址码可能被送到输出文件中,而在实际实现中,三地址码可能被送到输出文件中,而不是生成不是生成code属性。属性。第十七页,共七十一页。生成生成(shn chn)(shn chn)三地址码的三地址码的S-S-属性文法属性文法产生式
18、产生式语义规则语义规则Sid := ES.code := E.code | gen(id.place := E.place) EE1 + E2E.place := newtemp;E.code := E1.code | E2.code | gen(E.place := E1.place + E2.place) EE1 * E2E.place := newtemp;E.code := E1.code | E2.code | gen(E.place := E1.place * E2.place) E- E1E.place := newtemp;E.code := E1.code | gen(E.p
19、lace := uminus E1.place) E(E1)E.place := E1.place E.code := E1.codeEidE.place := id.place E.code := 第十八页,共七十一页。如何加入如何加入(jir)(jir)控制语句控制语句SWhile E do S1SWhile E do S1对应对应(duyng)的语义规则是:的语义规则是:S.begin := newlabel;S.after := newlabel;S.code := gen(S.begin :) | E.code | gen(if E.place = 0 goto S.after) |
20、 S1.code | gen(goto S.begin) | gen(S.after :)E.codeif E.place = 0 goto S.afterS1.codegoto S.beginS.begin:S.begin:第十九页,共七十一页。三地址语句三地址语句(yj)(yj)的实现的实现三地址语句是中间代码的一种抽象形式。三地址语句是中间代码的一种抽象形式。这些语句可以以带有操作符和操作数域的记录这些语句可以以带有操作符和操作数域的记录(jl)来来实现。四元式、三元式及简介三元式是三种这样的表实现。四元式、三元式及简介三元式是三种这样的表示。示。第二十页,共七十一页。四元四元(s yu
21、n)(s yun)式式一个一个(y )四元式是带有四个域的记录结构,这四个域四元式是带有四个域的记录结构,这四个域分别称为分别称为op, arg1, arg2及及result。域域op包含一个代表运算符的内部码包含一个代表运算符的内部码三地址语句三地址语句x:=y op z通过将通过将y放入放入arg1,z放入放入arg2,并且将并且将x放入放入result,:=为算符。为算符。像像x:=y或或x:=-y这样的一元操作符语句不使用这样的一元操作符语句不使用arg2像像param这样的运算符仅使用这样的运算符仅使用arg1域。域。条件和无条件语句将目标标号存入条件和无条件语句将目标标号存入res
22、ult域。域。临时变量也要填入符号表中。临时变量也要填入符号表中。第二十一页,共七十一页。三元三元(sn yun)(sn yun)式式为了避免为了避免(bmin)把临时变量填入符号表,我们可以通过把临时变量填入符号表,我们可以通过计算这个临时变量的语句的位置来引用这个临时变量。计算这个临时变量的语句的位置来引用这个临时变量。这样三地址代码的记录只需要三个域这样三地址代码的记录只需要三个域op, arg1和和arg。对于一目运算符对于一目运算符op, arg1和和arg2只需用其一。我们可只需用其一。我们可以随意选用一个。以随意选用一个。第二十二页,共七十一页。四元四元(s yun)(s yun
23、)式举例式举例oparg1arg2result(0)uminuscT1(1)*bT1T2(2)uminuscT3(3)*bT3T4(4)+T2T4T5(5)assignT5aoparg1arg2(0)uminusc(1)*b0(2)uminusc(3)*b2(4)+13(5)assigna4a := b * -c + b * -c第二十三页,共七十一页。三元三元(sn yun)(sn yun)式举例式举例oparg1arg2(0)=xi(1)assign(0)yoparg1arg2(0)=yi(1)assignx(0)xi := yx := yi第二十四页,共七十一页。间接间接(jin ji)
24、(jin ji)三元式三元式为了便于代码优化处理,有时不直接使用三元式表,为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将运算而是另设一张指示器(称为间接码表),它将运算(yn sun)的先后顺序列出有关三元式在三元表中的位置。的先后顺序列出有关三元式在三元表中的位置。换句话说,我们用一张间接码表辅以三元式表的办法换句话说,我们用一张间接码表辅以三元式表的办法来表示中间代码。这种表示方法称为间接三元式。来表示中间代码。这种表示方法称为间接三元式。第二十五页,共七十一页。间接三元间接三元(sn yun)(sn yun)式举例式举例X:=(A+B)*C Y:=
25、D(A+B)oparg1arg2(1)+AB(2)*(1)C(3):=X(2)(4)D(1)(5):=Y(4)间接间接(jin ji)(jin ji)代码代码(1)(2)(3)(1)(4)(5)(1)(2)(3)(1)(4)(5)当在代码优化过程中需要调整运算顺序当在代码优化过程中需要调整运算顺序(shnx)(shnx)时,时,只需重新安排间接码表,无需改动三元式表只需重新安排间接码表,无需改动三元式表对于间接三元式表示,语义规则中应增添产生间接码对于间接三元式表示,语义规则中应增添产生间接码表的动作,并且在向三元式表填进一个三元式之前,表的动作,并且在向三元式表填进一个三元式之前,必须先查看
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考研计算机专业课 最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成共71张PPT课件 最新 考研 计算机 专业课 天津大学 编译 原理 PPT 课件 Part7
链接地址:https://www.taowenge.com/p-34121372.html
限制150内