【编译原理】语法制导翻译:属性分类、依赖图与求值逻辑全解析

博主前言

在编译原理的学习中,语法制导翻译(SDT)是连接语法分析与中间代码生成的桥梁。本文根据今日课堂笔记整理,重点梳理 SDD/SDT 的核心概念,并总结出一套快速判断属性类型的"高分口诀",希望能帮到正在复习的小伙伴。


一、 核心术语定义 (Terminology)

在进行语义分析之前,我们需要明确两个基础概念:

  • SDD (Syntax-Directed Definition):语法制导定义。它是上下文无关文法(CFG)的扩展,为每个文法符号关联属性,并为每个产生式关联语义规则。
  • SDT (Syntax-Directed Translation Scheme):语法制导翻译方案。它是在产生式的右部嵌入程序片段(语义动作)的文法。

二、 属性分类:综合属性 vs 继承属性

这是笔记中最核心的考点,也是最容易混淆的地方。根据属性值的传递方向,我们将其分为两类:

1. 综合属性 (Synthesized Attribute, Syn)

  • 定义 :结点 NNN 上的综合属性值由 NNN 的子结点NNN 本身 的属性值决定。
  • 特征
    • 信息流向:自底向上 (Bottom-Up)。
    • 表现:下层往上传值。

2. 继承属性 (Inherited Attribute, Inh)

  • 定义 :结点 NNN 上的继承属性值由 NNN 的父结点NNN 的兄弟结点 以及 NNN 本身 的属性值决定。
  • 特征
    • 信息流向:自顶向下 (Top-Down)。
    • 表现:上层或同层往传值。

三、 🎯 核心方法总结:高分记忆口诀

针对属性判别,笔记中总结了一套非常高效的口诀,建议背诵:

"父兄传值,继承属性;子给值,综合。"

属性类型 传值来源 对应流向
继承属性 (Inh) 父节点、兄弟节点 自顶向下 / 同层水平
综合属性 (Syn) 子节点 自底向上

四、 依赖图与求值顺序 (Dependency Graph)

在 SDD 中,如果属性 bbb 依赖于属性 aaa,我们通过 依赖图 来描述这种约束关系:

  • 基本准则被依赖者 →\to→ 依赖者
    • 例如:若有规则 E.val=T.valE.val = T.valE.val=T.val,则存在边 T.val→E.valT.val \to E.valT.val→E.val。
  • 求值路径
    • 语法分析树 ⇒\Rightarrow⇒ 带有属性值的注释分析树 (Annotated Parse Tree)
    • 拓扑排序 :通过依赖图确定一个合法的求值序列(如笔记中标记的 1, 2, 3...10 序列)。

五、 知识点补充 (Necessary Supplement)

为了使博文更完整,补充以下两类特殊的文法分类,这也是考试常客:

1. S-属性文法 (S-Attributed Grammar)

  • 定义 :如果一个 SDD 只包含 综合属性,则称为 S-属性文法。
  • 优势:非常适合在自底向上的语法分析(如 LR 分析)过程中实现。

2. L-属性文法 (L-Attributed Grammar)

  • 定义 :如果一个 SDD 的每个产生式 A→X1X2...XnA \to X_1 X_2 \dots X_nA→X1X2...Xn 的继承属性仅依赖于:
    1. 父节点 AAA 的继承属性。
    2. 该符号左侧的兄弟符号 X1,...,Xi−1X_1, \dots, X_{i-1}X1,...,Xi−1 的属性。
  • 结论:S-属性文法一定是 L-属性文法。

六、 实例场景:addtype 的应用

在笔记的左下角提到了 addtype。这通常出现在类型声明语句中(如 int a, b, c;):

  1. 关键词 int 解析后得到类型信息。
  2. 该类型信息作为 继承属性 向下传递给变量列表中的每一个 id
  3. addtype 动作将该类型填入符号表。

结语:编译原理虽然抽象,但只要抓住"信息流向"这个核心,配合上面的口诀,属性判断题基本就是送分题。如果你觉得有帮助,欢迎点赞收藏!

相关推荐
龙仔72513 小时前
人大金仓KingbaseES V8 手动单库备份&恢复操作笔记
数据库·笔记·oracle·人大金仓
zhangrelay14 小时前
消费电子原装锂电池服役8–20年且健康度>40%公开实测案例完整调研分析报告
笔记·学习
疯狂打码的少年14 小时前
【软件工程】软件测试:黑盒测试(等价类/边界值/因果图)
笔记·软件工程
圣光SG15 小时前
Java Web入门基础知识笔记
java·前端·笔记
黑科技iOS上架15 小时前
MacBookM532G部署本地大模型
经验分享·ai编程
wish36617 小时前
使用 Chainlit 调用 TextGen API + 本地 LLM 实现 RAG Chatbot 应用
人工智能·语言模型·自然语言处理·local llm
ychqsq18 小时前
88.归途
经验分享·职场和发展
蜡笔小电芯19 小时前
【电路设计】TVS 瞬态抑制二极管选型与应用笔记
笔记
tyqtyq2221 小时前
HarmonyOS AI 应用开发实战:考研择校分析系统
人工智能·学习·考研·华为·生活·harmonyos
三水不滴21 小时前
RAG 系统评测全梳理:三元组方法论 + 分层指标体系
经验分享·笔记