第三章 编译原理课件.ppt

  1. 1、本文档共61页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四讲 属性文法和 语法制导翻译;§1. 属性文法;属性的类型; 注意: (1)终结符只有综合属性,由词法分析器提供; (2)非终结符既可以有综合属性也可以有继承属性。文法开始符号的所有继承属性作为属性计算前的初始值。; 在一个属性文法中,对应于每个产生式A??都有一套与之相关联的语义规则,每条语义规则的形式为: b:=f(c1,c2,…,ck) 其中f是一个函数,并且满足下面两种情况之一: (1)b是A的一个综合属性并且c1,c2,…ck是产生式右边文法符号的属性; (2)b是产生式右边某个文法符号的一个继承属性并且c1,c2,…ck是A或产生式右边任何文法符号的属性。 对这两种情况都称为属性b依赖于属性c1,c2,…,ck;语义规则; 下表是一个台式计算器程序的属性文法。该计算器读入一个算术表达式,计算并打印它的值,每个输入行以n作为结束。 在这些语义规则中,一个整数综合属性val把每个非终结符E,T,F联系起来。记号digit具有综合属性lexval,其值由词法分析器提供。;L;;10;§2. 基于属性文法的处理方法;依赖图;依赖图的画法;[例]依赖图;[例]依赖图;良定义文法和属性的计算次序;树遍历的属性计算方法;一遍扫描的处理方法;抽象语法树; 为每个运算分量或运算符号都建立一个结点来为子表达式建立子树。运算符号结点的各子结点分别是表示该运算符号的各个运算分量的子表达式组成的子树的根。;;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;a+5*b的语法树的构造;§3. S-属性文法的自下而上计算; 假设图中的栈是由一对数组state和val来实现的。每一个state元素都是一个指向LR(1)分析表的指针(或索引)。(注意,文法符号隐含在state中而不需要存储在栈中)。然而,如果像第五章中的那样把文法符号存入栈中时,那么当第i个state对应的符号为A时,val[i]中就存放语法树中与结点A对应的属性值。 设当前栈顶由指针top指示。我们假设综合属性是刚好在每次归约前计算的。假设语义规则A.a:=f(X.x,Y.y,Z.z)是对应于产生式A?XYZ??。在把XYZ归约成A以前,属性Z.z的值放在val[top]中,Y.y的值放在val[top-1]中,X.x的值放在val[top-2]中。如果一个符号没有综合属性,那么数组val中相应的元素就不定义。归约后,top值减2,A的状态存放在state[top]中(也就是X的位置)综合属性A.a的值存放在val[top]中。;边分析边翻译的方式能否用于继承属性? 属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制 分析树的结点是自左向右生成 如果属性信息是自左向右流动,那么就有可能在分析的同时完成属性计算;§4. L-属性文法和自顶向下翻译; 翻译模式;对继承属性出现位置的限制;不满足条件的例子;自顶向下翻译;消除左递归; 翻译模式变为: A→X { R.i:=f(X.x) } R { A.a:=R.s } R→Y { R1.i:=g(R.i,Y.y) } R1 { R.s:= R1.s } R→ε { R.s:= R.i } 经过转换的翻译模式,使用了R的继承属性i和综合属性s. ⊙ 考虑产生算术表达式的文法,它的翻译模式如何?; 求值翻译模式: 使用属性val来保存计算结果 E→T { R.i:=T.val } R { E.val:=R.s } R→+ T {R1.i:=R.i+T.val} R1 { R.s:= R1.s } R→ε { R.s:= R.i } T→( E ) { T.val:= E.val } T→num {T.val:= num.val}; 构造语法树的翻译模式: 使用属性p来保存语法子树的根结点指针 E→T { R.i:=T.p } R { E.p:=R.s } R→+ T {R1.i:=mknod(‘+’,R.i,T.p)} R1 { R.s:= R1.s } R→ε { R.s:= R.i } T→( E ) { T.p:= E.p } T→

文档评论(0)

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

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

1亿VIP精品文档

相关文档