我正在读一本编译器书,当它说“S属性语法也是一个L属性语法”时有点困惑。无法理解。有人能说清楚(一个例子应该很棒)。感谢。
答案 0 :(得分:14)
L-attributes语法是一种特殊类型的属性语法。它们允许在抽象语法树的一次从左到右遍历中评估属性。因此,L-attributes语法中的属性评估可以方便地结合在自上而下的解析中。许多编程语言都是L-attribution。特殊类型的编译器,窄编译器,基于某种形式的L-referenced语法。这些与S-attributes语法相当。用于代码合成。
S-Attributed Grammars是一类属性语法,其特征是没有继承属性。在解析过程的语义分析期间必须从父节点向下传递到抽象语法树的子节点的继承属性是自下而上解析的问题,因为在自下而上的解析中,抽象语法的父节点树是在创建所有孩子后创建的。 S-attributes语法中的属性评估可以方便地结合在自上而下的解析和自下而上的解析中。 Yacc基于S-referenced方法。
任何S-referenced语法也是L-referenced语法。
在L-attributes语法中,属性评估可以在从左到右的遍历中执行。由于在S-attributes语法中属性不是继承的,因此它不会阻止您这样做。因此,你可以说S属性语法符合L语法的特征。
答案 1 :(得分:3)
简单S-attribution Grammar是具有严格合成类型语法的语法,意味着只在整个解析树中具有Value属性
其中L-Attributed语法既可以合成也可以具有继承语法,其中包含一些规则,例如从左到右传递继承的规则。 我认为它会帮助你。