06 属性文法和语法制导翻译.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 属性文法和语法制导翻译 6.1属性文法 6.2 基于属性文法的处理方法 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 自顶向下的翻译 6.5 自下而上计算继承属性 作业 7 11 为表达式建立抽象语法树的翻译模式 E?E1+T {E?nptr :=mknode(′+′,E1 ? nptr,T ?nptr)} E?E1-T {E?nptr :=mknode(′-′,E1 ? nptr,T ?nptr)} E?T {E?nptr :=T ?nptr} 消除左递归,变成图6.17的翻译模式。 消除左递归后构造抽象语法树的翻译模式: E→T {R?i:=T ? nptr} R {E ? nptr:=R ? s} R→+ T {R1 ? i:=mknode(+,R ? i,T ? nptr)} R1 {R ? s:=R1 ? s} R→- T {R1 ? i:=mknode(-,R ? i,T ? nptr)} R1 {R ? s:=R1 ? s} R→ε {R ? s:=R ? i} T→( E ) {T ? nptr:=E ? nptr} T→id {T ? nptr:=mkleaf(id, id ? entry)} T→num {T ? nptr:=mkleaf(num,num ? val)} 使用继承属性构造语法树 E i R s T id R - T num i R T ε + id id num 4 id - + to entry for a to entry for c nptr nptr nptr 递归下降翻译器的设计 一个带有适合预测分析的基础文法的语法制导翻译模式。 输入: 一个语法制导翻译器的代码。 在分析器中加入语义动作代码。 1.?A?VN,建立一个可递归调用的函数过程A。为A的每一个继承属性都设置 一个形式参数,函数的返回值是A的综合属性值。 函数过程A的代码(指用符号形式表示的数据和程序)要根据当前的输入符号来决定使用哪一个产生式。 输出: 方法: 3.与每一个产生式有关的代码,从左到右根椐产生式右部是单词符号、非终结符号还是语义动作,分别是: (a)对于带有综合属性x的单词符号X,x存放在X.x中,产生一个匹配X的调用,并继续读入一个输入符号。 (b)对于B?VN,编写一个赋值语句c:= B(b1, b2, …,bk),其中, b1, b2, …,bk是与B继承属性相关变量, c是与B综合属性相关变量。 (c)对于每个动作,动作的代码抄进翻译器中,用代表属性的变量来代替对属性的每一次引用。 自下而上翻译技术的一般化 文法适应范围: 任何基于LL(1)文法的L-属性文法 部分基于LR(1)文法的L-属性文法 去掉嵌入在产生式中间的动作 在基础文法中加入新的产生式M→ε,其中M为新引入的标记非终结符。 把嵌入在产生式中间的每个语义动作用不同的标记非终结符M代替,并把这个动作放在产生式M→ε的末尾。 经过转换的翻译模式中,动作都在产生式的末尾,因此,可以在自下而上的分析过程中产生式右部被归约时执行相应的动作。 E→TR R→+ T {print(‘+’)}R| - T {print(‘-’)}R| ε T→num{print(num.val)} 使用标记非终结符M和N转化为 E→TR R→+ T MR| - TN R| ε T→num{print(num.val)} M → ε {print(‘+’)} N → ε {print(‘-’)} 分析栈中的继承属性 A→XY 综合属性X.s 继承属性Y. i 如果继承属性Y.i是通过复写规则Y.i:=X.s定义的,则可以在需要Y.i的地方使用X.s的值。 每个结点可以由包含几个域的记录来实现。 一个运算符号对应的结点中,一个域标识运算符号,其它域包含指向运算分量的结点的指针。运算符号通常叫做这个结点的标号。 进行翻译时,抽象语法树中的结点可能会用附加域来存放结点的属性值(或指向属性的指针)。 实现: 返回新建立结点的指针。 1、mknode(op,left,right) 建立一个运算符号结点,标号是op,两个域left和right指向运算分量结点的指针。 2、mkleaf(id,entry) 建立一个标识符结点,由标号id标识,一个域entry指向标识符符号表中相应的项。 3、mkleaf(num,val) 建立一个数结点,标号为num ,域val用于存放数的值。 函数: id to entry a num 4 – id

您可能关注的文档

文档评论(0)

精华文档888 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档