语法制导翻译生成中间代码.ppt
《语法制导翻译生成中间代码.ppt》由会员分享,可在线阅读,更多相关《语法制导翻译生成中间代码.ppt(117页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第四章第四章 语法制导翻译生成中间代码语法制导翻译生成中间代码语法制导翻译是处理语义的基本方法,它以语法分析为基础,在语法分析得到语言结构的结果时,对附着于此结构的语义进行处理,如计算表达式的值、生成中间代码等。与语法分析部分的讨论不同,本章的内容更注重于实际方法的讨论。主要内容包括:1.语法制导翻译的基本概念2.中间代码简介3.符号表简介4.典型声明语句与可执行语句的翻译5.上机:DBMS的设计与实现SQL的执行24.1 语法制导翻译简介语法制导翻译简介F语法与语义语法与语义1.语法与语义的关系语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意,即语言的“意义”。语义
2、不能离开语法独立存在;语义远比语法复杂;同一语言结构可包含多种含意,不同语言结构可表示相同含意;语法与语义之间没有明确的界线。例1猫吃老鼠与老鼠吃猫,晒被子与晒太阳例2程序设计语言中的分情况结构34.1 语法制导翻译简介语法制导翻译简介caseconditioniscase1:stat1;case2:stat2;.endcase;2.语义分析的两个作用检查是否结构正确的句子所表示的意思也合法;执行规定的语义动作,如:表达式求值符号表填写中间代码生成等3.语义分析的方法语法制导翻译switch(condition)casecondition1:stat1;casecondition2:stat2
3、;.break;break;44.1 语法制导翻译简介语法制导翻译简介F属性与语义规则属性与语义规则 1.语法制导翻译的基本思想通俗地讲,以语法分析为基础,伴随语法分析的各个步骤,执行相应的语义动作。具体方法:将文法符号所代表的语言结构的意思,用附着于该文法符号的属性属性表示;用语义规则语义规则规定产生式所代表的语言结构之间的关系(即属性之间的关系),即用语义规则实现属性计算。语义规则的执行:在语法分析的适当时刻(如推导或归约)执行附着在对应产生式上的语义规则,以实现对语言结构语义的处理,如计算、查填符号表、生成中间代码、发布出错信息等。54.1 语法制导翻译简介语法制导翻译简介2.属性的抽象
4、表示.attr如:E.val(值),E.type(类型),E.code(代码序列),E.place(存储空间)3.对文法的约定只关注语法分析基础上的语义处理,忽略语法分析。为了简单,讨论的文法一般为二义文法。默认解决二义的方法是规定常规意义下的优先级和结合性。4.属性的定义定义定义4.1对于产生式A,其中是由文法符号X1X2.Xn组成的序列,它的语义规则可以表示为(4.1)所示关于属性的函数:b:=f(c1,c2,.,ck)(4.1)64.1 语法制导翻译简介语法制导翻译简介b:=f(c1,c2,.,ck)(4.1)语义规则中的属性存在下述性质与关系。若b是A的属性,c1,c2,.,ck是中文
5、法符号的属性,或者A的其它属性,则称b是A的综合属性综合属性。若b是中某文法符号Xi的属性,c1,c2,.,ck是A的属性,或者是中其它文法符号的属性,则称b是Xi的继承属性继承属性。称(4.1)中属性b依赖于依赖于属性c1,c2,.,ck。若语义规则的形式如下述(4.2),则可将其想像为产生式左部文法符号A的一个虚拟属性虚拟属性。属性之间的依赖关系,在虚拟属性上依然存在。f(c1,c2,.,ck)(4.2)(4.1)中属性之间的依赖关系,实质上反映了属性计算的先后次反映了属性计算的先后次序序,即所有属性ci被计算之后才能计算属性b。74.1 语法制导翻译简介语法制导翻译简介F语义规则的两种形
6、式语义规则的两种形式1.语法制导定义用抽象抽象属性和运算符号表示的语义规则(公式,做什么)2.翻译方案用具体具体属性和运算表示的语义规则(程序段,如何做)语义规则也被习惯上称为语义动作。忽略实现细节,二者作用等价。语法制导定义适用于设计阶段设计阶段,翻译方案适用于实实现阶段现阶段。84.1 语法制导翻译简介语法制导翻译简介例4.1将中缀形式的算术表达式转换为后缀表示。其语法制导定义和翻译方案可分别表示如下。其中print(E.post)是L的虚拟属性,可以想象为L.p:=print(E.post)。翻译方案中的.lexval表示词法分析返回的记号num的值。产生式产生式语法制导定义语法制导定义
7、翻译方案翻译方案1翻译方案翻译方案2LEprint(E.post)print_post(post);EE1+E2E.post:=E1.post|E2.post|+;post(k):=+;k:=k+1;print(+);EnumE.post:=num.lexval;post(k):=lexval;k:=k+1;print(lexval);语法制导定义:算法 翻译方案:程序实现,方法不唯一94.1 语法制导翻译简介语法制导翻译简介翻译方案中需要考虑的问题:采用什么样的语法分析方法,不同的分析方法对语义处理的次序不同;为属性分配存储空间;考虑计算次序。翻译方案1,自下而上计算,LR分析。以3+5+8
8、为例,归约时翻译。产生式产生式翻译方案翻译方案1LEprint_post(post);EE1+E2 post(k):=+;k:=k+1;Enumpost(k):=lexval;k:=k+1;post:(35+8+)104.1 语法制导翻译简介语法制导翻译简介3.属性作为分析树的注释将属性附着在分析树对应文法符号上,形成注释分析树注释分析树。例4.23+5+8的分析树和注释分析树:产生式产生式语法制导定义语法制导定义翻译方案翻译方案2LEprint(E.post)EE1+E2E.post:=E1.post|E2.post|+;print(+);EnumE.post:=num.lexval;pri
9、nt(lexval);.post=3.post=5.post=8.post=35+.post=35+8+(print(35+8+)114.1 语法制导翻译简介语法制导翻译简介4.注释分析树上看继承属性与综合属性 继承属性是自上而下计算的综合属性是自下而上计算的提醒:除非特别提醒,本章讨论的语法制导翻译是综合属性综合属性。.post=3.post=5.post=8.post=35+.post=35+8+(print(35+8+)12上次课总结上次课总结F语法制导翻译的基本概念属性与语义规则语义规则的两种形式134.1 语法制导翻译简介语法制导翻译简介FLR分析翻译方案的设计分析翻译方案的设计LR
10、分析中的语法制导翻译实质上是对LR语法分析的扩充:扩充扩充LR分析器的功能分析器的功能:当执行归约产生式的动作时,也执行产生式对应的语义动作。由于是归约时执行语义动作,限制语义动作仅能放在产生式右部的最右边;扩充分析栈扩充分析栈:增加一个与分析栈并列的语义栈,用于存放分析栈中文法符号所对应的属性值。例如:EE1+E2valtop:=valtop+valtop+2;对于表达式5+3当归约为左部E时同时也得到了值814例4.33+5*8的语法制导翻译。产生式LEEE1+E2EE1*E2En分析栈分析栈 语义栈语义栈输入输入语义动作语义动作#3+5*8#shift#n#3+5*8#En,valtop
11、:=lexval#E#3+5*8#shift#E+#3?5*8#shift#E+n#3?5*8#En,valtop:=lexval#E+E#3?5*8#shift#E+E*#3?5?8#shift#E+E*n#3?5?8#En,valtop:=lexval#E+E*E#3?5?8#EE1*E2,valtop:=valtop*valtop+2#E+E#3?40#EE1+E2,valtop:=valtop+valtop+2#E#43#acc翻译方案print(valtop);valtop:=valtop+valtop+2;valtop:=valtop*valtop+2;valtop:=lexval
12、;语法制导定义print(E.val)E.val:=E1.val+E2.val;E.val:=E1.val*E2.val;E.val:=n.lexval;154.1 语法制导翻译简介语法制导翻译简介F递归下降分析翻译方案的设计递归下降分析翻译方案的设计递归下降方法是用程序实现对非终结符的展开和对终结符的匹配。翻译方案的设计需要解决两个问题:1.如何在递归下降子程序中嵌入语义动作?产生式右部的任何位置;2.如何为文法符号的属性设计存储空间?函数返回值、参数、变量等。例如在上机作业中,函数绘图语言解释器语法制导翻译设计:1.递归子程序可以设计为函数,用于返回必要的属性值;2.适当设计子程序中的临时
13、变量,用于保存属性值;3.将语义动作嵌入在子程序的适当位置,正确计算属性值。164.2 中间代码简介中间代码简介1.编译器各阶段的完整输出,均可以被认为是源程序的某种中间表示。2.本章讨论的是中间代码生成器输出的中间表示,称之为中间代码。3.中间代码实际上应起一个编译器前端与后端分水岭的作用。4.要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化:便于语法制导翻译;既与机器指令的结构相近,又与具体机器无关。5.中间代码的主要形式:树、后缀式、三地址码等。174.2 中间代码简介中间代码简介F后缀式后缀式操作数在前,操作符紧随其后,无需用括号限制运算的优先级和结合性。算法算法4.1 后
14、缀式计算采用下述过程进行计算,最终结果留在栈中。x:=first_token;whilenotend_of_exploopifxinoperatorsthenpushx;-操作数进栈elsepop(operators);-算符,弹出操作数push(evaluate);-计算,将结果进栈endif;next(x);endloop;184.2 中间代码简介中间代码简介loopifxinoperatorsthenpushx;-操作数进栈elsepop(operators);-算符,弹出操作数push(evaluate);-计算,将结果进栈endif;next(x);endloop;算术表达式3+5+
15、8的后缀式为35+8+。#35+8+#push(3)#35+8+#push(3)#35+8+#pop(3和5),push(3+5)#88+#push(8)#88+#pop(8和8),push(8+8)#16#194.2 中间代码简介中间代码简介后缀式并不局限于二元运算的表达式,可以推广到任何语句,遵守操作数在前,操作符紧跟其后的原则即可。对语句:if e then x else y后缀式可以写为:e x y if-then-else(1)此时e、x和y均需计算。实际上,根据条件e的取值,x和y不用都计算:e p1 jez x p2 jump p1:y p2:(2)其中:p1和p2分别是标号;p
16、1jez表示e的结果为0(假)则转向p1;p2jump表示无条件转向p2。与(1)比较,(2)中的if-then-else被分解,首先计算e,根据e的结果是否为真,决定计算x还是计算y。204.2 中间代码简介中间代码简介F三地址码三地址码1.三地址码的直观表示语法:result:=arg1oparg2或result:=oparg1或oparg1语义:结果存放在result中的二元运算arg1oparg2结果存放在result中一元运算oparg1一元运算oparg1赋值句x:=a+b*c的三地址码序列:T1:=b*cT2:=a+T1x:=T2214.2 中间代码简介中间代码简介2.三地址码的
17、种类序号三地址码四元式(1)x:=yopz(op,y,z,x)(2)x:=opy(op,y,x)(3)x:=y(:=,y,x)(4)gotoL(j,L)(5)ifxgotoL(jnz,x,L)(6)ifxrelopygotoL(jrelop,x,y,L)(7)paramx(param,x)(8)calln,P(call,n,P)(9)returny(return,y)(10)x:=yi(=,yi,x)(11)xi:=y(=,y,xi)(12)x:=&y(=&,y,x)(13)x:=*y(=*,y,x)(14)*x:=y(*=,y,x)224.2 中间代码简介中间代码简介3.三地址码的实现:三元
18、式与四元式三元式三元式(i)(op,arg1,arg2)三地址码(i):=arg1oparg2例4.5表达式x:=a+b*c的三元式:(1)(*,b,c)(2)(+,a,(1)(3)(:=,x,(2)序号的双重含义序号的双重含义:既代表此三元式,又代表三元式存放的结果存放方式存放方式:数组结构,三元式在数组中的位置由下标决定。弱点弱点:给代码的优化带来困难。因为代码优化常使用的方法是删除某些代码或移动某些代码位置,而一旦进行了代码的删除或移动,则表示某三元式的序号会发生变化,从而使得其他三元式中对原序号的引用无效。234.2 中间代码简介中间代码简介语法制导翻译设计的基本步骤1.文法符号属性的
19、设计2.必要的基本操作(函数等)的设计3.语义规则的设计三元式的语法制导翻译1.属性.code:三元式代码,指示标识符的存储单元或三元式表中的序号;2.属性.name:标识符的名字;3.函数trip(op,arg1,arg2):生成一个三元式,返回三元式的序号;4.函数entry(id.name):返回标识符在符号表中的位置或存储位置。244.2 中间代码简介中间代码简介产生式语义规则(1)Aid:=EA.code:=trip(:=,entry(id.name),E.code)(2)EE1+E2E.code:=trip(+,E1.code,E2.code)(3)EE1*E2E.code:=tr
20、ip(*,E1.code,E2.code)(4)E(E1)E.code:=E1.code(5)E-E1E.code:=trip(,E1.code,)(6)EidE.code:=entry(id.name)例4.6生成x:=a+b*c的三元式(LR分析)254.2 中间代码简介中间代码简介四元式四元式是对三元式的改进,将表示计算结果的三元式序号用一个显式的变量表示,从而避免了三元式的值与三元式在三元组中的位置相关的弱点。四元式的语法:(op,arg1,arg2,result)所表示的计算:result:=arg1oparg2四元式的特点:1.四元式与三元式的唯一区别:将由序号所表示的运算结果改为
21、由临时变量来表示。2.此改进使得四元式的运算结果与其位置无关,为代码优化提供了极大方便:可以删除或移动四元式而不影响运算结果。3.三地址码与四元式形式的保持一致。四元式的种类三元式(i)(op,arg1,arg2)(i):=arg1oparg2264.2 中间代码简介中间代码简介四元式的语法制导翻译1.属性.code:表示存放运算结果的变量;2.函数newtemp:返回一个新的临时变量,如T1,.等;3.过程emit(op,arg1,arg2,result):生成一个四元式,若为一元运算,则arg2可空。产生式与语义规则:(1)Aid:=EA.code:=newtemp;emit(:=,ent
22、ry(id.name),E.code,A.code)(2)EE1+E2E.code:=newtemp;emit(+,E1.code,E2.code,E.code)(3)EE1*E2E.code:=newtemp;emit(*,E1.code,E2.code,E.code)(4)E(E1)E.code:=E1.code(5)E-E1E.code:=newtemp;emit(,E1.code,E.code)(6)EidE.code:=entry(id.name)274.2 中间代码简介中间代码简介F图形表示图形表示1.树作为中间代码语法树真实反映句子结构,对语法树稍加修改(加入语义信息),即可以作
23、为中间代码的一种形式(注释语法树)。例4.8赋值句x:=(a+b)*(a+b)的树的中间代码表示:三元式:三元式:(1)(+,a,b)(2)(+,a,b)(3)(*,(1),(2)(4)(:=,x,(3)四元式:四元式:(1)(+,a,b,T1)(2)(+,a,b,T2)(3)(*,T1,T2,T3)(4)(:=,x,T3,T4)284.2 中间代码简介中间代码简介2.树的语法制导翻译属性.nptr:指向树节点的指针;函数mknode(op,nptr1,nptr2):生成一个根或内部节点,节点数据是op,nptr1和nptr2分别指向的左右孩子的子树。若仅有一个孩子,则nptr2为空;函数mk
24、leaf(node):生成一个叶子节点。(1)Aid:=EA.nptr:=mknode(:=,mkleaf(entry(id.name),E.nptr)(2)EE1+E2E.nptr:=mknode(+,E1.nptr,E2.nptr)(3)EE1*E2E.nptr:=mknode(*,E1.nptr,E2.nptr)(4)E(E1)E.nptr:=E1.nptr(5)E-E1E.nptr:=mknode(,E1.nptr,)(6)EidE.nptr:=mkleaf(entry(id.name)三元式、四元式与树的语义规则设计是相似的。三元式、四元式与树的语义规则设计是相似的。294.2 中间
25、代码简介中间代码简介3.树的优化表示DAG如果树上若干个节点有完全相同的孩子,则这些节点可以指向同一个孩子,形成一个有向无环图(DirectedAcyclicGraph,DAG),与树的唯一区别唯一区别是多个父亲可以共享同一个孩子,从而达到资源(运算、代码等)共享的目的。DAG的语法制导翻译与树的语法制导翻译相似,仅需要在mknode和mkleaf中增加相应的查询功能:先查看所要构造的节点是否已经存在,若存在则无需构造新的节点,直接返回指向已存在节点的指针即可。304.2 中间代码简介中间代码简介4.树与其他中间代码的关系树表示的中间代码与后缀式和三地址码之间有内在联系:对树进行深度优先后序遍
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法 制导 翻译 生成 中间 代码
限制150内