- 1、本文档共85页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[编译原理08
第八章 语法制导翻译和中间代码生成 概述 — 语义处理 概述 — 语义处理 动态语义是真正的翻译成中间代码,或直接生成目标代码; 编译程序的语义处理工作:静态语义审查; 解释执行动态语义(计算)生成代码. 8.1 属性文法 8.1 属性文法 属性文法(attribute grammar)是一个三元组:A=(G,V,F), 其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息,如它的类型、值、代码序列、符号表内容等等 .属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。 F:关于属性的断言或一组属性的计算规则(称为语义规则) . 断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性. 例:类型检查的属性文法 表达式文法 E ? T+T| T or T T ? num | true|false E?T1 + T2 {T1.t=int and T2.t= int} E?T1 or T2 {T1.t=bool and T2.t= bool} T?num {T.t=int} T?true {T.t=bool} T?false {T.t=bool} 属性有两种— 继承属性和综合属性 综合属性用于“自下而上”传递信息. 继承属性用于“自上而下”传递信息. 在一个属性文法中,对应于每个产生式A??都有一套与之相关联的语义规则,每条规则的形式为b:=f(c1,c2…ck). 这里f是一个函数. (1) 如果b是A的一个属性并且c1,c2…ck是产生式右边文法符号的属性或A的其它属性,则称b是A的综合属性. (2) b是产生式右边某个文法符号X的一个属性并且c1,c2…ck是A或产生式右边任何文法符号的属性,则称b是文法符号X的继承属性. 在上述两种情况下,我们都说属性b依赖于属性c1,c2…ck. 1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性(除非另有说明). 2)终结符只有综合属性. 例8.1 简单算术表达式求值的语义描述 非终结符E、T及F都有一个综合属性val. 符号digit有一个综合属性,它的值由词法分析器提供. 与产生式L→E对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,我们可认为这条规则定义了L的一个虚属性. 某些非终结符加下标是为了区分一个产生式中同一非终结符多次出现. 设表达式为3*5+4,则语义动作打印数值19 . 例8.2 说明语句语义规则 非终结符T有一个综合属性type,其值有关键字决定(int或real). L.in=T.type, L.in是继承属性,它将沿着语法树传递到下边的结点. 与L相联的语义规则中有一个过程调用—addtype把标识符的类型信息登录在符号表中. 一个结点的继承属性值是由此结点的父结点和/或兄弟结点的某些属性来决定的. 8.2 语法制导翻译方法 基于属性文法的处理—语法制导翻译 在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译. 假如我们现在要分析的语法成分是简单算术表达式,所完成的语义处理不是将它翻译成中间代码或是目标代码,而是计算表达式的值. 产生式 语义规则 0)L→E print(E.val) 1)E→E1+T E.val∶=E1.val+T.val 2)E→T E.val∶=T.val 3)T→T1*F T.val∶=T1.val×F.val 4)T→F T.val∶=F.val 5)F→(E) F.val∶=E.val 6)F→digit F.val:=digit.lexval LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时对属性进行计算. LR分析器增加语义栈. 2+3*5的分析和计值过程 步骤 动作 状态栈 语义栈(值栈) 符号栈 余留输入串 1) 0 - # 2+3*5# 2) 05 -- #2 +3 *5# 3)
文档评论(0)