“文法歧义以一个字是否拥有两棵不同语法树定义。Chomsky 范式把内部节点限制为二叉结构,使 CYK 动态规划可按区间构造可能的树根。”
形式陈述 ​
上下文无关文法
语言
直觉
歧义意味着同一输入可以被文法赋予两种不同层次结构,而不只是推导步骤顺序不同。对程序表达式,这两棵树往往对应不同求值,例如先加后乘与先乘后加。消除歧义的常见做法是把优先级和结合性编码进非终结符层次,使每个操作数只能出现在恰当位置。语言是否固有歧义更深:它问能否换一套文法彻底解决,而不是能否修补当前规则。
例子与边界
文法
对 id+id*id 有两棵树,分别表示 E→E+T|T、T→T*F|F、F→id|(E) 固定乘法高优先级和左结合。
边界是同一棵树的不同展开次序:先展开左子树或右子树可形成不同普通推导,却不构成歧义。解析器的 shift/reduce 冲突提示某种不确定性,但冲突也可能由解析算法或文法表示方式造成,不能无条件等同于语言固有歧义。
同样,解析器用优先级或结合性规则强制选出一棵树,只是给原文法外加消歧策略,并没有证明原 CFG 本身无歧义。
推论与应用
歧义直接影响语法树、编译器语义动作和自然语言解析。操作符优先级、悬挂 else、模式匹配结合方式都需要通过文法改写或外部消歧规则处理。
它位于上下文无关文法理论的算法边界:成员资格可判定,文法等价与歧义性却不可判定。无歧义文法还可用于定义唯一概率解析或唯一代码生成结构。
参考资料
- 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。