资源描述:
《编译原理 教学课件 作者 王生原 董渊 杨萍 张素琴 slide08.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、语法制导的语义处理基础第八讲属性文法基于属性文法的语义处理语法制导的语义处理基础基于翻译模式的语义处理本讲导引本讲导引以语法定义(上下文无关文法)为基础用于各种语义分析与翻译过程:静态语义检查,中间代码(甚至目标代码)生成等用于语义处理规则及处理过程的定义用于自动构造工具的设计(如Yacc)原理与方法属性文法(侧重于语义处理规则的定义)翻译模式(侧重于语义处理过程的定义)语法制导的(Syntax-Directed)语义处理本讲导引属性文法举例识别语言L={anbncnn1}?产生式SABCAA1aAaBB1bBbCC1cCc语义动作/限定条件{(A.num=B.num)a
2、nd(B.num=C.num)}{A.num:=A1.num+1}{A.num:=1}{B.num:=B1.num+1}{B.num:=1}{C.num:=C1.num+1}{C.num:=1}属性文法举例识别语言L={aibjcki,j,k1}不含限定条件,但显示anbncn(n1)是合法的产生式SABCAA1aAaBB1bBbCC1cCc语义动作{if(A.num=B.num)and(B.num=C.num)thenprint(“Accepted!”)elseprint(“Refused!”)}{A.num:=A1.num+1}{A.num:=1}{B.num:=B
3、1.num+1}{B.num:=1}{C.num:=C1.num+1}{C.num:=1}本讲导引翻译模式举例识别语言L={aibjcki,j,k1}显示anbncn(n1)是合法的SA{B.in_num:=A.num}B{C.in_num:=A.num}C{if(B.num=0and(C.num=0))thenprint(“Accepted!”)elseprint(“Refused!”)}AA1a{A.num:=A1.num+1}Aa{A.num:=1}B{B1.in_num:=B.in_num}B1b{B.num:=B1.num-1}Bb{B.num:=B.in_num
4、-1}C{C1.in_num:=C.in_num}C1c{C.num:=C1.num-1}Cc{C.num:=C.in_num-1}本讲导引属性文法(AttributeGrammar)在上下文无关文法的基础上进行如下扩展:为每个文法符号关联多个属性(Attribute)为文法的每个产生式关联一个语义规则集合或称为语义动作。(从应用角度,本课程不讨论含限定条件的属性文法)概念属性文法属性(Attribute)可用来刻画一个文法符号的任何我们所关心的特性,如:符号的值,符号的名字串,符号的类型,符号的偏移地址,符号被赋予的寄存器,代码片断,等等…记号文法符号X关联属性a的属性值可通过X.a
5、访问概念属性文法概念属性文法语义规则(SemanticRule)在属性文法中,每个产生式A都关联一个语义规则的集合,用于描述如何计算当前产生式中文法符号的属性值或附加的语义动作属性文法中允许如下语义规则复写(copy)规则,形如X.a:=Y.b基于语义函数(semanticfunction)的规则,形如b:=f(c1,c2,…,ck)或f(c1,c2,…,ck)其中,b,c1,c2,…,ck是该产生式中文法符号的属性实践中,语义函数的形式可以更灵活有两种属性:综合属性和继承属性综合属性(synthesizedattribute)用于“自下而上”传递信息对关联于产生式A的语义规则b:
6、=f(c1,c2,…,ck),如果b是A的某个属性,则称b是A的一个综合属性属性文法继承属性(inheritedattribute)用于“自上而下”传递信息对关联于产生式A的语义规则b:=f(c1,c2,…,ck),如果b是产生式右部某个文法符号X的某个属性,则称b是文法符号X的一个继承属性属性文法举例仅含综合属性的例子(开始符号S)属性文法产生式SEEE1+TETTT1FTFF(E)Fd语义动作{print(E.val)}{E.val:=E1.val+T.val}{E.val:=T.val}{T.val:=T1.valF.val}{T.val:=F.val}{F.v
7、al:=E.val}{F.val:=d.lexval}注:d.lexval是词法分析程序确定的属性值综合属性代表自下而上传递的信息接上页的例子,对表达式3*(5+4)的分析树进行自下而上(后序)遍历,并执行相应的语义规则,得到该表达式的一种求值过程属性文法TETEFTd+()dSEFFTdFd.lexval=5d.lexval=3d.lexval=4F.val=5F.val=3T.val=3T.val=5E.val=5