总结:编译原理--第五章 语法制导的翻译

第五章  语法制导的翻译

 本章继续讨论使用上下文无关文法来引导对语言的翻译。语法制导定义通过与文法产生式相关的语义规则来描述属性的值。以下是本章所涉及的内容。

  • 继承属性和综合属性:语法制导导定义可以使用的两种属性。一棵语法分析树结点上的综合属性根据该结点的子结点的属性计算得到。一个结点上的继承属性根据它的父结点和/或兄弟结点的属性计算得到。
  • 依赖图:给定一棵语法分析树和一个 SDD ,我们在各个语法分析树结点所关联的属性实例之间画上边,以指明位于边的头部的属性值要根据位于边的尾部的属性值计算得到。
  • 循环定义:在一个有问题的 SDD 中,我们发现存在一些语法分析树,无法找到一个顺序来计算所有结点上的所有属性的值。这些语法分析树关联的依赖图中存在环。确定一个 SDD 是否存在这种带环的依赖图是非常困难的。
  • S 属性定义:在一个 S 属性的 SDD 中,所有的属性都是综合的。
  • L 属性定义:在一个 L 属性的 SDD 中,属性可能是继承的,也可能是综合的。然而,一个语法分析树结点上的继承属性只能依赖于它的父结点的继承属性和位于它左边的兄弟结点的(任意)属性。
  • 抽象语法树:一棵抽象语法树中的每个结点代表一个构造;某个结点的子结点表示该结点所对应的结构的有意义的组成部分。
  • 实现 S 属性的 SDD :一个 S 属性定义可以通过一个所有动作都在产生式尾部的 SDT 来实现。这些动作通过产生式体中的各个符号的综合属性来计算产生式头的综合属性。如果基础文法是 LR 的,那么这个 SDT 可以在一个 LR 语法分析器的栈上实现。
  • 从 SDT 中消除左递归:如果一个 SDT 只有副作用(即不计算属性值),那么消除文法左递归的标准方法允许我们把语义动作当作终结符号移动到新文法中去。在计算属性时,如果这个 SDT 时后缀 SDT ,那么我们仍然能够消除左递归。
  • 用递归下降语法分析实现 L 属性的 SDD:如果我们有一个 L 属性定义,且其基础文法可以用自顶向上的方法进行语法分析,我们就可以构造出一个不带回溯的递归下降语法分析器来实现这个翻译。继承属性变成了非终结符号对应的函数的参数,而综合属性由该函数返回。
  • 实现 LL 文法之上的 L 属性的 SDD :每个以 LL 文法为基础文法的 L 属性定义可以在语法分析过程中实现。用于存放一个非终结符号的综合属性的纪录被放在栈中这个非终结符号之下,而一个非终结符号的继承属性和这个非终结符号存放在一起。栈中还放置了动作纪录,以便在适当的时候计算属性值。
  • 以自底向上的方式实现一个在 LL 文法之上的 L 属性 SDD:一个以 LL 文法为基础文法的 L 属性定义可以转换成一个以 LR 文法为基础文法的翻译方案,且这个翻译可以和自底向上的语法分析过程一起执行。文法的转换过程中引入了 “标记” 非终结符号。这些符号出现在自底向上语法分析栈中,并保存了栈中位于它上方的非终结符号的继承属性。在栈中,综合属性和它的非终结符号放在一起。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81234906
今日推荐