语法制导翻译和中间代码生成 (2)幻灯片.ppt
《语法制导翻译和中间代码生成 (2)幻灯片.ppt》由会员分享,可在线阅读,更多相关《语法制导翻译和中间代码生成 (2)幻灯片.ppt(97页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、语法制导翻译和中间语法制导翻译和中间代码生成代码生成第1页,共97页,编辑于2022年,星期二在编译程序中使用了这样的一种技术,在编译程序中使用了这样的一种技术,就是在语法分析的同时进行语义分析的就是在语法分析的同时进行语义分析的工作,并同步地完成相应语句的翻译。工作,并同步地完成相应语句的翻译。这种技术就称为语法制导翻译。这种技术就称为语法制导翻译。第2页,共97页,编辑于2022年,星期二第第5章教学内容章教学内容属性文法的概念属性文法的概念;语法制导翻译的概念;语法制导翻译的概念;常用的中间代码形式常用的中间代码形式;程程序序设设计计语语言言的的语语法法结结构构的的自自底底向向上上的的语
2、法制导翻译方法。语法制导翻译方法。第3页,共97页,编辑于2022年,星期二一、属性文法一、属性文法属性文法是在上下文无关文法的基础上为每个文属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的法符号(终结符或非终结符)配备若干个相关的“值值”(称为属性)。这些属性代表与文法符号(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列相关的信息,例如它的类型、值、代码序列、符、符号表内容等等。属性和变量一样,可以进行计算和号表内容等等。属性和变量一样,可以进行计算和传递。传递。属性一般分为两类:综合属性和继承属性。简单属性一般分为两类:综合属性
3、和继承属性。简单的说,综合属性用于的说,综合属性用于“自下而上自下而上”传递信息,而传递信息,而继承属性用于继承属性用于“自上而下自上而下”传递信息。传递信息。第4页,共97页,编辑于2022年,星期二属性加工的过程即是语义处理的过程,对于文法属性加工的过程即是语义处理的过程,对于文法的每一个产生式都配备了一组属性的计算规则,的每一个产生式都配备了一组属性的计算规则,则称为语义规则。则称为语义规则。在一个属性文法中,对应于每个产生式在一个属性文法中,对应于每个产生式A A都有都有一套与之相关联的语义规则,每条语义规则的形式为:一套与之相关联的语义规则,每条语义规则的形式为:b:=f(c1,c2
4、,b:=f(c1,c2,ck),ck)这里这里f f是一个函数,而且或者是一个函数,而且或者(1 1)b b是是A A的一个综合属性并且的一个综合属性并且c1,c2,c1,c2,ckck是产生是产生式右边文法符号的属性;或者式右边文法符号的属性;或者(2 2)b b是产生式右边某个文法符号的一个继承属性是产生式右边某个文法符号的一个继承属性并且并且c1,c2,c1,c2,ckck是是A A或产生式右边任何文法符号或产生式右边任何文法符号的属性。的属性。在这两种情况下,属性在这两种情况下,属性b b依赖于属性依赖于属性c1,c2c1,c2,ck,ck。第5页,共97页,编辑于2022年,星期二要
5、特别强掉的是:要特别强掉的是:终结符只有综合属性,它由词法分析器提供;终结符只有综合属性,它由词法分析器提供;非终结符既可以有综合属性也可以有继承属非终结符既可以有综合属性也可以有继承属性,文法开始符号的所有继承属性作为属性性,文法开始符号的所有继承属性作为属性计算前的初始值。计算前的初始值。第6页,共97页,编辑于2022年,星期二一般来讲,对出现在产生式右边的继承一般来讲,对出现在产生式右边的继承属性和出现在产生式左边的综合属性都属性和出现在产生式左边的综合属性都必须提供一个计算规则,属性计算规则必须提供一个计算规则,属性计算规则中只能使用相应产生式的文法符号的属中只能使用相应产生式的文法
6、符号的属性,这有利于产生式范围内性,这有利于产生式范围内“封装封装”属属性的依赖性。然而,出现在产生式左边性的依赖性。然而,出现在产生式左边的继承属性和出现在产生式右边的综合的继承属性和出现在产生式右边的综合属性不由所给的产生式的属性计算规则属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规进行计算,它们由其它产生式的属性规则计算则计算,由属性计算器的参数提供。由属性计算器的参数提供。第7页,共97页,编辑于2022年,星期二语义规则所描述的工作可以包括属性计语义规则所描述的工作可以包括属性计算、静态语义检查、符号表操作、代码算、静态语义检查、符号表操作、代码生成等。语义规则
7、可能产生副作用(如生成等。语义规则可能产生副作用(如产生代码),也可能不是变元的严格函产生代码),也可能不是变元的严格函数(如某个规则给出可用的下一个数据数(如某个规则给出可用的下一个数据单元的地址)。这样的语义规则通常写单元的地址)。这样的语义规则通常写成过程调用,或过程段。成过程调用,或过程段。第8页,共97页,编辑于2022年,星期二综合属性综合属性在语法树中,一个结点的综合属性的值在语法树中,一个结点的综合属性的值由其子结点的属性值确定。因此,通常由其子结点的属性值确定。因此,通常使用自底向上的方法在每一个结点处使使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。仅仅使用语
8、义规则计算综合属性的值。仅仅使用综合属性的属性文法称用综合属性的属性文法称S S属性文法。属性文法。第9页,共97页,编辑于2022年,星期二继承属性继承属性在语法树中,一个结点的继承属性由此在语法树中,一个结点的继承属性由此结点的父结点和结点的父结点和/或兄弟结点的某些属性或兄弟结点的某些属性确定。用继承属性来表示程序语言结构确定。用继承属性来表示程序语言结构中的上下文依赖关系很方便。中的上下文依赖关系很方便。第10页,共97页,编辑于2022年,星期二属性文法的定义属性文法的定义【定定义义】一一个个属属性性文文法法AG是是一一个个四四元元组组,即即AG=(G,A,R,B),其中,其中G=(
9、N,T,S,P)是一个前后文无关文法;是一个前后文无关文法;A=X NT A(X)是一个属性的有限集合;是一个属性的有限集合;R=p P R(p)是是一一个个语语义义规规则则式式的的有有限限集合;集合;B=p P B(p)是一个条件的有限集合;是一个条件的有限集合;第11页,共97页,编辑于2022年,星期二属性文法的定义属性文法的定义并且并且满满足以下两个条件:足以下两个条件:1对对任任意意两两个个符符号号的的X和和Y,若若XY,则则A(X)A(Y)=;2对对于于任任何何在在L(G)的的句句子子所所对对应应的的语语法法树树上上出出现现的的符符号号X,X的的任任意意一一个个属属性性X.a的的计
10、计算算,至至多多只只有有一一条条语语义义规规则则式式可以可以应应用。用。第12页,共97页,编辑于2022年,星期二属性文法示例属性文法示例【例例51】简单简单台式台式计计算器的算算器的算术术表达式的属性文法:表达式的属性文法:产产生式集生式集G:语义规则语义规则式集式集R:L E print(E.val)E E1+T E.val=E1.val+T.valE T E.val=T.valT T1*F T.val=T1.val F.valT F T.val=F.valF (E)F.val=E.valF digit F.val=digit.lexval 第13页,共97页,编辑于2022年,星期二示
11、例示例 在在该该描描述述中中,每每个个非非终终结结符符都都有有一一个个属属性性:一一个个整整数数值值的的称称作作valval的的属属性性。按按照照语语义义规规则则对对每每个个产产生生式式来来说说,它它的的左左部部E E,T T,F F的的属属性性值值的的计计算算来来自自它它右右部部的的非非终终结结符符,这这种种属属性性称称作作综综合合属属性性。单单词词digitdigit仅仅有有综综合合属属性性,它它的的值值是是由由词词法法分分析析程程序序提提供供的的。和和产产生生式式L L E E相相联联的的语语义义规规则则是是一一个个过过程程,打打印印由由E E产产生生的的表表达达式式的的值值。我我们们可
12、可以以理理解解为为L L的的属性是空的或是虚的。属性是空的或是虚的。第14页,共97页,编辑于2022年,星期二设表达式为设表达式为3*5+4,则语义动作打印数值,则语义动作打印数值19LE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3*5+4的带注释的分析树的带注释的分析树第15页,共97页,编辑于2022年,星期二 LR分分析析器器可可以以改改造造为为一一个个翻翻译译器器,在在对对输输入入串串进进行行语语法法分分析析的的同同时时对对
13、属属性性进进行计算。行计算。LR分析器增加语义栈。分析器增加语义栈。#X1 1Xm mI0 0I1 1Im m 语义栈语义栈-X1 1.VALXm m .VAL第16页,共97页,编辑于2022年,星期二SLR(1)SLR(1)分析表分析表digit+*()ETF0s5s41231s6acc2r2s7r2r23r4r4r4r44s5s48235r6r6r6r66s5s4937s5s4108s6s119r1s7r1r110r3r3r3r311r5r5r5r5状态ACTIONGOTO第17页,共97页,编辑于2022年,星期二步骤步骤分析栈分析栈 栈顶状态栈顶状态,输入符输入符剩余输入串剩余输入串
14、 10#-Action0,2=S5移进移进22+3*5*5#20 5#2-Action5,+=r6用用F digit归约,执行语义动归约,执行语义动作作F.val=2+3*5*5#30 3#F-2Action3,+=r4用用T F 归约,执行语义动作归约,执行语义动作T.val=F.val+3*5*5#LRLR分分析析:增增加加语语义义栈栈 归归约约时时进进行行语语义义动动作作。给出给出*的分析和计值过程。的分析和计值过程。第18页,共97页,编辑于2022年,星期二步骤步骤分析栈分析栈 栈顶状态栈顶状态,输入符输入符剩余输入串剩余输入串 40 2#T-2Action2,+=r2用用E T归约
15、,执行语义动作归约,执行语义动作E.val=T.val +3*5*5#50 1#E-2Action1,+=S6移进移进+3*5*5#60 1 6#E+-2 -Action6,3=S5移进移进33*5*5#第19页,共97页,编辑于2022年,星期二70 1 6 5#E+3-2 -Action5,*=r6用用F digit归约,执行语义动归约,执行语义动作作F.val=3 *5 5#80 1 6 3#E+F-2-3Action3,*=r4用用T F 归约,执行语义动作归约,执行语义动作T.val=F.val *5 5#90 1 6 9#E+T-2-3Action9,*=S7移进移进*5 5#10
16、0 1 6 9 7#E+T*-2-3-Action7,5=S5移进移进5 5 5#第20页,共97页,编辑于2022年,星期二110 1 6 9 7 5#E+T*5*5-2-3-Action5,#=r6用用F digit归约归约,执行语义动作执行语义动作F.val=5#120 1 6 9 7 10#E+T*F*F-2-3 -5Action10,#=r3用用T T*F归约归约,执行语义动作执行语义动作T.val=T.val F.val3515#130 1 6 9#E+T-2-15Action9,#=r1用用E E+T 归约归约,执行语义动作执行语义动作E.val=E.val T.val21517
17、#140 1#E-17Action1,#=acc成功接收成功接收输入串输入串#第21页,共97页,编辑于2022年,星期二二二.语义分析的任务语义分析的任务 编编译译程程序序的的任任务务是是把把源源程程序序翻翻译译成成目目标标程程序序,这这个个目目标标程程序序必必须须和和源源程程序序的的语语义义等等同同,也也就就是是说说,尽尽管管它它们们的的语语法法结结构构完完全全不不同同,但但它它们们所所表表达达的的结结果果应应完完全全相相同同。通通常常,在在词词法法分分析析程程序序和和语语法法分分析析程程序序对对源源程程序序的的语语法法结结构构进进行行分分析析之之后后,要要么么由由语语法法分分析析程程序序
18、直直接接调调用用相相应应的的语语义义子子程程序序进进行行语语义义处处理理,要要么么首首先先生生成成语语法法树树或或该该结构的某种表示,再进行语义处理。结构的某种表示,再进行语义处理。第22页,共97页,编辑于2022年,星期二编译中的语义处理是指两个功能:编译中的语义处理是指两个功能:审查每个语法结构的静态语义,即验证审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义。语法结构合法的程序是否真正有意义。有时把这个工作称为静态语义分析或静有时把这个工作称为静态语义分析或静态审查。态审查。如果静态语义正确,语义处理则要执行如果静态语义正确,语义处理则要执行真正的翻译,即,要么生成程
19、序的一种真正的翻译,即,要么生成程序的一种中间表示形式(中间代码),要么生成中间表示形式(中间代码),要么生成实际的目标代码。实际的目标代码。第23页,共97页,编辑于2022年,星期二通常包括:通常包括:类型检查。类型检查。控控制制流流检检查查。控控制制流流语语句句必必须须使使控控制制转转移移到到合合法法的的地地方方。例例如如,在在C C语语言言中中breakbreak语语句句使使控控制制跳跳离离包包括括该该语语句句的的最最小小whilewhile、forfor或或switchswitch语句。如果不存在包括它的语句,则报错。语句。如果不存在包括它的语句,则报错。一致性检查。在很多场合要求对
20、象只能被定义一次。例如一致性检查。在很多场合要求对象只能被定义一次。例如PascalPascal语言规定同一标识符在一个分程序中只能被说明一次,语言规定同一标识符在一个分程序中只能被说明一次,同一同一casecase语句的标号不能相同,枚举类型的元素不能重复出语句的标号不能相同,枚举类型的元素不能重复出现等等。现等等。相关名字检查。有时,同一名字必须出现两次或多次。例相关名字检查。有时,同一名字必须出现两次或多次。例如,如,AdaAda语言程序中,循环或程序块可以有一个名字,出现在语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名这些结构的开头
21、和结尾,编译程序必须检查这两个地方用的名字是相同的。字是相同的。名字的作用域分析。名字的作用域分析。第24页,共97页,编辑于2022年,星期二三、中间代码三、中间代码翻译为中间语言的好处:翻译为中间语言的好处:(1 1)便于进行与机器无关的代码优化;)便于进行与机器无关的代码优化;(2 2)使编译程序改变目标机更容易;)使编译程序改变目标机更容易;(3 3)使编译程序的结构在逻辑上更为简单明确,以中间)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。语言为界面,编译前端和后端的接口更清晰。编译程序所使用的中间代码有多种形式。常见的有编译程序所使用的中间代码
22、有多种形式。常见的有逆波兰式、三元式和树形、四元式表示。逆波兰式、三元式和树形、四元式表示。第25页,共97页,编辑于2022年,星期二1.逆波兰式逆波兰式逆波兰式是最简单的一种中间代码表示逆波兰式是最简单的一种中间代码表示形式,早在编译程序出现之前,它就用形式,早在编译程序出现之前,它就用于表示算术表达式,是波兰逻辑学家卢于表示算术表达式,是波兰逻辑学家卢卡西维奇发明的。卡西维奇发明的。这种表示法将运算对象写在前面,把运这种表示法将运算对象写在前面,把运算符号写在后面,比如把算符号写在后面,比如把a+b写成写成ab+,把把a*b写成写成ab*,用这种表示法表示的表,用这种表示法表示的表达式也
23、称做后缀式。达式也称做后缀式。第26页,共97页,编辑于2022年,星期二示例示例中缀算术表达式中缀算术表达式逆波兰式逆波兰式a+bab+a+b*cabc*+(a+b)*cab+c*a=b*c+d*e abc*de*+=a=b*(c+b)*d/eabcb+*d*e/=第27页,共97页,编辑于2022年,星期二后缀表示法表示表达式,其最大的优点是易于计算机后缀表示法表示表达式,其最大的优点是易于计算机处理表达式。常用的算法是使用一个栈,自左至右扫处理表达式。常用的算法是使用一个栈,自左至右扫描算术表达式(后缀表示),每扫描到运算对象,就描算术表达式(后缀表示),每扫描到运算对象,就把它推进栈;
24、扫描到运算符,若该运算符是二目的,把它推进栈;扫描到运算符,若该运算符是二目的,则对栈顶部的两个运算对象实施该运算,并将运算结则对栈顶部的两个运算对象实施该运算,并将运算结果代替这两个运算对象而进栈;若是一目运算符,则果代替这两个运算对象而进栈;若是一目运算符,则对栈顶元素执行该运算,并以运算结果代替该元素进对栈顶元素执行该运算,并以运算结果代替该元素进栈,最后的结果留在栈顶。栈,最后的结果留在栈顶。由于后缀式表示上的简洁和计值的方便,特别适由于后缀式表示上的简洁和计值的方便,特别适用于解释执行的程序设计语言的中间表示,也方用于解释执行的程序设计语言的中间表示,也方便具有堆栈体系的计算机的目标
25、代码生成。便具有堆栈体系的计算机的目标代码生成。第28页,共97页,编辑于2022年,星期二2.三元式和树形表示三元式和树形表示另一类中间代码形式是三元式。把表达式及各种语句另一类中间代码形式是三元式。把表达式及各种语句表示成一组三元式。表示成一组三元式。每个三元式由三个部分组成,分别是:每个三元式由三个部分组成,分别是:(算符算符op,第一运算对象,第一运算对象ARG1,第二运算对象,第二运算对象ARG2)运算对象可能是源程序中的变量,也可能是某个三元式运算对象可能是源程序中的变量,也可能是某个三元式的结果,用三元式的编号表示。的结果,用三元式的编号表示。对于一目算符对于一目算符op,只需选
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法制导翻译和中间代码生成 2幻灯片 语法 制导 翻译 中间 代码 生成 幻灯片
限制150内