第五语法制导翻译.ppt

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 语法制导翻译 5.4 ~ 5.5 5.4 语法制导的翻译模式 (Translation Scheme) 语法制导翻译(SDT)是SDD的实现。 语法制导翻译模式(SDT)是拓广的CFG, 在文法中嵌入语义动作,语义动作写在花括号“{}”里,可以出现在产生式右部适当位置。 当归约出产生式右部的某个非终结符号后,就执行紧接在该非终结符号右边的语义动作。 任何SDT可以通过先建立语法分析树,然后前序遍历执行语义动作。 但是,我们希望SDT能够在语法分析的同时进行,无需构造好分析树。这里讨论两类: 基础文法是LR,SDD是S-attributed; 基础文法是LL,SDD是L-attributed。 SDD vs. SDT 语义规则 语义动作 SDD vs. SDT 语义规则 语义动作 5.4.1 后缀SDT 自底向上分析S属性文法。 A ? X Y Z{语义动作} 5.4.2后缀SDT的语法分析实现 A ? X Y Z 例5.15 显式操作语法分析栈 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 3*5 n的分析计算过程 5.4.3 产生式内部带语义动作的SDT B ? X {a} Y LR:归约出X之后立即执行动作{a} LL:试图展开Y之前执行动作{a} 例,中缀到后缀转换的SDD 例,中缀到后缀转换的SDT L ? E n E ? E1+ T {print(‘+’)} E ? T T ? T1* F {print(‘*’)} T ? F F ? (E) F ? digit {print(digit.lexval)} 例5.16 翻译为前缀表达式 L ? E n E ? {print(‘+’)} E1+ T E ? T T ? {print(‘*’)} T1* F T ? F F ? (E) F ? digit {print(digit.lexval)} 嵌入动作的分析树:3*5+4 5.4.4 从SDT中删除左递归 例5.17 带左递归的文法的翻译模式。 E ? E1 + T { print(‘+’); } E ? T 转换为: E ? TR R ? + { print(‘+’); } R R ? ? 例:一个一般化的例子 5.4.5 L属性定义的SDT 确定语义动作的执行时机 如何将语义动作嵌入产生式右部的适当位置? 原则: 2. 同时存在综合属性和继承属性,建立翻译模式的必要条件: 产生式右部符号的继承属性必须在这个符号以前的动作中计算出来; 一个动作不能引用该动作右边符号的综合属性; 产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可以放在产生式右端的末尾。 例5.18数学排版语言的翻译模式片断。 例5.18数学排版语言的翻译模式。 图5-25 盒子的大小和高度的语法制导定义 E sub 1的推导过程(忽略二义性问题) 如何消除二义性? 例5.19 S ? while (C) S1 5.5 实现L属性定义的翻译 建立注释语法分析树 构造语法分析树,加入动作,按照前序顺序执行 使用递归下降的语法分析器,在预测分析的过程中实现L属性定义。 例5.20 例5.22 5.5.1 从翻译模式中消除左递归 经过转换的带有右递归文法的翻译模式 表达式9-5+2的计算 例5.15 转换后的构造语法树的翻译模式 5.5.2 预测翻译器的设计 算法5.1 预测语法制导翻译器的构造 算法5.1 预测语法制导翻译器的构造 例5.16 图5.28中的文法是LL(1)文法,适于自顶向下的分析。 从文法中非终结符号的属性,可以得到函数E,R和T的参数和返回值的类型。由于E和T没有继承属性,所以它们不含有参数。 R的翻译器代码基于 产生式 R ? addop T R |?的语法分析过程: 5.5.4 L属性的自底向上 S-属性的自底向上计算 综合属性——在归约时执行计算动作 L-属性的自底向上计算 语义动作不在最右——内嵌的语义动作 继承属性的计算——关键问题 解决方法——引入标记 删除嵌入在翻译模式中的动作 语义动作如何执行 希望在归约时执行 所有的动作都出现在产生式的末尾 可以采用在翻译模式中插入标记非终结符号的方法。 例:引入标记非终结符号M,N,改写翻译模式: 分析栈中的继承属性 继承属性的值无非有两种来源 一开始就存在 来自综合属性,经过复制 来自综合属性,经过计算 继承属性来自综合属性,其值由复写规则决定,且继承属性的位置固定的情形。 翻译模式 图5.33 当L的右边符号被归约

文档评论(0)

boss + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档