我正在阅读一本编译器书籍,当它说“S属性文法也是L属性文法”时,有点困惑。无法理解。是否有人可以澄清(提供一个示例会很好)?谢谢。
我正在阅读一本编译器书籍,当它说“一个S-属性文法也是L-属性文法”时,有点困惑。不太理解。请问有人能否通过示例来澄清这个问题吗?谢谢。我正在阅读一本编译器书籍,当它说“S属性文法也是L属性文法”时,有点困惑。无法理解。是否有人可以澄清(提供一个示例会很好)?谢谢。
我正在阅读一本编译器书籍,当它说“一个S-属性文法也是L-属性文法”时,有点困惑。不太理解。请问有人能否通过示例来澄清这个问题吗?谢谢。S-属性文法是一类特点为没有继承属性的属性文法。继承属性必须在语义分析期间从父节点传递到抽象语法树子节点中,在自底向上的语法分析中,对于抽象语法树的父节点是在创建所有子节点之后创建的,所以对于自底向上的语法分析而言,继承属性是一个问题。在 S-属性文法中的属性评估可以方便地合并到自顶向下语法分析和自底向上语法分析中。 Yacc 是基于 S-属性方法的。L属性文法是一种特殊类型的属性文法。它们允许在抽象语法树的一个从左到右的遍历中评估属性。因此,在L属性文法中,属性评估可以方便地并入自顶向下的解析中。许多编程语言都是L属性文法。一些基于某种形式的L属性文法的编译器,窄编译器,也是特殊类型的编译器。这些与S属性文法相当。用于代码合成。
任何 S-属性文法也都是 L-属性文法。
在 L-属性文法中,属性评估可以在从左到右的遍历中执行。由于在 S-属性文法中,属性不会被继承,因此它不会阻止您执行这项操作。因此,您可以说 S-属性文法符合 L-文法的该特征。