【发布时间】:2011-01-28 08:24:14
【问题描述】:
我正在阅读一本编译器书籍,当它说“S 属性语法也是 L 属性语法”时有点困惑。无法理解。有人可以说清楚(一个例子应该很好)。谢谢。
【问题讨论】:
标签: compiler-theory
我正在阅读一本编译器书籍,当它说“S 属性语法也是 L 属性语法”时有点困惑。无法理解。有人可以说清楚(一个例子应该很好)。谢谢。
【问题讨论】:
标签: compiler-theory
L-属性文法是一种特殊类型的属性文法。它们允许在抽象语法树的一次从左到右的遍历中评估属性。因此,L-属性文法中的属性评估可以方便地结合到自顶向下解析中。许多编程语言都是 L 属性的。特殊类型的编译器,即窄编译器,基于某种形式的 L 属性语法。这些可与 S 属性语法相媲美。用于代码合成。
S-Attributed Grammars 是一类属性语法,其特点是没有继承的属性。在解析过程的语义分析过程中,继承的属性必须从父节点向下传递给抽象语法树的子节点,这是自底向上解析的一个问题,因为在自底向上解析中,抽象语法的父节点树是在创建所有孩子之后创建的。 S属性语法中的属性评估可以方便地结合到自顶向下解析和自底向上解析中。 Yacc 基于 S 属性方法。
任何 S 属性文法也是 L 属性文法。
在 L 属性语法中,属性评估可以在从左到右的遍历中执行。由于在 S 属性语法中,属性不是继承的,因此它不会阻止您这样做。因此,您可以说 S 属性语法符合 L 语法的特征。
【讨论】:
Simply S-attributed Grammar 是严格合成类型语法的语法意味着在整个解析树中只有 Value 属性
其中 L-Attributed 语法既可以具有综合语法,也可以具有继承语法,其中一些规则具有从左到右传递继承的规则。 我想它会帮助你。
【讨论】: