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

博主前言

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

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

相关推荐
lengxuemo1 天前
ICC2学习笔记之Placement and Optimization
笔记·学习
温柔只给梦中人1 天前
NLP学习:注意力机制
人工智能·学习·自然语言处理
sheeta19981 天前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
小满Autumn1 天前
MVVM Light 架构笔记:定位器、命令、消息与 IoC 实践
笔记·学习·架构·c#·上位机·mvvm
kobesdu1 天前
【ROS2实战笔记-24】ROS2 Launch 实用技巧:条件逻辑与节点动态生成
笔记·ros·slam
小满Autumn1 天前
CommunityToolkit.Mvvm 架构笔记:现代 MVVM、源生成器与工程化实践
笔记·架构·c#·.net·wpf·mvvm
永不言弃ives1 天前
卷不动,躺不平
经验分享
高校网站建设群系统EduCMS1 天前
佛山佳德美瓷砖,佛山本地 陶瓷品牌
经验分享
imDwAaY1 天前
贝叶斯网络到粒子滤波Python算法实现 CS188 Proj4 学习笔记
网络·人工智能·笔记·python·学习·算法
咸甜适中1 天前
rust语言学习笔记Trait(十五)Drop(释放资源)
笔记·学习·rust