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

博主前言 :

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

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

相关推荐
by209999 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
m0_7196408710 小时前
2026年高校科研机构轮式双臂机器人二次开发平台搭建测评指南
经验分享·机器人
小豆庄10 小时前
本地视频打码:多模型检测、帧间追踪与18种模糊的选型
opencv·目标检测·ai·自然语言处理·音视频·视频
不一样的故事12612 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
程序边界13 小时前
一台数据集成软件的拆解笔记(下):一致性、容错、跑批与迁移,KFS 真正难的地方在这
java·前端·笔记
金色光环15 小时前
【DSP学习】C2000_ADC中断_笔记
笔记·学习
zhangrelay15 小时前
mrpt杂乱笔记-26-10-31
笔记·学习
熊猫钓鱼>_>15 小时前
平行视界兼容模式与魔法变量配置避坑【鸿蒙心迹】
运维·服务器·开发语言·笔记·华为·harmonyos·openharmony
IT199517 小时前
Docker 快速部署 DM8 达梦数据库|完整踩坑笔记
笔记·docker·容器
東隅已逝,桑榆非晚17 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法