【教学课件】第八章语法制导翻译和中间代码生成.ppt
《【教学课件】第八章语法制导翻译和中间代码生成.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第八章语法制导翻译和中间代码生成.ppt(126页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章语法制导翻译和中间代码生成8.1概述8.2属性文法和语法制导翻译8.3语义分析8.4中间代码8.5一些语句的翻译概述语义处理程序设计语言的语义静态语义是对程序约束的描述,这些约束无法通过抽象语法规则来妥善地描述,实质上就是语法规则的良形式条件,它可以分为类型规则和作用域/可见性规则两大类类型相容性变量先声明后引用名称相关要求动态语义程序单位描述的计算编译程序的语义处理工作静态语义审查解释执行动态语义(计算)生成代码.语语 法法 分分 析析 后后 的的 源源 程程 序序 语义处理语义处理概述语义形式化语义建模文法模型-属性文法命令式或操作式模型-操作语义学应用式模型-指称语义学公理式模型-
2、公理语义学属性文法属性文法表达式文法ET+T|TorTTn|b ET1+T2 T1.type=int T2.type=T1.type E.type:=int E T1 or T2 T1.type=bool T2.type=T1.type E.type:=bool T n T.type:=int T b T.type:=bool 操作语义描述一段程序的含义是通过执行该段程序所改变的计算机(虚拟计算机)状态来反映。这个计算机的状态与程序执行时的状态相对应:包括变量的所有值,可执行程序本身,各种系统定义的内部数据结构。计算机里所有的寄存器的值和存储单元的值作为计算机的状态,用一组形式定义的操作来说明
3、执行一条指令相应的状态怎样变化。For(expr1;expr2;expr3)expr1;.Loop:ifexpr2=0goto outexpr3;gotoloopout:.公理语义一个语言的每个语法成分的含义定义为公理和演绎规则,用于推导出该成分执行的效果。公理语义概念是随着程序正确性的证明而发展的。当正确性证明能构造时表明程序执行它的规格说明所描述的计算。在一个证明中,每一个语句之前之后都有一个逻辑表达式对程序的变量进行约束,以此说明这个语句的含义。一般的记号PSQ如果在语句S执行前P为真,则在语句S执行并终止后Q为真。演绎规则的例子规则前驱后继赋值:x:=exprP(expr)x:=exp
4、rP(x)While:PBSPPwhileBdoSendP(notB)if-then-elseBPS1Q,(notB)PS2QPifBthenS1elseS2Q指称语义指称语义的基本概念是给每一段程序实体定义一个数学意义上的对象,和一个从实体实例向数学意义对象的映射的函数特点:特点:不但对全部程序赋予全文而且对程序设计语法每一个语法成分短语(表达式,命令,声明)都给予含义。每一个语法成分(短语)的含义是以它的自成分的含义的术语来定义的。即语义结构平行于语法结构。语义函数:语义函数:程序设计语言的语义利用映射函数来证明。语义函数将短语映射到它的指称。例:例:二进制数语言110或10101语法实体
5、指称(自然数)6或21语义实体二进制数文法Numeral:=0:=1:=Numeral0:=Numeral1自然数Natrual=0,1,2,3,语义函数Valuation:NumeralNaturalValuation101表示把Valuation施用于101ValuationN-把它施用于N定义定义:Valuation(用四个方程)因为有四个形式numeralValuation00Valuation11ValuationN02ValuationNValuationN12ValuationN+1所以:所以:Valuation110=2Valuation11=2(2Valuation1+1)=
6、2(21+1)=6属性文法和语法制导翻译虽然形式语义学(如指称语义学、公理语义学、操作语义学等)的研究已取得了许多重大的进展,但目前在实际应用中比较流行的语义描述和语义处理的方法主要还是属性文法和语法制导翻译方法属性文法属性文法(attributegrammar)是一个三元组:A=(G,V,F),其中G:是一个上下文无关文法V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息,如它的类型、值、代码序列、符号表内容等等.属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。F:关于属性的属性断言或一组属性的计算规则(称为语义规则).断言或语义
7、规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性.属性有两种属性有两种 继承的和综合的属性属性通常分为两类:综合属性和继承属性。简单地说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给定的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算或者由生计算器的参数提供。AX1X2XnA的综合属性,计算S(A):=f(I(X1),I(Xn)Xj的继承属性,计算T(Xj):=f(I(A),.I(Xn)1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性.2)终结符只有
8、综合属性.在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条规则的形式为b:=f(c1,c2ck)这里,f是一个函数,而且或者(1)b是A的一个综合属性并且c1,c2ck是产生式右边文法符号的属性;或者(2)b是产生式右边某个文法符号的一个继承属性并且c1,c2ck是A或产生式右边任何文法符号的属性。在两种情况下,我们都说属性b依赖于属性c1,c2ck。一个属性文法的例子例8.1非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性,它的值由词法分析器提供。与产生式LEn对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,我们可认为这条规则定义了L的
9、一个虚属性。某些非终结符加下标是为了区分一个产生式中同一非终结符多次出现语义规则LEEE1+TETTT1*FTFF(E)FdigitPrint(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.valF.valT.val:=F.valF.val:=E.valF.val:=digit.lexval产生式设表达式为35+4,则语义动作打印数值19.LE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3
10、*5+4的带注释的分析树的带注释的分析树继承属性一个结点的继承属性值是由此结点的父结点和/或兄弟结点的某些属性来决定的。例8.2继承属性继承属性L.in生产式语义规则DTLTintTrealLL1,idLidL.in:=T.typeT.type=integerT.type:=realL1.in:=L.inaddtype(id.entry,L.in)addtype(id.entry,L.in)DL.in=realL.in=realL.in=realT.type=realrealid2id1id3.Real id1,id2,id3,例8.3P DSD var V;D|S V:=E;S|V x|y|
11、z现在使用两个属性,现在使用两个属性,name和和dl,每当一个新的变量声明时,就把它的,每当一个新的变量声明时,就把它的name属性附给它,属性附给它,name属性是综合属性。属性是综合属性。将所声明的变量都放到一个变量名字清单中(用语义函数将所声明的变量都放到一个变量名字清单中(用语义函数addlist实现),用实现),用属性属性dl综合声明块中声明的所有变量。然后这个综合声明块中声明的所有变量。然后这个dl属性又作为继承属性传属性又作为继承属性传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在变到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在变量名字清单中量名字清
12、单中 P DS S.dl=D.dlD1 var V;D2|D1.dl=addlist(V.name,D2.dl)|D1.dl=NULLS1 V:=E;S2|check(V.name,S1.dl);S2.dl=S1.dlV x|y|z V.name=x|V.name=y|V.name=zvarx;vary;x:=e;PDdl=x,ySdl=x,yvarV;Ddl=yV:=e;SxvarV;Ddl=yy语法制导的翻译一个翻译翻译是符号串对的一个集合。在一个编译程序定义的翻译中,符号串对是源程序和目标程序。各个编译阶段定义一个翻译,词法分析:(字符串,单词串)语法分析:(单词串,语法树)代码生成(语
13、法树,汇编语言)设是输入字母表且是输出字母表。定义由语言L1*到语言L2*的一个翻译是由*到*的一个关系T,使得T的定义域为L1且T的值域为L2。使(x,y)T的句子y叫做x的一个输出.语法制导的翻译直观地说,一个语法制导翻译的基础是一个文法,其中翻译成分依附在每一产生式上。例8.4:下列翻译模式,它定义翻译,即对每个输入x,其输出y是x的逆转。定义此翻译的规则是产生式产生式翻译规则翻译规则(1)s0s(2)s1s(3)s(1)s=s0(2)s=s1(3)s=输入输出对可由(,)表示,其中是输入句子形式而是输出句子形式。(S,S)开始用产生式s0s来扩展得到(0S,S0).再用一次规则(1),
14、得到(00S,S00)。再用规则(2),就得到(001S,S100).然后应用规则(3)并得到(001,100)。例8.5:把下述产生式定义的算术表达式映射到后缀波兰表示:EE+TETTTFTFF(E)FaE=ET+E=TT=TFT=FF=EF=a产生式翻译规则翻译规则确定输入a+aa的输出:(E,E)(E+T,ET+)(T+T,TT+)(F+T,FT+)(a+T,aT+)(a+TF,aFF+)(a+FF,aFF+)(a+aF,aaF+)(a+aa,aaa+)定义:定义:一个语法制导的翻译模式是一个五元组一个语法制导的翻译模式是一个五元组T=(N,,R,S),其中其中 (1)N是非终结符的有限
15、集。是非终结符的有限集。(2)是有限的输入字母表。是有限的输入字母表。(3)是有限的输出字母表。是有限的输出字母表。(4)R是形如是形如A,的规则的有限集的规则的有限集,其中其中(N )*,(N )*且且 中那组非终结符是中那组非终结符是 中中那那组非终结符的置换。组非终结符的置换。(5)S是是N中一个特别的非终结符,即开始符。中一个特别的非终结符,即开始符。定义:定义:若若T=(N,R,S)是是SDTS,(T)则称为语法制导的则称为语法制导的翻译翻译(SDT),文法,文法Gi=(N,P,S),其中,其中P=A|A,属于属于R),称为,称为SDTS T的基础(或的基础(或输入)文法。文法输入)
16、文法。文法G0=(N,P,S),,其中,其中P =A|A,属于属于R,称为,称为T的输出文法。的输出文法。把语法制导的翻译方法看成是将输入文法把语法制导的翻译方法看成是将输入文法Gi中的中的推导树变换成输出文法推导树变换成输出文法G0中的推导树。给了输入句子中的推导树。给了输入句子x,可以按如下方式得到,可以按如下方式得到x的一个翻译:先为推导的一个翻译:先为推导x构造构造一棵推导树,再变换该树到输出文法中的一棵树,然一棵推导树,再变换该树到输出文法中的一棵树,然后取此输出树的边缘作为后取此输出树的边缘作为x的一个翻译。的一个翻译。语义制导翻译中的规则A,对应于每一个文法产生式A都有与之相关联
17、的一套语义描述属性文法(attributegrammar)是一个三元组:A=(G,V,F)属性文法可以看作是关于语言翻译的高级规范说明,其中隐去实现细节,使用户从明确说明翻译顺序的工作中解脱出来语法制导翻译实现从概念上讲,语法制导翻译即基于属性文法的处理过程通常是这样的:对单词符号串进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算输入符号串分析树属性依赖图语义规则的计算顺序依赖图由称为依赖图的一个有向图描述分析树中的继承属性和属性中间的相互依赖关系。依赖图的构造算法:依赖图的构造算法:for分析树中每一个结点ndofor结点的文法符号的每一个属性ado
18、为a在依赖图中建立一个结点;for分析树中每一个结点ndofor结点n所用产生式对应的每一个语义规则b:=f(c1,c2,ck)do fori:=1tokdo从ci结点到b结点构造一条有向边依赖图-例8.2例8.2继承属性继承属性L.in生产式语义规则DTLTintTrealLL1,idLidL.in:=T.typeT.type=integerT.type:=realL1.in:=L.inaddtype(id.entry,L.in)addtype(id.entry,L.in)例8.2Real id1,id2,id3分析树的依赖图5678910T4DLLLRealtypeininin3entry
19、2entryentryid3id2id1.1依赖图中的结点由数字来标识。从代表T.type的结点4有一条有向边连到代表L.in的结点5,因为根据产生式ETL的语义规则L1.in=L.in,可知L1.in依赖于L.in,所以有两条向下的有向边分别进入结点7和9。每一个与L产生式有关的语义规则addtype(id.Entry,L.in)都产生一个虚属性,结点6、8和10都是为这些虚属性构造的。良定义的属性文法。很显然,一条求值规则只有在其各变元值均已求得的情况下才可以使用。但有时候可能会出现一个属性对另一个属性的循环依赖关系。从事贸易如,p、c1、c2都是属性,若有下求值规则:p:=f1(c1)、
20、c1:=f2(c2)、c2:=f3(p)时,就无法对p求值。如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为良定义的。为了设计编译程序,我们只处理良定义的属性文法。属性的计算顺序一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2,mk,使得边必须是从序列中前面的结点指向后面的结点。也就是说,如果mimj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。一个依赖图的任何拓扑排序都给出一个分析树中结点的语义规则计算的有效顺序。这就是说,在拓扑排序中,在一个结点,语义规则b:=f(c1,c2,ck)中的属性c1,c2,ck在计算b以前都是可用的。属性文法属性文法说明的翻译是很精
21、确的。最基本的文法用于建立输入符号说明的翻译是很精确的。最基本的文法用于建立输入符号串的分析树。依赖图如上面讨论的那样建立。从依赖图的拓扑排串的分析树。依赖图如上面讨论的那样建立。从依赖图的拓扑排序中,我们可以得到计算语义规则的顺序。用这个顺序来计算语序中,我们可以得到计算语义规则的顺序。用这个顺序来计算语义规则就得到输入符号串的翻译。义规则就得到输入符号串的翻译。例例8.2Real id1,id2,id3分析树的依赖图分析树的依赖图每一条边都是从序号较低的结点指向序号较高的结点。历此,依赖每一条边都是从序号较低的结点指向序号较高的结点。历此,依赖图的一个拓扑排序可以从低序号到高序号顺序写出。
22、从这个拓扑图的一个拓扑排序可以从低序号到高序号顺序写出。从这个拓扑排序中我们可以得到下列程序,用排序中我们可以得到下列程序,用an来代表依赖图中与序号来代表依赖图中与序号n的的结点有关的属性:结点有关的属性:a4:=reala5:=a4 addtype(id3,entry,a5);a7:=a5;addtype(id2,entry,a7)a9:=a7 addtype(id1,entry,a9)这些语义规则的计算将把这些语义规则的计算将把real类型填入到每个标识符对应的符号表类型填入到每个标识符对应的符号表项中。项中。属性计算方法树遍历的属性计算方法设语法树已经建立起了,并且树中已带有开始符号的
23、继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有属性。最常用的遍历方法是深度优先,从左到右的遍历方法。如果需要的话,可使用多次遍历(或称遍)。一遍扫描的处理方法与树遍历的属性计算文法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无无需构造实际的语法树。因为一遍扫描的处理方法与语法分析器的相互作用,它与下面两个因素密切相关:(1)所采用的语法分析方法(2)属性的计算次序。例:定义定点二进制数的CFG:(1)NSS(2)SSB(3)SB(4)B0(5)B1非终结符N表示整个二进制数的数值,综合属性v附加在N上:Nv非终结符
24、B表示一个二进制数字,它有自己的值v,但该值分配给N的值与它的位置有关,是与2成比例,比例因子f是从S继承的属性,所以:Bvf非终结符S表示一个二进制数字串,它也有值,但该值与串的位置有关,与f有关与串的长度l有关:Sfvl构造数值的属性断言可以如下:NvSf1v1l1Sf2v2l2v=v1+v2;f1=1;f2=2-l2SfvlSf1v1l1Bf2v2f1=2f;f2=f;v=v1+v2;l=l1+1Bfvl=1Bfv0v=01v=fNvSi1l1“”Si2l2v=i1+2-l2i2SilSi1l1Bi2i=2i1+i2;l=l1+1Bil=1Bi“0”i=0“1”i=1在某些情况下可用一遍
25、扫描实现属性文法的语义规则计算。也就是说在语法分析的同时完成语义规则的计算,无须明显地构造语法树或构造属性之间的依赖图。因为单遍实现对于编译效率非常重要具体的实现希望在单遍扫描中完成翻译具体的实现希望在单遍扫描中完成翻译研究怎样实现这种翻译器。一个一般的属性文法的翻译器可能是很难建立的,然而有一大类属性文法的翻译器是很容易建立的s-属性属性 适用于适用于自底向上的计算自底向上的计算 L-属性属性 适用于自顶向下的分析,也可用于自底向上。适用于自顶向下的分析,也可用于自底向上。S属性文法的自下而上计算S属性文法,它只含有综合属性。综合属性可以在分析输入符号串的同时自下而上的分析器来计算。分析器可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第八 语法 制导 翻译 中间 代码 生成
限制150内