欢迎来到天天文库
浏览记录
ID:22467452
大小:979.00 KB
页数:63页
时间:2018-10-20
《第六章 属性文法 2.0》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、属性文法和语法制导翻译※回顾※语义分析是干什么的?其任务是对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译。包括两个方面的工作。首先是对各种语法范畴进行静态语义检查,例如,变量是否定义、类型是否正确等等。如果语义正确,则进行中间代码的翻译。为什么我们需要属性文法?因为语义分析依循的是语言的语义规则,通常使用属性文法描述语义规则。本章我们应该掌握什么属性文法的一些基本概念基于属性文法的几种处理方法S-属性文法的自上而下计算L-属性文法和自顶向下翻译自下而上计算继承属性一属性文法的基本概念属性文法:(也称属性翻译文法)是Kunth在1968年首先提出的。它是在上下文无关文法的基础上,为
2、每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等。属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。属性通常分为两类:综合属性:“自下而上”传递信息。继承属性:“自上而下”传到信息。可以在复杂的处理(甚至编译程序的构造)之前确定属性。例如,一个数的有效位数可以根据语言的定义确定(或者至少给出一个最小值)。属性也可以在程序执行期间才确定,如(非常数)表达式的值,或者动态分配的数据结构的位置。属性的计算及将计算值与正在讨论的语言结构联系的过程称作属性的联编(binding)。联编属性发生时
3、编译/执行过程的时间称作联编时间(bindingtime)。不同的属性变化,甚至不同语言的相同属性都可能有完全不同的联编时间。在执行之前联编的属性称作静态的(static),而只在执行期间联编的属性是动态的(dynamic)。对于编译程序编写者而言,当然对那些在翻译时联编的动态属性感兴趣。语义规则:在一个属性文法中,对应于每个产生式A->α都有一套与之相关语义规则,每条规则的形式为b:=f(c1,c2,…,ck)这里,f是一个函数b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性;或者b是产生式右边某个文法符号的一个继承属性并且c1,c2,…,ck是A或产生式右边任何文法符
4、号的属性。在这两种情况下,我们都说属性b依赖于属性c1,c2,…,ck。对于文法的每个产生式都配备的一组属性的计算规则。强调终结符只有综合属性,它们由词法分析器提供;非终结符既可以有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值对出现在产生式右边的继承属性和出现在产生式左边的综合属性都必须提供一个计算规则出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性计算规则或者由属性计算器的参数提供※例一※考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。产生式A->
5、BC可能有规则C.d:=B.c+1A.b:=A.a+B.c而属性A.a和B.c在其他地方计算。综合属性综合属性在实际中被广泛应用。在语法树中,一个结点的综合属性的值由其子结点的属性值确定。因为,通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。仅仅使用综合属性的属性文法称S-属性文法。下面的简单例子说明综合属性的使用和计算过程。说明:非终结符E,T,F都有一个综合属性val的整数值。符号digit有一个综合属性lexval,由词法分析器提供。产生式LEn对应的语法规则为打印由E产生的算术表达式的值的过程。产生式语义规则LEnEE1+TETTT1*FTFF(E)F
6、digitPrint(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.val*F.valT.val:=F.valF.val:=E.valF.val:=digit.lexval表一一个简单计算器的属性文法假设表达式是3×5+4,后跟换行符n画出语法树,并根据语义规则加注释Digit.lexval=3F.val=3T.val=3Digit.lexval=5T.val=15*F.val=5E.val=15E.val=19T.val=4F.val=4Digit.vexval=4Ln+※例二※继承属性语法树中,一个结点的继承属性由此结点的父结点和或兄弟结点的
7、某些属性确定。用继承属性来表示程序设计语言结构中的上下文依赖关系很方便。举例说明:此例为继承属性在说明中为各种标识符提供类型信息非终结符T有一个综合属性type,它的值由说明中的关键字确定.与产生式DTL相应的语义规则L.in:=T.type把说明中的类型赋值给继承属性L.in.然后,利用语义规则把继承属性L.in沿着语法树往下传.addtype把每个标志符的类型填入符号表的相应项中.给出句子r
此文档下载收益归作者所有