在讨论 S-attributed 和 L-attributed SDT 之前,这里是对合成或继承属性的简要介绍
属性类型 –
属性可能有两种类型——合成的或继承的。
- 综合属性——
综合属性是产生式左侧的非终结符的属性。综合属性表示正在向上传递分析树的信息。该属性只能从其子项(产品 RHS 中的变量)获取值。例如。假设 A -> BC 是语法的产生式,并且 A 的属性依赖于 B 的属性或 C 的属性,那么它将是合成属性。
- 继承属性——
产生式右侧的非终结符的属性称为继承属性。该属性可以从其父级或兄弟级(产品的 LHS 或 RHS 中的变量)获取值。例如,假设 A -> BC 是语法的产生式,而 B 的属性依赖于 A 的属性或 C 的属性,那么它将是继承属性。
现在,让我们讨论 S-attributed 和 L-attributed SDT。
- S 属性 SDT :
- 如果 SDT 仅使用综合属性,则称为 S-attributed SDT。
- S 属性 SDT 在自底向上解析中进行评估,因为父节点的值取决于子节点的值。
- 语义动作放置在 RHS 的最右边。
- L 属性 SDT:
- 如果一个 SDT 同时使用合成属性和继承属性,并限制继承属性只能从左兄弟节点继承值,则称为 L-attributed SDT。
- L 属性 SDT 中的属性通过深度优先和从左到右的解析方式进行评估。
- 语义动作放置在 RHS 中的任何位置。
例如,
A -> XYZ {Y.S = A.S, Y.S = X.S, Y.S = Z.S}
不是 L 属性文法,因为 YS = AS 和 YS = XS 是允许的,但 YS = ZS 违反了 L 属性 SDT 定义,因为属性从其右兄弟继承值。
注-如果定义S-归因,那么它也是L-归咎于但不是反之亦然。
示例 –考虑下面给出的 SDT。
P1: S -> MN {S.val= M.val + N.val} P2: M -> PQ {M.val = P.val * Q.val and P.val =Q.val}
选择正确的选项。
A. P1 和 P2 都是 S 属性。
B. P1 是 S 属性,P2 是 L 属性。
C. P1 是 L 属性,但 P2 不是 L 属性。
D. 以上都不是解释 –
正确答案是选项C,因为在 P1 中,S 是合成属性,而在 L 属性定义中允许合成。所以 P1 遵循 L 属性定义。但是 P2 不遵循 L 属性定义,因为 P 取决于 Q,Q 是它的 RHS。