欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx

    • 资源ID:34121372       资源大小:330.59KB        全文页数:71页
    • 资源格式: PPTX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx

    语义分析语义分析(fnx)(fnx)与中间代码生成与中间代码生成第一页,共七十一页。语义分析的位置语义分析的位置(wi zhi)(wi zhi)和作用和作用紧跟在语法分析和语法分析之后,编译程序要做的工紧跟在语法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译作就是进行静态语义检查和翻译(fny)。编译器必须要检查源程序是否符合源语言规定的语法编译器必须要检查源程序是否符合源语言规定的语法和语义要求。这种检查称为静态检查,检查并报告程和语义要求。这种检查称为静态检查,检查并报告程序中某些类型的错误。序中某些类型的错误。语法分析器语法分析器记号流记号流类型检查器类型检查器语法树语法树中间代码中间代码生成器生成器语法树语法树中间表示中间表示第二页,共七十一页。静态静态(jngti)(jngti)语义检查语义检查静态语义检查通常包括:静态语义检查通常包括:类型类型(lixng)检查:如果操作符作用于不相容的操作数,检查:如果操作符作用于不相容的操作数,编译器应该报错编译器应该报错控制流检查:引起控制流从某个结构中跳转出来的语控制流检查:引起控制流从某个结构中跳转出来的语句必须能够决定控制流转向的目标地址句必须能够决定控制流转向的目标地址唯一性检查:有时,有的对象只能被定义一次。比如,唯一性检查:有时,有的对象只能被定义一次。比如,同一同一case语句的标号不能相同,枚举类型的元素不能语句的标号不能相同,枚举类型的元素不能重复。重复。与名字相关的检查:有时候要求同一名字在特定位置与名字相关的检查:有时候要求同一名字在特定位置出现两次或多次(如,标识结构的开始和结尾)出现两次或多次(如,标识结构的开始和结尾)第三页,共七十一页。中间中间(zhngjin)(zhngjin)语言语言第四页,共七十一页。源语言的中间表示源语言的中间表示(biosh)(biosh)方法方法抽象语法树抽象语法树后缀式后缀式三地址代码(包括三元式、四元三地址代码(包括三元式、四元(s yun)式、间接三元式)式、间接三元式)DAG图表示图表示第五页,共七十一页。后缀后缀(huzhu)(huzhu)式式后缀式表示又称逆波兰表示法。后缀式表示又称逆波兰表示法。这种表示法是:把运算量(操作数)写在前面,把算符写在后面这种表示法是:把运算量(操作数)写在前面,把算符写在后面(后缀)。(后缀)。一个表达式的后缀形式可以如下定义:一个表达式的后缀形式可以如下定义:如果如果E是一个变量或常量,则是一个变量或常量,则E的后缀式是的后缀式是E自身自身如果如果E是是E1opE2形式的表达式,这里形式的表达式,这里op是任何二元操作符,则是任何二元操作符,则E的后缀的后缀式为式为E1E2op。这里。这里E1和和E2分别是分别是E1和和E2的后缀式。的后缀式。如果如果E是是(E1)形式的表达式,则形式的表达式,则E1的后缀式就是的后缀式就是E的后缀式的后缀式这种表示法用不着使用括号。这种表示法用不着使用括号。只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都能对它正确能对它正确(zhngqu)的进行唯一分解的进行唯一分解第六页,共七十一页。后缀后缀(huzhu)(huzhu)式式表达式翻译为后缀式的语义规则表达式翻译为后缀式的语义规则(guz)描述:描述:其中其中E.code表示表示E的后缀式,的后缀式,op表示任何二元操作符,表示任何二元操作符,“|”表表示后缀形式的连接示后缀形式的连接产生式产生式语义规则语义规则EE1 op E2E.code := E1.code | E2.code | opE(E1) E.code := E1.codeEidE.code := id第七页,共七十一页。图表示法图表示法图表示法主要包括图表示法主要包括DAG( Directed Acyclic Graph )与抽象语法树与抽象语法树语法树描述了源程序的自然层次结构。语法树描述了源程序的自然层次结构。DAG以更紧凑的形式给出了相同的信以更紧凑的形式给出了相同的信息。两者不同息。两者不同(b tn)的是:的是:在一个在一个DAG中代表公共子表达式的结点具有多个父结点中代表公共子表达式的结点具有多个父结点在一颗抽象语法树中公共子表达式被表示为重复的子树。在一颗抽象语法树中公共子表达式被表示为重复的子树。assign+a*uminusbcuminusbca:= b*-c + b*-cassign+a*uminusbcabc uminus * bc numinus *+ assign第八页,共七十一页。抽象抽象(chuxing)(chuxing)语法树语法树语法树中的边不会显式的出现在后缀表达式中,可以根据结点出现的顺序及结点语法树中的边不会显式的出现在后缀表达式中,可以根据结点出现的顺序及结点上的操作符所要求的操作数的个数来恢复。其恢复过程类似使用上的操作符所要求的操作数的个数来恢复。其恢复过程类似使用(shyng)栈对后缀栈对后缀表达式求值。表达式求值。如果函数如果函数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.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)代码代码三地址代码是下列一般形式的语句序列三地址代码是下列一般形式的语句序列x := y op z其中,其中,x、y和和z是名字,常量或编译器生成的临时变量是名字,常量或编译器生成的临时变量op代表任何操作符(定点运算符、浮点运算符、逻辑运算符等)代表任何操作符(定点运算符、浮点运算符、逻辑运算符等)这里不允许组合的算术表达式,因为语句右边只有一个这里不允许组合的算术表达式,因为语句右边只有一个(y )操作符。操作符。像像x+y*z这样的表达式要翻译为如下;这样的表达式要翻译为如下;T1 := y * zT2 := x + T1其中其中T1 ,T2为编译时产生的临时变量。为编译时产生的临时变量。第十一页,共七十一页。三地址三地址(dzh)(dzh)代码代码这种复杂算术表达式和嵌套控制流语句的拆解使得三这种复杂算术表达式和嵌套控制流语句的拆解使得三地址码适用于目标代码生成及优化。地址码适用于目标代码生成及优化。由程序计算出来的中间值的名字的使用使得三地址码由程序计算出来的中间值的名字的使用使得三地址码容易被重排列容易被重排列而不像后缀表达式那样而不像后缀表达式那样三地址码可以三地址码可以(ky)看成是语法树或看成是语法树或DAG的线性表示。的线性表示。三地址码的得名原因是每条语句通常包含三个地址,三地址码的得名原因是每条语句通常包含三个地址,两个是操作数地址,一个是结果地址。两个是操作数地址,一个是结果地址。在实际的实现中,有程序员定义的名字被一个指向改在实际的实现中,有程序员定义的名字被一个指向改名字的符号表表项的指针所代替。名字的符号表表项的指针所代替。第十二页,共七十一页。三地址码三地址码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)代码。语句可以代码。语句可以由符号标号,而且存在各种控制流语句。由符号标号,而且存在各种控制流语句。符号标号代表存放中间代码的数组中三地址代码语句符号标号代表存放中间代码的数组中三地址代码语句的下标。下面列出本书中使用的三地址语句的种类:的下标。下面列出本书中使用的三地址语句的种类:形如形如x:= y op z的赋值语句,其中的赋值语句,其中op为二元算术算符或为二元算术算符或逻辑算符逻辑算符形如形如x:= op y的赋值语句,其中的赋值语句,其中op为一元算符。为一元算符。形如形如x:= y的复制语句,将的复制语句,将y的值赋给的值赋给x形如形如goto L的无条件跳转语句,即下一条将被执行的的无条件跳转语句,即下一条将被执行的语句是带有标号语句是带有标号L的三地址语句的三地址语句第十四页,共七十一页。三地址三地址(dzh)(dzh)语句的类型语句的类型下面列出本书中使用的三地址语句的种类:下面列出本书中使用的三地址语句的种类:形如形如if x relop y goto L或或 if a goto L的条件跳转语句。的条件跳转语句。第一种形式使用关系运算符号第一种形式使用关系运算符号relop(等)等)第二种第二种a为布尔变量或常量为布尔变量或常量用于过程调用的语句用于过程调用的语句param x和和call p, n,以及返回语句,以及返回语句return y。源程序中的。源程序中的过程调用过程调用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的地址和指针赋值。的地址和指针赋值。设计中间代码形式时,运算符的选择是非常重要的。设计中间代码形式时,运算符的选择是非常重要的。算符种类应足以用来实现源语言中的运算算符种类应足以用来实现源语言中的运算(yn sun)。一个小型算符集合较易于在新的目标机器上实现。一个小型算符集合较易于在新的目标机器上实现。局限的指令集合会使某些源语言运算表示成中间形式局限的指令集合会使某些源语言运算表示成中间形式时代码加长,需要在目标代码生成时做较多的优化工时代码加长,需要在目标代码生成时做较多的优化工作。作。第十六页,共七十一页。生成三地址码的生成三地址码的S-S-属性属性(shxng)(shxng)文法文法S具有综合属性具有综合属性S.code,代表赋值语句,代表赋值语句S的三地址码的三地址码非终结符非终结符E有如下性质:有如下性质:E.place表示存放表示存放E值的名字值的名字E.code表示对表示对E求值的三地址语句序列求值的三地址语句序列函数函数(hnsh)newtemp的功能是每次调用它时,将返回一的功能是每次调用它时,将返回一个不同临时变量的名字。如个不同临时变量的名字。如T1,T2,.用用gen(x := y + z)表示生成三地址语句表示生成三地址语句x:=y+z。在实际实现中,三地址码可能被送到输出文件中,而在实际实现中,三地址码可能被送到输出文件中,而不是生成不是生成code属性。属性。第十七页,共七十一页。生成生成(shn chn)(shn chn)三地址码的三地址码的S-S-属性文法属性文法产生式产生式语义规则语义规则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.place := 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) | 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 yun)(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域。域。条件和无条件语句将目标标号存入条件和无条件语句将目标标号存入result域。域。临时变量也要填入符号表中。临时变量也要填入符号表中。第二十一页,共七十一页。三元三元(sn yun)(sn yun)式式为了避免为了避免(bmin)把临时变量填入符号表,我们可以通过把临时变量填入符号表,我们可以通过计算这个临时变量的语句的位置来引用这个临时变量。计算这个临时变量的语句的位置来引用这个临时变量。这样三地址代码的记录只需要三个域这样三地址代码的记录只需要三个域op, arg1和和arg。对于一目运算符对于一目运算符op, arg1和和arg2只需用其一。我们可只需用其一。我们可以随意选用一个。以随意选用一个。第二十二页,共七十一页。四元四元(s yun)(s yun)式举例式举例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)(jin ji)三元式三元式为了便于代码优化处理,有时不直接使用三元式表,为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将运算而是另设一张指示器(称为间接码表),它将运算(yn sun)的先后顺序列出有关三元式在三元表中的位置。的先后顺序列出有关三元式在三元表中的位置。换句话说,我们用一张间接码表辅以三元式表的办法换句话说,我们用一张间接码表辅以三元式表的办法来表示中间代码。这种表示方法称为间接三元式。来表示中间代码。这种表示方法称为间接三元式。第二十五页,共七十一页。间接三元间接三元(sn yun)(sn yun)式举例式举例X:=(A+B)*C Y:=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)时,时,只需重新安排间接码表,无需改动三元式表只需重新安排间接码表,无需改动三元式表对于间接三元式表示,语义规则中应增添产生间接码对于间接三元式表示,语义规则中应增添产生间接码表的动作,并且在向三元式表填进一个三元式之前,表的动作,并且在向三元式表填进一个三元式之前,必须先查看一下此式是否已在其中,就无须填入。必须先查看一下此式是否已在其中,就无须填入。第二十六页,共七十一页。表示方法表示方法(fngf)(fngf)比较:间址的使用比较:间址的使用三元式与四元式的差异可以看作在表示中引入了多少间址。三元式与四元式的差异可以看作在表示中引入了多少间址。使用四元式表示,定义或使用临时变量的三地址语句可通过符号表直接使用四元式表示,定义或使用临时变量的三地址语句可通过符号表直接(zhji)访问该临时变量的地址访问该临时变量的地址使用四元式的一个更重要的好处体现在优化编译器中。在三元式中,使用四元式的一个更重要的好处体现在优化编译器中。在三元式中,如果要移动一条临时值的语句需要改变如果要移动一条临时值的语句需要改变arg1和和arg2数组中对该语句的数组中对该语句的引用。引用。间接三元式没有上述问题。间接三元式没有上述问题。间接三元式看上去和四元式非常相似,他们都需要大约相同的存储间接三元式看上去和四元式非常相似,他们都需要大约相同的存储空间,并且对代码重新排序的效率相同。空间,并且对代码重新排序的效率相同。对于普通三元式,必须将对那些临时变量的存储分配推迟到代码对于普通三元式,必须将对那些临时变量的存储分配推迟到代码生成阶段。生成阶段。第二十七页,共七十一页。说明说明(shumng)(shumng)语句语句第二十八页,共七十一页。声明声明(shngmng)(shngmng)语句引起的翻译动作语句引起的翻译动作当过程或程序块内部的声明语句当过程或程序块内部的声明语句(yj)被考察的时候,被考察的时候,我们需要为我们需要为局部局部于该过程的名字分配存储空间。于该过程的名字分配存储空间。对每个局部名字,都将在符号表中创建一个表项,对每个局部名字,都将在符号表中创建一个表项,填写类型、相对存储地址等相关信息填写类型、相对存储地址等相关信息相对地址指相对于静态数据区基址或活动记录基址的偏相对地址指相对于静态数据区基址或活动记录基址的偏移量移量单个过程中的声明语句单个过程中的声明语句允许嵌套过程中的声明语句允许嵌套过程中的声明语句第二十九页,共七十一页。单个过程中的声明单个过程中的声明(shngmng)(shngmng)语句语句变量和过程设计变量和过程设计设置全局变量:设置全局变量:offset,跟踪下一个可用的相对,跟踪下一个可用的相对(xingdu)地址地址过程过程enter(name, type, offset)为名字建立符号表表项为名字建立符号表表项综合属性综合属性type和和width说明非终结符说明非终结符T的类型及宽度(或该类型的对象所占用的内存数。的类型及宽度(或该类型的对象所占用的内存数。Poffset:=0 DDD;DDid:Tenter(id.name, T.type, offset); offset:=offset + T.width TintegerT.type := integer; T.width := 4 TrealT.type := real; T.width := 8Tarraynumof T1T.type := array(num.val, T1.type); T.width :=num.val * T1.widthTT1T.type := pointer(T1.type); T.width := 4Poffset:=0 DPMDD offset:=0第三十页,共七十一页。允许允许(ynx)(ynx)嵌套过程中的声明语句嵌套过程中的声明语句PMDaddwidth(top(tblptr),top(offset); pop(tblptr); pop(offset)Mt=mktable(nil); push(t, tblptr);push(0, offset) DD1;D2Dproc id; N D1 ;St := top(tblptr); addwidth(t, top(offset); pop(tblptr); pop(offset); enterproc(top(tblptr), id.name, t) Did :Tenter(top(tblptr),id.name,T.type, top(offset); top(offset := top(offset) + T.widthN t:= mktable(top(tblptr); push(t, tblptr), push(0,offset)M的动作用于初始化栈的动作用于初始化栈tblptr,将相对,将相对地址地址0压入栈压入栈offset当出现当出现(chxin)一个过程声明时,一个过程声明时,N的的动作和动作和M的动作基本相同的动作基本相同对每个变量声明,不改变对每个变量声明,不改变tblptr,但是,但是要改变要改变offset的栈顶指针。的栈顶指针。第三十一页,共七十一页。记录记录(jl)(jl)中的域名中的域名当看到关键字当看到关键字record之后,与标记之后,与标记L相关联的动作为相关联的动作为域名创建一个新的符号表。指向该符号表的指针被压域名创建一个新的符号表。指向该符号表的指针被压入栈入栈tblptr,相对,相对(xingdu)地址地址0被压入栈被压入栈offset。Trecord D endTrecord L D endT.type := record (top(tblptr); T.width:=top(offset); pop(tblptr); pop(offset)Lt=mktable(nil); push(t, tblptr);push(0, offset) 第三十二页,共七十一页。赋值语句赋值语句(yj)(yj)第三十三页,共七十一页。赋值语句赋值语句(yj)(yj)赋值语句中表达式的类型赋值语句中表达式的类型整型整型实型实型数组数组记录记录(jl)将赋值语句转换为三地址码要做的工作将赋值语句转换为三地址码要做的工作在符号表中查找名字在符号表中查找名字存取数组及记录中的元素存取数组及记录中的元素第三十四页,共七十一页。符号表中的名字符号表中的名字(mng zi)(mng zi)lookup 操作支持最近嵌套原则。操作支持最近嵌套原则。其上下文是由前面定义的过程其上下文是由前面定义的过程(guchng),当作用于,当作用于name时,时,需要先检查需要先检查name是否已经在符是否已经在符号表中定义过了。号表中定义过了。PMDMDD1;D2| Dproc id; N D1 ;S | Did :TN Sid := Ep:=lookup(id.name); if p nuil then emit(p := E.place) else errorEE1 + E2E.place := newtemp; emit(E.place := E1.place + E2.place E E1 * E2E.place := newtemp; emit(E.place := E1.place * E2.place E-E1 E.place := newtemp; emit(E.place := uminus E1.place E (E1)emit(E.place := E1.place Eidp := lookup(id.name); if p nil then E.place := p; else error第三十五页,共七十一页。寻址数组元素寻址数组元素(yun s)(yun s)如果数组元素存放在连续如果数组元素存放在连续(linx)的存储块中,数组元素的存储块中,数组元素可以迅速的访问。每个数组元素的宽度是可以迅速的访问。每个数组元素的宽度是w,则,则一维数组一维数组Ai的地址:的地址:base+(i-low)*w二维数组二维数组Ai1,i2的地址:的地址:base + (i1-low1)*n2+i2-low2)*w,可以改写为可以改写为(i1*n2)+i2)*w+(base-(low1*n2)+low2)*w)多维数组多维数组Ai1,i2, ik的地址:的地址:(i1n2+i2)*n3+i3)nk+ik)*w+base-(low1n2+low2)*n3+low3)nk+lowk)*w第三十六页,共七十一页。将数组名与最左边的下标表达式连在一起。使得产生式允许将符号表中指将数组名与最左边的下标表达式连在一起。使得产生式允许将符号表中指向数组名表项的指针作为向数组名表项的指针作为(zuwi)Elist的综合属性的综合属性array进行传递。进行传递。(i1n2+i2)n3+i3)nm+im)使用如下递归公式计算:使用如下递归公式计算:e1 = i1em = em-1*nm+imL有两个属性,有两个属性,L.place和和L.offset,当,当L是简单名字时,是简单名字时,L.place是指向符号是指向符号表中该名字表项的指针,而表中该名字表项的指针,而L.offset是是nullLidElist | idElistElist, E | ELElist | idElistElist, E | idE第三十七页,共七十一页。数组元素寻址的翻译数组元素寻址的翻译(fny)(fny)模式模式如果如果L是简单名字是简单名字(mng zi),则生成一般的赋值,否则生成对,则生成一般的赋值,否则生成对L所指位置的索引赋值。所指位置的索引赋值。(1) SL := E if L.offset = null thenemit(L.place := E.place); else emit(L.place L.offset := E.place)(2) EE1 + E2E.place := newtemp; emit(E.place := E1.place + E2.place)(3) E(E1)E.place := E1.place(4) ELif L.offset =null thenE.place := L.place else beginE.place := newtemp;emit(E.place := L.place L.offset 0 end(1) SL := E(2) EE + E(3) E(E)(4) EL(5) LElist(6) Lid(7) ElistElist,E(8) Elist idE第三十八页,共七十一页。数组元素数组元素(yun s)(yun s)寻址的翻译模式寻址的翻译模式(5) LElist L.place := newtemp; L.offset := newtemp; emit(L.place := c(Elist.array) emit(L.offset := Elist.place * width(Elist.array)(6) LidL.place := id.place; L.offset :=null(7) ElistElist1 ,E)t:=E.place := E1.place m := Elist1.ndim +1; emit(t := Elist1.place * limit(Elist1.arry,m); emit(t := t + E.place); Elist.array := Elist1.array; Elist.place := t; Elist.ndim :=m(8) ElistidEElist.arry := id.place; Elist.place := E.place; Elist.ndim :=1(1) SL := E(2) EE + E(3) E(E)(4) EL(5) LElist(6) Lid(7) ElistElist,E(8) Elist idE第三十九页,共七十一页。赋值语句赋值语句(yj)(yj)中的类型转换中的类型转换变量和常量有许多不同的类型,因而编译器或者拒绝变量和常量有许多不同的类型,因而编译器或者拒绝某种混合类型的操作,或者生成适当的强制某种混合类型的操作,或者生成适当的强制(qingzh)(类型转换)指令。(类型转换)指令。假设有两种类型:假设有两种类型:EE1 + E2E.type := if E1.type = integer and E2.type= integer then integer else real第四十页,共七十一页。赋值语句赋值语句(yj)(yj)中的类型转换中的类型转换(1) SL := E(2) EE + E(3) E(E)(4) EL(5) LElist(6) Lid(7) ElistElist,E(8) Elist idEE.Place := newtemp;if E1.type = integer and E2.type = integer then begin emit(E.place := E1.place int+ E2.place); E.type := integerendelse if E1.type = real and E2.type = real then begin emit(E.place := E1.place real+ E2.place); E.type := realendelse if E1.type = integer and E2.type = real then begin u:=newtemp; emit(u := inttoreal E1.place; emit(E.place := u real+ E2.place); E.type := realendelse if E1.type = real and E2.type = integer then begin u:=newtemp; emit(u := inttoreal E2.place; emit(E.place := E1.place real+ u); E.type := realendelse E.type := type_error;第四十一页,共七十一页。布尔表达式的翻译布尔表达式的翻译(fny)(fny)第四十二页,共七十一页。布尔表达式的作用布尔表达式的作用(zuyng)(zuyng)用作计算逻辑值用作计算逻辑值用作控制语句(如用作控制语句(如if语句,语句,while语句等)语句等)布尔表达式和关系表达式布尔表达式和关系表达式布尔表达式是用布尔运算符作用到布尔变量布尔表达式是用布尔运算符作用到布尔变量(binling)或或关系表达式上而组成的。(关系表达式上而组成的。(not、and、or)关系表达式是有关系运算符连接的算术表达式关系表达式是有关系运算符连接的算术表达式第四十三页,共七十一页。布尔表达式值的计算布尔表达式值的计算(j sun)(j sun)如同计算算术表达式一样,一步不差如同计算算术表达式一样,一步不差(b ch)的从表达式的从表达式各部分的值计算出整个表达式的值各部分的值计算出整个表达式的值采用优化措施计算布尔表达式的值采用优化措施计算布尔表达式的值计算计算A or B时,如果时,如果A为真,则不用计算为真,则不用计算B,结果为真,结果为真计算计算A and B时,如果时,如果A为假,不用计算为假,不用计算B,结果为假,结果为假一般的计算公式如下:一般的计算公式如下:A or B:if A then true else BA and B:if A then B else falsenot A:if A then false else true第四十四页,共七十一页。用上述两种方法把布尔表达式翻译成地址用上述两种方法把布尔表达式翻译成地址(dzh)(dzh)代码代码EE1 or E2E.place := newtemp; emit(E.place := E1.place or E2.place E E1 and E2E.place := newtemp; emit(E.place := E1.place and E2.place Enot E1E.place := newtemp; emit(E.place := not E1.place E (E1)E.place := E1.place Eid1 relop id2E.place := newtemp;emit(if id1.place relop.op id2.place goto nextstat+3);emit(E.place := 0);emit(goto nextstat+2);emit(E.place := 1)EidE.plece := id.placeab or cd and ef100: if ab goto 103107: T2:=1101: T1 := 0108: if ef goto 111102: goto 104109: T3:=0103: T1:= 1110: goto 112104: if cc or bc goto L2goto L1L1: if bd goto L2goto L3L2:(S1的三地址码序列的三地址码序列(xli)goto LnestL3:(S2的三地址码序列的三地址码序列)Lnext:第四十六页,共七十一页。产生布尔表达式三地址产生布尔表达式三地址(dzh)(dzh)代码的语义规则代码的语义规则函数函数newlabel产生新的符号标号产生新的符号标号if E then S1 else S2。假定假定E形如形如ab,则将生成如下,则将生成如下E的代码:的代码:if ab goto E.truegoto E.false对于上述翻译的讨论:对于上述翻译的讨论:如果如果E为为E1 or E2,如果,如果E1为真,则立即可知为真,则立即可知E为真,为真,于是于是E1.true与与E.true是相同的;若是相同的;若E1为假,则必须对为假,则必须对E2求值,因此我们求值,因此我们(w men)置置E1.false为为E2的代码的第一条的代码的第一条指令的标号,而指令的标号,而E2的真假出口可以分别与的真假出口可以分别与E的真假出的真假出口相同。口相同。第四十七

    注意事项

    本文(最新【考研计算机专业课】天津大学 编译原理PPT课件 Part7语义分析与中间代码生成(共71张PPT课件).pptx)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开