- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章6.1属性文法
*河北经贸大学信息技术学院 第六章 属性文法和语法制导翻译 形式语言中的符号没有语义,而无语义的语言无法使用。所以,本章讨论如何使形式语言具有语义。 6.1 属性文法 属性文法是在上下文无关文法基础上建立的带有语义规则的文法。属性文法认为,每一个文法符号(包括终结符和非终结符)实际上都具有若干属性,这些属性的值及其操作与上下文有关,由此构成了文法符号在不同上下文中的语义。 例: 设有文法 L → E n E → E + T T → F T → T * F E → T F → (E) F → digit 设输入串为 3 * 5 + 4 。 设输入串为 digit * digit + digit。 L → E n E → E + T T → F T → T * F E → T F → (E) F → digit L n E E + T T T * F F digit F digit digit 如何通过遍历语法树求得表达式的值呢? L → E n E → E + T T → F T → T * F E → T F → (E) F → digit L n E E + T T T * F F digit F digit digit 3 5 4 3 3 5 4 4 15 15 19 19 还有一些情况需要考虑: 输入串为 3 * 5 + 4 。 例: 设产生说明语句的文法为: D → T L T → int T → real L → L , id L → id 输入串为 real id , id , id D T L L L , , id id id real real 是关键字,其语义是系统默认的。但 id 是用户定义的,它的类型信息(属于 id 的语义)在词法分析和语法分析阶段不能判定,只能由语义分析来解决。那么,如何通过遍历语法树使 id 获得类型信息呢? 例: 设产生说明语句的文法为: D → T L T → int T → real L → L , id L → id 输入串为 real id , id , id D T L L L , , id id id real real real real real real 注意: 信息传递的方向与前例不同。 当遍历到 id 时,将 real 填入 id 所在的符号表中。 ◆ 需要解决的问题: 信息如何传递?何时传递?计算属性值、填写符号表等操作如何完成?何时完成? 实际上这是本章所要讨论的核心问题。 一、文法符号的属性及含义 1、 属性文法为每一个符号(包括终结符和非终结符)配备若干个属性。这些属性的值描述了符号的数值、类型、相关操作(代码序列)、其它应填入符号表的内容等信息。例如: 值3 值2 值1 L 属性3 属性2 属性1 符号名 二、属性的分类 综合属性 —— 需自下而上传递信息时用。 继承属性 —— 需自上而下传递信息时用。 2、可以对属性值进行计算、修改和传递。这些过程称为语义处理过程。 A 综合属性 符号名 继承属性 终结符需要继承属性吗? 三、语义规则 (1)语义规则的形式 在一个属性文法中,每一个产生式A → α都有一套与之关联的语义规则,形式为: b := f( c1 , c2 , . . . , ck ) 其中, ● f 是一个函数, ● 当 b 是 A 的一个综合属性时 c1 , c2 , . . . , ck 是产生式右部文法符号的属性。 ● 当 b 是 产生式 右部某文法符号的一个继承属性时 c1 , c2 , . . . , ck 是 A 或产生式右部任何文法符号的属性。 这两种情况下,我们说属性 b 依赖于属性 c1 , c2 , . . . , ck 。 四、构造语义规则时的原则 (1)终结符只有综合属性,它们由词法分析器提供。 (2)非终结符既可以有综合属性也可以有继承属性。文法开始符号的继承属性值作为属性计算的初值。 (3)每一个产生式对每个出现在其右部的继承属性和出现在其左部的综合属性都必须提供一个计算规则。在这个计算规则中只能使用产生式内部文法符号的属性。 (4)出现在产生式右部的综合属性和出现在产生式左部的继承属性由其它产生式的属性计算规则计算。 (5)当语义规则所须描述的动作较复杂时,也可将语义规则写成过程调用或函数调用的形式。例如: print(E.val) 例: 考虑非终结符 A , B , C : A { 继承属性 a ;
文档评论(0)