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

博主前言

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

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

相关推荐
天竺鼠不该去劝架5 分钟前
企业银企直联落地难点分析:基于RPA的财务自动化替代方案实践
经验分享
点心的游戏开发世界29 分钟前
UnityShaderGraph滚动UV笔记
笔记·uv
瑞码空间1 小时前
git知识点黄金笔记
笔记·git·elasticsearch
天若有情6732 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
源代码•宸3 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
tianxuanjg4 小时前
工业/协作机器人连接法兰采购指南|高精度安装定位零件怎么选
经验分享·机器人·无人机·制造·材质
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
数智启示录5 小时前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试
Wendy不吃榴莲5 小时前
# AI短剧教程 - 《后西游记》开播后,AI影视为什么更考验“连续讲故事”?
人工智能·笔记·学习·ai·视频
Agudamu11615 小时前
B站学习视频怎么变笔记:用 Ai好记 + Obsidian 搭建个人知识库的完整教程
人工智能·笔记·学习·音视频