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

博主前言

在编译原理的学习中,语法制导翻译(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 动作将该类型填入符号表。

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

相关推荐
xiaoyuchidayuma1 小时前
【无标题】
笔记
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
许长安1 小时前
rpc和http的区别
经验分享·笔记·网络协议·http·rpc
白小沫1 小时前
TortoiseSVN 的每个菜单功能是什么??
笔记·学习
叶~小兮2 小时前
K8S-Helm与灰度发布学习笔记
笔记·学习·kubernetes
sheeta19982 小时前
vue_vuex笔记
javascript·vue.js·笔记
Hua-Jay2 小时前
OpenCV联合C++/Qt 学习笔记(十九)----图像分割
c++·笔记·qt·opencv·学习
七爷不在我这里2 小时前
dockerB站笔记
笔记·docker
奋斗的小乌龟2 小时前
langchain4j笔记-07-tool
笔记