1、第6章 语法制导翻译技术,No cross,no crown.不经历风雨,怎么见彩虹.,6.1 翻译文法6.2 语法制导翻译6.3 自顶向下语法制导翻译6.4 属性翻译文法6.5 属性文法的自顶向下翻译6.6 自底向上语法制导翻译,第6章语法制导翻译技术,语法制导翻译翻译文法、属性翻译文法及其应用,学习重点,第6章语法制导翻译技术,例如下列Test语言代码:int a;b=a+1;write b;,语义:是程序设计语言中按语法规则所构成的各 个语法成分的含义。一个源程序经历了词法分析与语法分析,表明它 在书写上和语法上是正确的,但不能保证其在语义 上是正确。,语义分析的任务:分析程序的含义,并
2、作相应的语义处 理。,第6章语法制导翻译技术,语义分析的功能确定类型:确定标识符所关联数据对象的数据类型(有时由词法分析完成)。类型和运算合法性检查:检查运算的合法性与运算 分量类型的一致性(或相容性),必要时作相应的类 型转换。例如,a+b,要求a和b都是算术型(整型或实 型),当a和b不是同一种类型时,需进行类型转换。识别含义:确定程序中各构造成分组合到一起的含 义,并作相应的语义处理。这时对可执行语句生成中 间代码或目标代码。,第6章语法制导翻译技术,语义分析的功能控制流检查:控制流语句必须转移到合法的地方。例如,在C语言中,break语句使得控制跳离包括该语 句的while、for或s
3、witch语句,如果不存在包括它的这 样的语句,则报告错误。一致性检查:在很多程序设计语言中要求对象只能 被说明一次。其它语义检查:如对象的作用域等。,第6章语法制导翻译技术,语义分析的实现语义分析是以语法分析的输出(语法分析树或其它 等价的内部中间表示)作为输入,输出则是中间代码,甚至是目标代码。一般情况下,语义分析仅产生中间代 码,即语义分析与目标代码生成分成两遍来进行。,第6章语法制导翻译技术,语义往往是上下文有关的,只宜于用口语描述,语义形式化很困难。目前,比较流行的语义描述和语义 处理方法是语法制导翻译技术。语法制导翻译技术基础:形式描述的属性翻译文法特点:把语法与语义分开,但又在语
4、法分析的同时进行相应的语义工作提高了实用性,6.1翻译文法,例:设计一个翻译器,它能将中缀表达式翻译成波兰后 缀表达式。假设输入串是a+b*c,则,翻译器,输入串a+b*c,输出串abc*+,问题:如何实现这个翻译过程呢?先看输入串a+b*c的推导过程:,中缀表达式文法:,EE+T ET TT*F TF,F(E)Fa Fb Fc,EE+TE+T*FE+T*cE+F*c E+b*c T+b*c F+b*c a+b*c,由推导过程EE+TE+T*FE+T*c E+F*c E+b*c T+b*c F+b*c a+b*c,得到输入串的语法树:,记住翻译目标是:abc*+,E,E,+,T,T,T,*,F
5、,添加叶子结点,用 表示输出操作(输出 其后的字符)。,E,E,+,T,T,T,*,F,*,+,Fa将符号的叶子结点从左到右连起来,得到abc*+(注意,这种带有的符号串称为动作序列。)执行这个符号序列,得到abc*+,这就是翻译 结果!,TFa,E,问题:如何得到这棵带动作符号的语法树呢?,在中缀表达式文法(输入文法)的基础上加入动作符号,,得到翻译文法。E,F(E),EE+T ET Fa,TT*F TF,Fb Fc,EE+T+ET TT*F*,F(E)Faa Fbb,TF,Fcc,输入文法,翻译文法,例 用输入文法推导a+b*c的过程如下:EE+TE+T*FE+T*c E+F*c E+b*
6、c T+b*c F+b*c a+b*c,用翻译文法进行相同的推导:,EE+T,F(E),ET Fa,TT*F TF,EE+T+ET TT*F*,F(E)Faa Fbb,Fb Fc TF Fcc,输入文法,翻译文法,输入序列,EE+T+E+T*F*+E+T*cc*+E+F*cc*+E+bb*cc*+T+bb*cc*+F+bb*cc*+aa+bb*cc*+活动序列,将活动序列中的输入序 列去掉,得到动作序列:abc*+,翻译文法是上下文无关文法的推广,是在描述语言文法 规则的右部适当位6置.加1入翻语义译动文作法得到的。为了区分文法符号与语义动作,在文法的表示中,将代表语义动作的符 号前面加动作符
7、号标记来表示。输入序列:用输入 文法通过推导可以得 到的终结符号串。活动序列:用翻译 文法通过推导得到的 符号串。动作序列:从某活 动序列中去掉所有输 入序列,即由所有动 作符号组成的符号串。,6.1翻译文法,6.1翻译文法,上例的翻译文法可表示成:G(E)=Vn,Vt,P,E,其中Vn=E,T,FVt=a,b,c,+,*,+,*,a,b,c P=EE+T+,ET,TF,Faa,TT*F*,Fbb,Fcc 在高级程序设计语言的翻译中有各种各样的翻译文法 其中的动作符号代表不同的语义动作。在翻译文法中,如果的动作就是输出其后的符号,可 称该文法为符号串翻译文法。符号串翻译文法是翻译 文法中的一种
8、特定类型。,6.2语法制导翻译,其中:a+b*cabc*+,为输入序列 为动作序列,如果执行该动作序列中的动作,则产生输出序列abc*+,这就是输入序列a+b*c的翻译结果。由于这种翻译结果是通过翻译文法获得的,所以就称 为语法制导翻译。,语法制导翻译:就是给定一输入序列,根据翻译文法获 得翻译该符号串的活动序列,从活动序列中分离出动作符号串,然后执行该动作符号串所规定的动作,从而得到翻 译结果。例:根据前面的算术表达式翻译文法,对于输入符号串a+b*c,推导出的活动序列为:aa+bb*cc*+,6.2语法制导翻译,按 语法制导翻译的方法来实现语言的翻译首先要根据输入语言的文法,分析各条产生式
9、的语义,即分析他们要求计算机所完成的操作。分别编出完成这些操作的子程序或程序段(称为语义子 程序或语义动作)把这些子程序或程序段的名字作为动作符号插入到输 入文法各产生式右部的适当位置上,从而实现翻译文 法。,6.3自顶向下语法制导翻译自顶向下的语法制导翻译有递归下降翻译和LL(1)翻译。递归下降翻译:递归下降翻译器的实现思路与 递归下降分析基本相同,要求也一样,即不能有 左递归,头符号集不能相交,只需在适当的位置 插入实现动作符号的子程序。,6.3自顶向下语法制导翻译,例 算术表达式 翻译文法如下:EE+T+ET,TT*F*TF F(E)Fii注:为输出,其后的符号串。,解:去掉文法 中的左
10、递归,修改后文法为:ET+T+TF*F*,F(E)|ii,处理E的递归下降翻译程序流程图,处理T的递归下降翻译程序流程图,TF*F*,F(E)|ii处理F的递归下降翻译程序流程图,6.3自顶向下语法制导翻译自顶向下的语法制导翻译有递归下降翻译和LL(1)翻译。LL(1)翻译:LL(1)翻译器的实现思路与LL(1)分 析法基本相同,要求也一样,即不能有左递归,头符号集不能相交,只需在文法适当的位置插入 实现动作符号的子程序,并在LL(1)分析表中加 入相应的动作符号。,6.3自顶向下语法制导翻译,例(P126)考虑下面的输入 文法:AaBcD Ab Bc BaA DcD Db,输入文法的LL(1
11、)分析表,设其翻译文法为:AvawBxcyDz Bcr DcDn,Ab BamA Dsb,6.3自顶向下语法制导翻译,翻译文法的LL(1)分析表,注意:对于翻译文法,动作符号像其它符号一样入栈。但 当动作符号处于栈顶时,无论当前的输入符号是什么,都 要执行由该动作符号所规定的操作,并将该动作符号从栈 顶弹出,且不移动读符号指针。,6.3自顶向下语法制导翻译,假如翻译器的分析栈的栈顶符号为A,且当前输入符号为 a,那么将发生的动作是弹出A,zDycxBwav入栈。由于此时栈顶为动作符号v,因此v出栈,并执行由该动作 符号所规定的操作,对于该符号串翻译文法就是要输出v,即 out(v)。紧接着,a
12、出栈,读下一个符号c。然后,动作符号w 为栈顶,因此w出栈,并执行由该动作符号所规定的操作,对于该符号串翻译文法就是要输出w,即out(w)。,ac#,v出栈并执行,a出栈,读入 c,w出栈并执 行,ac#,6.3自顶向下语法制导翻译,翻译文法的LL(1)翻译的总控程序总结:1)当翻译器的控制执行程序根据栈顶符号和当前输 入符号查该表得到元素为空时,则转错误处理程序。2)若控制执行程序识别栈顶符号为动作符号时,不 管当前输入符号是什么,将该动作符号从栈中弹出并 转相应的子程序以完成所需的翻译(执行动作)。对 于符号串翻译文法,其语义动作为输出动作符号中的 符号串。,6.4属性翻译文法,引例声明
13、语句文法:TYPE ID;,ID 其中TYPE代表类型,其值可为int或 real或bool。问题:将输入符号串“int a,b;”翻译为:int aint b思考:能否通过在文法产生式右部添加动作符号 实现该翻译?,6.4,引例声明语句文法:TYPE ID;,ID,属性翻译文法输入:int a,b;输出:int a,int b,其中TYPE代表类型,其值可为int或 real或bool。输入串int a,b;”的推导过程:,TYPEID;TYPEID,ID;,TYPEID,ID问题:无法将文法符号TYPE、ID与输入符号int、a、b 关联起来!,6.4属性翻译文法,6.4属性翻译文法,属性
14、:对文法符号引进一些属性,这些属性代表与 文法符号相关的信息,如类型、值、代码序列、符号 表内容等。属性值可以在语法分析过程中计算和传递。属性一般用标识符表示,通常写在相应文法符号的 下边,它的意义局限于它所在的产生式。属性加工的 过程就是语义的处理过程。属性的分类综合属性继承属性通常规定,每个文法符号的综合属性和继承属性 的交集为空。,6.4属性翻译文法,综合属性:综合属性的计算规则是按“自下而上”方式进行,即文法产生式左部符号的某些属性根据其右部符号的属性和/或自己的其它属性计算而得。在语法树中,如果一个结点的某一属性,其值由子 结点的属性值来计算,则该属性为综合属性。综合属性可用“”来表
15、示。对终结符号其综合属 性具有指定的初始值 该初始值由词法分析程序提供。,例 ApXq,rYs,t p=q+s,r=p+t其中,p是综合属性,r不是综合属性,q,s,t不能 确定,需参考其它产生式的属性计算规则才能确定。,6.4属性翻译文法,继承属性:继承属性的计算规则是按“自上而下”方式进行,即文法产生式右部符号的某些属性根据其左部符号的属性和/或右部的其它符号的某些属性计算 而得。在语法中,如果一个结点的某一属性,其值由该结点的父结点和/或兄弟结点的属性值来计算,则该属性 为继承属性。继承属性可用“”来表示。开始符号的继承属性具有初始值。例 ApXq,rYs,t p=q+s,r=p+t显然
16、,r是继承属性。,6.4属性翻译文法,例 算术表达式的属性翻译文法:,SEqANSWERr Ep Eq+Tr EpTq,r=q p=q+r p=q,Fp NUMq,p=q,6.4属性翻译文法语义规则(语义动作或翻译子程序):为输入文 法配备计算属性的计算规则,称为语义规则。如上例中,p=q+r就是语义规则。产生式只能产生符号串,它并未指明所产生的 符号串的含义是什么。语义规则给出了一个产生 式所产生的符号串的含义,而且还根据这种含义 规定了对应的加工动作。这些加工动作包括查填各类表格、改变编译程 序的某些变量的值、打印各种错误信息以及生成 中间形式代码等。,6.4属性翻译文法,属性翻译文法(或属性文 法):对于某个压缩的上下文无关文法,当为文法符号 引进一组属性,且让该文 法中的产生式附加上语义 规则时,称该上下文无关 文法为属性翻译文法。,6.4属性翻译文法,语义分析的翻译过程:步骤1分析输入符号串,建立语法树;步骤2从语法树得到描述结点属性间依赖关系的依赖 图,由此依赖图得到语义规则的计算次序;步骤3进行语义规则计算,得到翻译结果。语义分析翻译过程的分类:自顶向下的翻译自底向上的翻
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1