“编译器与数据格式通常选用 CFG,以便从 token 流恢复嵌套结构;字符串重写、语法变换和可计算性研究则会使用更一般的文法。语法树记录一次 CFG 推导的层次结构,但一般文法的规则左侧可跨…”
形式陈述 ​
给定CFG
一个字
直觉
推导序列按时间记录“先展开哪个非终结符”,语法树则只保留最终的层次结构。两个推导若只是交换独立子树的展开顺序,会得到同一棵树;真正影响语法含义的是节点如何分组。树的叶序列还原输入,内部节点解释输入怎样由文法构造。它比 AST 更贴近具体文法,可能保留括号和辅助非终结符;编译器随后常把这些表面层次压缩成抽象语法。
例子与边界
对文法 aabb,根用 a a ε b b,产出 aabb。无论先展开外层树中哪个已经出现的非终结符,固定树对应的最左推导仍唯一。
边界是把“两个不同推导序列”直接当作歧义。只有得到不同语法树,等价地得到不同最左推导或最右推导,才构成文法歧义。语法树也不自动包含标识符绑定、类型和源位置,这些通常是后续 AST 注解。
推论与应用
文法歧义以一个字是否拥有两棵不同语法树定义。Chomsky 范式把内部节点限制为二叉结构,使 CYK 动态规划可按区间构造可能的树根。
解析器生成的具体语法树经消除辅助节点得到抽象语法树;属性文法、语义动作和类型检查再沿树传播信息。
参考资料
- John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006,Chs. 1–9。
- Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013,Chs. 0–10。