关于语法制导定义中的 S 属性定义和 L 属性定义,下列说法正确的是()。
S 属性定义是只包含综合属性的语法制导定义,属性值通常由子结点向父结点汇总。L 属性定义允许继承属性,但对产生式 A→X1X2…Xn 中 Xi 的继承属性,其依赖通常限于 A 的继承属性以及 Xi 左侧符号的属性,因此适合从左到右求值。
选项分析
正确。它准确概括了 S 属性与 L 属性定义的属性类型和依赖限制。
错误。S 属性定义恰好只使用综合属性,不是只使用继承属性。
错误。L 属性定义对继承属性依赖有从左到右限制,不能任意依赖右侧尚未求值的符号。
错误。两类定义正是为了描述属性依赖和可行求值顺序,与语法树遍历密切相关。
本题为什么容易错
综合、继承两个词容易背反。判断时别背字面,画一棵父子树:子结点结果向父结点汇总叫综合;父结点或兄弟上下文传给当前结点叫继承。
简短答案
S 属性定义和 L 属性定义有什么区别,正确答案是 A(S 属性定义只使用综合属性;L 属性定义可以使用满足从左到右依赖限制的继承属性)。S 属性定义是只包含综合属性的语法制导定义,属性值通常由子结点向父结点汇总。L 属性定义允许继承属性,但对产生式 A→X1X2…Xn 中 Xi 的继承属性,其依赖通常限于 A 的继承属性以及 Xi 左侧符号的属性,因此适合从左到右求值。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| S 属性定义只使用综合属性;L 属性定义可以使用满足从左到右依赖限制的继承属性 | 本题正确答案 | 正确。它准确概括了 S 属性与 L 属性定义的属性类型和依赖限制。 | 看到题干核心场景时优先联想到它 |
| S 属性定义只使用继承属性;L 属性定义只使用综合属性 | 本题干扰项 | 错误。S 属性定义恰好只使用综合属性,不是只使用继承属性。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| L 属性定义允许右侧符号的属性任意依赖其后所有符号的属性 | 本题干扰项 | 错误。L 属性定义对继承属性依赖有从左到右限制,不能任意依赖右侧尚未求值的符号。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 两者都与语法树上的属性求值顺序无关 | 本题干扰项 | 错误。两类定义正是为了描述属性依赖和可行求值顺序,与语法树遍历密切相关。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- S 属性定义只使用继承属性;L 属性定义只使用综合属性:错误。S 属性定义恰好只使用综合属性,不是只使用继承属性。
- L 属性定义允许右侧符号的属性任意依赖其后所有符号的属性:错误。L 属性定义对继承属性依赖有从左到右限制,不能任意依赖右侧尚未求值的符号。
- 两者都与语法树上的属性求值顺序无关:错误。两类定义正是为了描述属性依赖和可行求值顺序,与语法树遍历密切相关。
知识点详解
语法制导定义为文法符号附加属性,并用语义规则描述属性值之间的依赖。综合属性通常由结点自身及其子结点属性计算,信息沿语法树向上传递。继承属性通常从父结点或兄弟结点获得上下文。S 属性定义只含综合属性,便于在自底向上归约时求值。L 属性定义允许继承属性,但要求产生式右部符号的继承属性只依赖左部非终结符的继承属性、该符号左边兄弟的属性,以及在不形成循环依赖时自身的属性,从而支持深度优先、从左到右的求值方式。
备考速记
S 只综合、结果往上送;L 可继承,但信息要顺着左到右。
S属性定义 在L属性定义场景中的作用
S属性定义在本题中的核心价值,是解决“关于语法制导定义中的 S 属性定义和 L 属性定义,下列说法正确的是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 直接判断 S 属性定义、L 属性定义允许使用的属性类型。
- 给出产生式和属性依赖,判断是否满足 L 属性限制。
- 结合语法树遍历或翻译方案,判断属性的可行求值顺序。
S属性定义 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把S属性定义放到L属性定义场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
这题抓住数据流方向就够了。S 属性像汇总报表,孩子算好再交给父结点;L 属性还允许父结点或左边兄弟把信息传给当前结点。为什么叫 L?因为这种依赖能够配合从左到右处理,不能让当前结点随意等右边尚未计算的兄弟给答案。
考点定位
S 属性定义是 L 属性定义的特例。综合属性常自底向上传递;L 属性定义增加了受限继承属性,但不能任意向右依赖尚未处理的兄弟结点。
易错提醒
- 把综合属性理解成父结点向子结点传值。
- 认为 L 属性定义中的继承属性可以依赖右侧任意兄弟。
- 忽略 S 属性定义实际上属于 L 属性定义的特殊情况。
备考提示
- 用箭头标注属性依赖方向:向上通常是综合属性,向下或横向传递通常涉及继承属性。
- 复习时把 S 属性定义与自底向上分析联系,把 L 属性定义与深度优先、从左到右求值联系起来。
你可能还想了解
- 综合属性与继承属性分别怎样传递?
- 为什么 S 属性定义是 L 属性定义的特例?
- L 属性定义为什么限制对右侧兄弟属性的依赖?
- 属性文法怎样确定语义规则的求值顺序?
本文小结
S 属性定义只包含综合属性,信息主要由子结点向父结点汇总;L 属性定义允许继承属性,但依赖必须适合从左到右求值。S 属性定义因此可以看作 L 属性定义的特例。