第4章 语法分析

比较CFG、文法改写、LL、LR/SLR/LALR、二义性解决、错误恢复与Yacc生成器;用编译流水线、状态轨迹和等价性验证门交付文法变换、项目集、分析表、栈轨迹、冲突和恢复报告

学习目标

  • 能说明“第4章 语法分析”如何比较CFG、文法改写、LL、LR/SLR/LALR、二义性解决、错误恢复与Yacc生成器,并区分Pearson英文第二版、中文译本、现代工具和本站重写
  • 能先预测“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”会改变哪一个输入、表示、栈/图状态、IR、目标代码或验证结果,再操作三类交互证据
  • 能只注入“合并LALR状态时丢失展望符,产生原文法不存在的归约”,定位首个偏离“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”的状态,并从同一快照完成恢复

为什么从这个问题开始

“第4章 语法分析”围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”建立贯穿任务:对一个含优先级、结合性和错误token的表达式文法重放LL与LR分析。先写下哪个输入、表示、栈/图状态、IR、目标代码或验证结果会最先变化,再运行参考、故障和恢复路径;运行后补理由不算预测。只有守住“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”并交付文法变换、项目集、分析表、栈轨迹、冲突和恢复报告,编译成功、分析收敛、目标码长度或基准加速才构成机制证据。

原版书目、556个正式坐标与访问边界

“第4章 语法分析”以Pearson官方书页核对Alfred V. Aho、Monica S. Lam、Ravi Sethi、Jeffrey D. Ullman著 Compilers: Principles, Techniques, and Tools, Second Edition:英文精装ISBN 9780321486813,2006年版;Pearson明确列出12章与两个附录,并说明第10章“指令级并行”、第11章“并行与局部性优化”、第12章“过程间分析”是第二版新增重点。Pearson官方目录继续核对版本与章/附录框架。

“第4章 语法分析”再以中文版完整目录高校馆藏书目核对赵建华、郑滔、戴新宇译《编译原理(第2版)》,机械工业出版社,2009年,631页,ISBN 9787111251217。正式分母计入12个章标题、2个附录标题、533个数字编号节/小节和附录A的9个编号节,合计556个核心目录层级;章末总结、练习、参考文献和索引不重复计为知识节点。

原书与译本均受版权保护,“第4章 语法分析”不复制、翻译或改写原文、图表、算法伪码和练习,只把官方目录当作范围坐标;中文讲解、状态轨迹、反例、交互、练习与答案均为独立教学重写。本页独立核对 1只用于核对现代IR、工具或实验边界,不反向证明原书采用本站表述。

原版目录层级与可验证机制

第4章 语法分析

正式坐标 1/53。 原版目录键 第4章 语法分析。在“第4章 语法分析”的第1个正式坐标中,「第4章 语法分析」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进文法、分析表、栈与错误恢复;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。

4·1 引论

正式坐标 2/53。 原版目录键 4.1 引论。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标2把「4·1 引论」落实为把“引论”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链;只有第4章 语法分析的输入角色、中间状态、输出、反例与等价性证据可重放且反例排除只复述“引论”名称而没有可观察状态、单故障和恢复验证,本节点才算掌握。

4·1·1 语法分析器的作用

正式坐标 3/53。 原版目录键 4.1.1 语法分析器的作用。“第4章 语法分析”的目录节点3「4·1·1 语法分析器的作用」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。

4·1·2 代表性的文法

正式坐标 4/53。 原版目录键 4.1.2 代表性的文法。对“第4章 语法分析”而言,「4·1·2 代表性的文法」在第4次检查中改变可观察状态,因为它负责让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;文法版本、分析栈、输入指针、树、属性和动作日志必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受分析选择或语义动作时点与文法依赖不一致。

4·1·3 语法错误的处理

正式坐标 5/53。 原版目录键 4.1.3 语法错误的处理。在“第4章 语法分析”的第5个正式坐标中,「4·1·3 语法错误的处理」通过把“语法错误的处理”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链推进文法、分析表、栈与错误恢复;复核者保存第4章 语法分析的输入角色、中间状态、输出、反例与等价性证据,出现只复述“语法错误的处理”名称而没有可观察状态、单故障和恢复验证就撤回结论。

4·1·4 错误恢复策略

正式坐标 6/53。 原版目录键 4.1.4 错误恢复策略。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标6把「4·1·4 错误恢复策略」落实为构造项目集与分析表并重放栈、输入和错误恢复决定;只有FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突可重放且反例排除展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串,本节点才算掌握。

4·2 上下文无关文法

正式坐标 7/53。 原版目录键 4.2 上下文无关文法。“第4章 语法分析”的目录节点7「4·2 上下文无关文法」不能停在术语或伪码:它要让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,交付文法版本、分析栈、输入指针、树、属性和动作日志,并把分析选择或语义动作时点与文法依赖不一致设为单一反事实。

4·2·1 上下文无关文法的形式定义

正式坐标 8/53。 原版目录键 4.2.1 上下文无关文法的形式定义。对“第4章 语法分析”而言,「4·2·1 上下文无关文法的形式定义」在第8次检查中改变可观察状态,因为它负责让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;文法版本、分析栈、输入指针、树、属性和动作日志必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受分析选择或语义动作时点与文法依赖不一致。

4·2·2 符号表示的约定

正式坐标 9/53。 原版目录键 4.2.2 符号表示的约定。在“第4章 语法分析”的第9个正式坐标中,「4·2·2 符号表示的约定」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进文法、分析表、栈与错误恢复;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。

4·2·3 推导

正式坐标 10/53。 原版目录键 4.2.3 推导。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标10把「4·2·3 推导」落实为让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;只有文法版本、分析栈、输入指针、树、属性和动作日志可重放且反例排除分析选择或语义动作时点与文法依赖不一致,本节点才算掌握。

4·2·4 语法分析树和推导

正式坐标 11/53。 原版目录键 4.2.4 语法分析树和推导。“第4章 语法分析”的目录节点11「4·2·4 语法分析树和推导」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。

4·2·5 二义性

正式坐标 12/53。 原版目录键 4.2.5 二义性。对“第4章 语法分析”而言,「4·2·5 二义性」在第12次检查中改变可观察状态,因为它负责让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;文法版本、分析栈、输入指针、树、属性和动作日志必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受分析选择或语义动作时点与文法依赖不一致。

4·2·6 验证文法生成的语言

正式坐标 13/53。 原版目录键 4.2.6 验证文法生成的语言。在“第4章 语法分析”的第13个正式坐标中,「4·2·6 验证文法生成的语言」通过让产生式、推导、分析选择、语义动作和树/IR状态逐步对应推进文法、分析表、栈与错误恢复;复核者保存文法版本、分析栈、输入指针、树、属性和动作日志,出现分析选择或语义动作时点与文法依赖不一致就撤回结论。

4·2·7 上下文无关文法与正则表达式

正式坐标 14/53。 原版目录键 4.2.7 上下文无关文法与正则表达式。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标14把「4·2·7 上下文无关文法与正则表达式」落实为让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;只有文法版本、分析栈、输入指针、树、属性和动作日志可重放且反例排除分析选择或语义动作时点与文法依赖不一致,本节点才算掌握。

4·3 文法的书写

正式坐标 15/53。 原版目录键 4.3 文法的书写。“第4章 语法分析”的目录节点15「4·3 文法的书写」不能停在术语或伪码:它要让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,交付文法版本、分析栈、输入指针、树、属性和动作日志,并把分析选择或语义动作时点与文法依赖不一致设为单一反事实。

4·3·1 词法分析和语法分析

正式坐标 16/53。 原版目录键 4.3.1 词法分析和语法分析。对“第4章 语法分析”而言,「4·3·1 词法分析和语法分析」在第16次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。

4·3·2 消除二义性

正式坐标 17/53。 原版目录键 4.3.2 消除二义性。在“第4章 语法分析”的第17个正式坐标中,「4·3·2 消除二义性」通过让产生式、推导、分析选择、语义动作和树/IR状态逐步对应推进文法、分析表、栈与错误恢复;复核者保存文法版本、分析栈、输入指针、树、属性和动作日志,出现分析选择或语义动作时点与文法依赖不一致就撤回结论。

4·3·3 消除左递归

正式坐标 18/53。 原版目录键 4.3.3 消除左递归。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标18把「4·3·3 消除左递归」落实为让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;只有文法版本、分析栈、输入指针、树、属性和动作日志可重放且反例排除分析选择或语义动作时点与文法依赖不一致,本节点才算掌握。

4·3·4 提取左公因子

正式坐标 19/53。 原版目录键 4.3.4 提取左公因子。“第4章 语法分析”的目录节点19「4·3·4 提取左公因子」不能停在术语或伪码:它要把“提取左公因子”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链,交付第4章 语法分析的输入角色、中间状态、输出、反例与等价性证据,并把只复述“提取左公因子”名称而没有可观察状态、单故障和恢复验证设为单一反事实。

4·3·5 非上下文无关语言构造

正式坐标 20/53。 原版目录键 4.3.5 非上下文无关语言构造。对“第4章 语法分析”而言,「4·3·5 非上下文无关语言构造」在第20次检查中改变可观察状态,因为它负责构造项目集与分析表并重放栈、输入和错误恢复决定;FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串。

4·4 自顶向下的语法分析

正式坐标 21/53。 原版目录键 4.4 自顶向下的语法分析。在“第4章 语法分析”的第21个正式坐标中,「4·4 自顶向下的语法分析」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进文法、分析表、栈与错误恢复;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。

4·4·1 递归下降的语法分析

正式坐标 22/53。 原版目录键 4.4.1 递归下降的语法分析。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标22把「4·4·1 递归下降的语法分析」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。

4·4·2 FIRST和FOLLOW

正式坐标 23/53。 原版目录键 4.4.2 FIRST和FOLLOW。“第4章 语法分析”的目录节点23「4·4·2 FIRST和FOLLOW」不能停在术语或伪码:它要构造项目集与分析表并重放栈、输入和错误恢复决定,交付FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,并把展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串设为单一反事实。

4·4·3 LL(1)文法

正式坐标 24/53。 原版目录键 4.4.3 LL(1)文法。对“第4章 语法分析”而言,「4·4·3 LL(1)文法」在第24次检查中改变可观察状态,因为它负责让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;文法版本、分析栈、输入指针、树、属性和动作日志必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受分析选择或语义动作时点与文法依赖不一致。

4·4·4 非递归的预测分析

正式坐标 25/53。 原版目录键 4.4.4 非递归的预测分析。在“第4章 语法分析”的第25个正式坐标中,「4·4·4 非递归的预测分析」通过让产生式、推导、分析选择、语义动作和树/IR状态逐步对应推进文法、分析表、栈与错误恢复;复核者保存文法版本、分析栈、输入指针、树、属性和动作日志,出现分析选择或语义动作时点与文法依赖不一致就撤回结论。

4·4·5 预测分析中的错误恢复

正式坐标 26/53。 原版目录键 4.4.5 预测分析中的错误恢复。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标26把「4·4·5 预测分析中的错误恢复」落实为让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;只有文法版本、分析栈、输入指针、树、属性和动作日志可重放且反例排除分析选择或语义动作时点与文法依赖不一致,本节点才算掌握。

4·5 自底向上的语法分析

正式坐标 27/53。 原版目录键 4.5 自底向上的语法分析。“第4章 语法分析”的目录节点27「4·5 自底向上的语法分析」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。

4·5·1 归约

正式坐标 28/53。 原版目录键 4.5.1 归约。对“第4章 语法分析”而言,「4·5·1 归约」在第28次检查中改变可观察状态,因为它负责构造项目集与分析表并重放栈、输入和错误恢复决定;FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串。

4·5·2 句柄剪枝

正式坐标 29/53。 原版目录键 4.5.2 句柄剪枝。在“第4章 语法分析”的第29个正式坐标中,「4·5·2 句柄剪枝」通过构造项目集与分析表并重放栈、输入和错误恢复决定推进文法、分析表、栈与错误恢复;复核者保存FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,出现展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串就撤回结论。

4·5·3 移进-归约语法分析

正式坐标 30/53。 原版目录键 4.5.3 移进-归约语法分析。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标30把「4·5·3 移进-归约语法分析」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。

4·5·4 移进-归约语法分析中的冲突

正式坐标 31/53。 原版目录键 4.5.4 移进-归约语法分析中的冲突。“第4章 语法分析”的目录节点31「4·5·4 移进-归约语法分析中的冲突」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。

4·6 LR语法分析技术介绍:简单LR

正式坐标 32/53。 原版目录键 4.6 LR语法分析技术介绍:简单LR。对“第4章 语法分析”而言,「4·6 LR语法分析技术介绍:简单LR」在第32次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。

4·6·1 为什么使用LR语法分析器

正式坐标 33/53。 原版目录键 4.6.1 为什么使用LR语法分析器。在“第4章 语法分析”的第33个正式坐标中,「4·6·1 为什么使用LR语法分析器」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进文法、分析表、栈与错误恢复;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。

4·6·2 项和LR(0)自动机

正式坐标 34/53。 原版目录键 4.6.2 项和LR(0)自动机。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标34把「4·6·2 项和LR(0)自动机」落实为把字符位置、正则规则、自动机状态、最长匹配和token属性连接起来;只有正则—NFA—DFA映射、状态轨迹、接受/回退与token流可重放且反例排除规则优先级、最长匹配、预读或输入边界错误,本节点才算掌握。

4·6·3 LR语法分析算法

正式坐标 35/53。 原版目录键 4.6.3 LR语法分析算法。“第4章 语法分析”的目录节点35「4·6·3 LR语法分析算法」不能停在术语或伪码:它要声明阶段接口、名字/类型/状态角色和源—目标语义映射,交付阶段快照、符号表、类型、IR谱系、诊断和源位置,并把阶段边界丢失绑定、类型、控制依赖或源位置设为单一反事实。

4·6·4 构造SLR语法分析表

正式坐标 36/53。 原版目录键 4.6.4 构造SLR语法分析表。对“第4章 语法分析”而言,「4·6·4 构造SLR语法分析表」在第36次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。

4·6·5 可行前缀

正式坐标 37/53。 原版目录键 4.6.5 可行前缀。在“第4章 语法分析”的第37个正式坐标中,「4·6·5 可行前缀」通过把“可行前缀”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链推进文法、分析表、栈与错误恢复;复核者保存第4章 语法分析的输入角色、中间状态、输出、反例与等价性证据,出现只复述“可行前缀”名称而没有可观察状态、单故障和恢复验证就撤回结论。

4·7 更强大的LR语法分析器

正式坐标 38/53。 原版目录键 4.7 更强大的LR语法分析器。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标38把「4·7 更强大的LR语法分析器」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。

4·7·1 规范LR(1)项

正式坐标 39/53。 原版目录键 4.7.1 规范LR(1)项。“第4章 语法分析”的目录节点39「4·7·1 规范LR(1)项」不能停在术语或伪码:它要构造项目集与分析表并重放栈、输入和错误恢复决定,交付FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,并把展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串设为单一反事实。

4·7·2 构造LR(1)项集

正式坐标 40/53。 原版目录键 4.7.2 构造LR(1)项集。对“第4章 语法分析”而言,「4·7·2 构造LR(1)项集」在第40次检查中改变可观察状态,因为它负责构造项目集与分析表并重放栈、输入和错误恢复决定;FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串。

4·7·3 规范LR(1)分析表

正式坐标 41/53。 原版目录键 4.7.3 规范LR(1)分析表。在“第4章 语法分析”的第41个正式坐标中,「4·7·3 规范LR(1)分析表」通过构造项目集与分析表并重放栈、输入和错误恢复决定推进文法、分析表、栈与错误恢复;复核者保存FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,出现展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串就撤回结论。

4·7·4 构造LALR分析表

正式坐标 42/53。 原版目录键 4.7.4 构造LALR分析表。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标42把「4·7·4 构造LALR分析表」落实为构造项目集与分析表并重放栈、输入和错误恢复决定;只有FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突可重放且反例排除展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串,本节点才算掌握。

4·7·5 LALR分析表的高效构造

正式坐标 43/53。 原版目录键 4.7.5 LALR分析表的高效构造。“第4章 语法分析”的目录节点43「4·7·5 LALR分析表的高效构造」不能停在术语或伪码:它要构造项目集与分析表并重放栈、输入和错误恢复决定,交付FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,并把展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串设为单一反事实。

4·7·6 LR分析表的压缩

正式坐标 44/53。 原版目录键 4.7.6 LR分析表的压缩。对“第4章 语法分析”而言,「4·7·6 LR分析表的压缩」在第44次检查中改变可观察状态,因为它负责构造项目集与分析表并重放栈、输入和错误恢复决定;FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串。

4·8 使用二义性文法

正式坐标 45/53。 原版目录键 4.8 使用二义性文法。在“第4章 语法分析”的第45个正式坐标中,「4·8 使用二义性文法」通过让产生式、推导、分析选择、语义动作和树/IR状态逐步对应推进文法、分析表、栈与错误恢复;复核者保存文法版本、分析栈、输入指针、树、属性和动作日志,出现分析选择或语义动作时点与文法依赖不一致就撤回结论。

4·8·1 用优先级和结合性解决冲突

正式坐标 46/53。 原版目录键 4.8.1 用优先级和结合性解决冲突。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标46把「4·8·1 用优先级和结合性解决冲突」落实为让产生式、推导、分析选择、语义动作和树/IR状态逐步对应;只有文法版本、分析栈、输入指针、树、属性和动作日志可重放且反例排除分析选择或语义动作时点与文法依赖不一致,本节点才算掌握。

4·8·2 悬空else二义性

正式坐标 47/53。 原版目录键 4.8.2 悬空else二义性。“第4章 语法分析”的目录节点47「4·8·2 悬空else二义性」不能停在术语或伪码:它要让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,交付文法版本、分析栈、输入指针、树、属性和动作日志,并把分析选择或语义动作时点与文法依赖不一致设为单一反事实。

4·8·3 LR语法分析中的错误恢复

正式坐标 48/53。 原版目录键 4.8.3 LR语法分析中的错误恢复。对“第4章 语法分析”而言,「4·8·3 LR语法分析中的错误恢复」在第48次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。

4·9 语法分析器生成工具

正式坐标 49/53。 原版目录键 4.9 语法分析器生成工具。在“第4章 语法分析”的第49个正式坐标中,「4·9 语法分析器生成工具」通过声明阶段接口、名字/类型/状态角色和源—目标语义映射推进文法、分析表、栈与错误恢复;复核者保存阶段快照、符号表、类型、IR谱系、诊断和源位置,出现阶段边界丢失绑定、类型、控制依赖或源位置就撤回结论。

4·9·1 语法分析器生成工具Yacc

正式坐标 50/53。 原版目录键 4.9.1 语法分析器生成工具Yacc。围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”,“第4章 语法分析”在坐标50把「4·9·1 语法分析器生成工具Yacc」落实为声明阶段接口、名字/类型/状态角色和源—目标语义映射;只有阶段快照、符号表、类型、IR谱系、诊断和源位置可重放且反例排除阶段边界丢失绑定、类型、控制依赖或源位置,本节点才算掌握。

4·9·2 使用Yacc处理二义性文法

正式坐标 51/53。 原版目录键 4.9.2 使用Yacc处理二义性文法。“第4章 语法分析”的目录节点51「4·9·2 使用Yacc处理二义性文法」不能停在术语或伪码:它要让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,交付文法版本、分析栈、输入指针、树、属性和动作日志,并把分析选择或语义动作时点与文法依赖不一致设为单一反事实。

4·9·3 用Lex创建Yacc词法分析器

正式坐标 52/53。 原版目录键 4.9.3 用Lex创建Yacc词法分析器。对“第4章 语法分析”而言,「4·9·3 用Lex创建Yacc词法分析器」在第52次检查中改变可观察状态,因为它负责声明阶段接口、名字/类型/状态角色和源—目标语义映射;阶段快照、符号表、类型、IR谱系、诊断和源位置必须与“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”对齐,不能接受阶段边界丢失绑定、类型、控制依赖或源位置。

4·9·4 Yacc中的错误恢复

正式坐标 53/53。 原版目录键 4.9.4 Yacc中的错误恢复。在“第4章 语法分析”的第53个正式坐标中,「4·9·4 Yacc中的错误恢复」通过构造项目集与分析表并重放栈、输入和错误恢复决定推进文法、分析表、栈与错误恢复;复核者保存FIRST/FOLLOW、项目闭包、动作/转移表、栈轨迹与冲突,出现展望符、状态合并或恢复动作让分析器接受错误串或拒绝合法串就撤回结论。

先预测,再操作三个章专属实验

分步1 / 3

1. 输入、表示与翻译流水线

为“第4章 语法分析”选择正式目录坐标,在参考流水线与单一故障间切换,逐阶段核对输入、变换、输出和不变量。

输入—表示—翻译流水线

第4章 语法分析

选择正式目录坐标,再比较参考编译合同与单一故障的首个状态分岔。

阶段 1/4

第4章 语法分析 · 输入与表示

输入
对一个含优先级、结合性和错误token的表达式文法重放LL与LR分析
变换
冻结文法、分析表、栈与错误恢复所需的源程序、文法/IR/机器版本、shape和符号角色
输出证据
第4章 语法分析的输入合同、版本表与基线快照
不变量检查
第4章 语法分析的源位置、名字、类型、控制/数据依赖和可见性没有越界

第4章 语法分析的可重放协议

阶段允许动作必留证据拒绝条件
第4章 语法分析 · 输入与表示冻结文法、分析表、栈与错误恢复所需的源程序、文法/IR/机器版本、shape和符号角色第4章 语法分析的输入合同、版本表与基线快照未满足“第4章 语法分析的源位置、名字、类型、控制/数据依赖和可见性没有越界”
第4章 语法分析 · 状态变换执行比较CFG、文法改写、LL、LR/SLR/LALR、二义性解决、错误恢复与Yacc生成器的最小算法并保存每一步状态第4章 语法分析的参考轨迹、故障轨迹与首个状态分岔未满足“第4章 语法分析每一步可由同一输入、规则、版本和顺序复算”
第4章 语法分析 · 输出与代价比较变换前后IR/目标状态、诊断、资源或分析精度第4章 语法分析的前后差、语义映射、代价和恢复路径未满足“第4章 语法分析没有把编译成功、分析收敛或单一基准加速当作完整正确性”
第4章 语法分析 · 独立验证重放预测、单故障、恢复和不适用边界第4章 语法分析的接受、回退或拒绝理由未满足“第4章 语法分析满足“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应””
unit: "dbc-unit-04"
question: "同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?"
scenario: "对一个含优先级、结合性和错误token的表达式文法重放LL与LR分析"
invariant: "文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应"
fault: "合并LALR状态时丢失展望符,产生原文法不存在的归约"
evidence: "文法变换、项目集、分析表、栈轨迹、冲突和恢复报告"
reset: restore_concept_mode_stage_trace_step_case_gates_and_artifact

“第4章 语法分析”要求从同一源程序、文法/IR/机器版本、规则、预算和执行顺序重放参考、故障与恢复路径。重置后若目录选择、模式、阶段、轨迹步骤、案例、证据门或交付包没有回到基线,本次比较已经混入状态泄漏。

本页回顾

掌握“第4章 语法分析”不是背术语、表格或伪码,而是围绕“同一输入在分析栈、项目集和动作表中为什么移进、归约、接受或报错?”重建输入、表示、状态变换、输出、代价和独立验证,并用“文法版本、FIRST/FOLLOW、项目闭包、分析表、栈和输入指针相互对应”拒绝“合并LALR状态时丢失展望符,产生原文法不存在的归约”。最终交付为文法变换、项目集、分析表、栈轨迹、冲突和恢复报告。

练习与答案

练习

  1. 问题 1:编译合同。 “第4章 语法分析”为什么必须先冻结源程序、文法/IR/机器版本、规则、预算和验证口径?
  1. 问题 2:目录逐项覆盖。 怎样证明“第4章 语法分析”的正式目录坐标已经进入机制、交互和练习?
  1. 问题 3:故障恢复。 怎样证明“合并LALR状态时丢失展望符,产生原文法不存在的归约”已经被修正?

名词解释

名词解释

本章出现的专业名词,用大白话再讲一遍。

语法分析

检索键 dbc-A 对应正式目录坐标「第4章 语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

引论

检索键 dbc-B 对应正式目录坐标「4·1 引论」;在“第4章 语法分析”中用于把“引论”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

语法分析器的作用

检索键 dbc-C 对应正式目录坐标「4·1·1 语法分析器的作用」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

代表性的文法

检索键 dbc-D 对应正式目录坐标「4·1·2 代表性的文法」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

语法错误的处理

检索键 dbc-E 对应正式目录坐标「4·1·3 语法错误的处理」;在“第4章 语法分析”中用于把“语法错误的处理”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

错误恢复策略

检索键 dbc-F 对应正式目录坐标「4·1·4 错误恢复策略」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

上下文无关文法

检索键 dbc-G 对应正式目录坐标「4·2 上下文无关文法」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

上下文无关文法的形式定义

检索键 dbc-H 对应正式目录坐标「4·2·1 上下文无关文法的形式定义」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

符号表示的约定

检索键 dbc-I 对应正式目录坐标「4·2·2 符号表示的约定」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

推导

检索键 dbc-J 对应正式目录坐标「4·2·3 推导」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

语法分析树和推导

检索键 dbc-K 对应正式目录坐标「4·2·4 语法分析树和推导」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

二义性

检索键 dbc-L 对应正式目录坐标「4·2·5 二义性」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

验证文法生成的语言

检索键 dbc-M 对应正式目录坐标「4·2·6 验证文法生成的语言」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

上下文无关文法与正则表达式

检索键 dbc-N 对应正式目录坐标「4·2·7 上下文无关文法与正则表达式」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

文法的书写

检索键 dbc-O 对应正式目录坐标「4·3 文法的书写」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

词法分析和语法分析

检索键 dbc-P 对应正式目录坐标「4·3·1 词法分析和语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

消除二义性

检索键 dbc-Q 对应正式目录坐标「4·3·2 消除二义性」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

消除左递归

检索键 dbc-R 对应正式目录坐标「4·3·3 消除左递归」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

提取左公因子

检索键 dbc-S 对应正式目录坐标「4·3·4 提取左公因子」;在“第4章 语法分析”中用于把“提取左公因子”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

非上下文无关语言构造

检索键 dbc-T 对应正式目录坐标「4·3·5 非上下文无关语言构造」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

自顶向下的语法分析

检索键 dbc-U 对应正式目录坐标「4·4 自顶向下的语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

递归下降的语法分析

检索键 dbc-V 对应正式目录坐标「4·4·1 递归下降的语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

FIRST和FOLLOW

检索键 dbc-W 对应正式目录坐标「4·4·2 FIRST和FOLLOW」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LL(1)文法

检索键 dbc-X 对应正式目录坐标「4·4·3 LL(1)文法」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

非递归的预测分析

检索键 dbc-Y 对应正式目录坐标「4·4·4 非递归的预测分析」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

预测分析中的错误恢复

检索键 dbc-Z 对应正式目录坐标「4·4·5 预测分析中的错误恢复」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

自底向上的语法分析

检索键 dbc-AA 对应正式目录坐标「4·5 自底向上的语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

归约

检索键 dbc-AB 对应正式目录坐标「4·5·1 归约」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

句柄剪枝

检索键 dbc-AC 对应正式目录坐标「4·5·2 句柄剪枝」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

移进-归约语法分析

检索键 dbc-AD 对应正式目录坐标「4·5·3 移进-归约语法分析」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

移进-归约语法分析中的冲突

检索键 dbc-AE 对应正式目录坐标「4·5·4 移进-归约语法分析中的冲突」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LR语法分析技术介绍

检索键 dbc-AF 对应正式目录坐标「4·6 LR语法分析技术介绍:简单LR」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

为什么使用LR语法分析器

检索键 dbc-AG 对应正式目录坐标「4·6·1 为什么使用LR语法分析器」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

项和LR(0)自动机

检索键 dbc-AH 对应正式目录坐标「4·6·2 项和LR(0)自动机」;在“第4章 语法分析”中用于把字符位置、正则规则、自动机状态、最长匹配和token属性连接起来,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LR语法分析算法

检索键 dbc-AI 对应正式目录坐标「4·6·3 LR语法分析算法」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

构造SLR语法分析表

检索键 dbc-AJ 对应正式目录坐标「4·6·4 构造SLR语法分析表」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

可行前缀

检索键 dbc-AK 对应正式目录坐标「4·6·5 可行前缀」;在“第4章 语法分析”中用于把“可行前缀”放进文法、分析表、栈与错误恢复的输入—状态—变换—验证链,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

更强大的LR语法分析器

检索键 dbc-AL 对应正式目录坐标「4·7 更强大的LR语法分析器」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

规范LR(1)项

检索键 dbc-AM 对应正式目录坐标「4·7·1 规范LR(1)项」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

构造LR(1)项集

检索键 dbc-AN 对应正式目录坐标「4·7·2 构造LR(1)项集」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

规范LR(1)分析表

检索键 dbc-AO 对应正式目录坐标「4·7·3 规范LR(1)分析表」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

构造LALR分析表

检索键 dbc-AP 对应正式目录坐标「4·7·4 构造LALR分析表」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LALR分析表的高效构造

检索键 dbc-AQ 对应正式目录坐标「4·7·5 LALR分析表的高效构造」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LR分析表的压缩

检索键 dbc-AR 对应正式目录坐标「4·7·6 LR分析表的压缩」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

使用二义性文法

检索键 dbc-AS 对应正式目录坐标「4·8 使用二义性文法」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

用优先级和结合性解决冲突

检索键 dbc-AT 对应正式目录坐标「4·8·1 用优先级和结合性解决冲突」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

悬空else二义性

检索键 dbc-AU 对应正式目录坐标「4·8·2 悬空else二义性」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

LR语法分析中的错误恢复

检索键 dbc-AV 对应正式目录坐标「4·8·3 LR语法分析中的错误恢复」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

语法分析器生成工具

检索键 dbc-AW 对应正式目录坐标「4·9 语法分析器生成工具」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

语法分析器生成工具Yacc

检索键 dbc-AX 对应正式目录坐标「4·9·1 语法分析器生成工具Yacc」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

使用Yacc处理二义性文法

检索键 dbc-AY 对应正式目录坐标「4·9·2 使用Yacc处理二义性文法」;在“第4章 语法分析”中用于让产生式、推导、分析选择、语义动作和树/IR状态逐步对应,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

用Lex创建Yacc词法分析器

检索键 dbc-AZ 对应正式目录坐标「4·9·3 用Lex创建Yacc词法分析器」;在“第4章 语法分析”中用于声明阶段接口、名字/类型/状态角色和源—目标语义映射,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

Yacc中的错误恢复

检索键 dbc-BA 对应正式目录坐标「4·9·4 Yacc中的错误恢复」;在“第4章 语法分析”中用于构造项目集与分析表并重放栈、输入和错误恢复决定,需要连接原版范围、状态轨迹、等价性证据和不适用边界。

讨论

评论区加载中…