S-attributed和L-attributed语法是什么意思?

11

我正在阅读一本编译器书籍,当它说“S属性文法也是L属性文法”时,有点困惑。无法理解。是否有人可以澄清(提供一个示例会很好)?谢谢。

我正在阅读一本编译器书籍,当它说“一个S-属性文法也是L-属性文法”时,有点困惑。不太理解。请问有人能否通过示例来澄清这个问题吗?谢谢。
2个回答

14

L属性文法

L属性文法是一种特殊类型的属性文法。它们允许在抽象语法树的一个从左到右的遍历中评估属性。因此,在L属性文法中,属性评估可以方便地并入自顶向下的解析中。许多编程语言都是L属性文法。一些基于某种形式的L属性文法的编译器,窄编译器,也是特殊类型的编译器。这些与S属性文法相当。用于代码合成。

S属性文法

S-属性文法是一类特点为没有继承属性的属性文法。继承属性必须在语义分析期间从父节点传递到抽象语法树子节点中,在自底向上的语法分析中,对于抽象语法树的父节点是在创建所有子节点之后创建的,所以对于自底向上的语法分析而言,继承属性是一个问题。在 S-属性文法中的属性评估可以方便地合并到自顶向下语法分析和自底向上语法分析中。 Yacc 是基于 S-属性方法的。

任何 S-属性文法也都是 L-属性文法。

在 L-属性文法中,属性评估可以在从左到右的遍历中执行。由于在 S-属性文法中,属性不会被继承,因此它不会阻止您执行这项操作。因此,您可以说 S-属性文法符合 L-文法的该特征。


3
简单的S属性文法是一种具有严格综合类型文法的文法,意味着仅在解析树中具有值属性。而L属性文法可以具有综合和继承文法,其中一些规则需要从左到右传递继承。我认为这将对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接