形式陈述
若某 CFG 存在一个词具有两棵不同解析树,等价地具有两个不同最左推导,则该文法有歧义。若一个上下文无关语言的每个生成文法都有歧义,则称其固有歧义。歧义是文法属性,不是单纯的语言成员资格属性;判定任意 CFG 是否有歧义是不可判定问题。
直觉
有歧义意味着同一个符号串拥有两种结构解释。词本身没有告诉解析器应选哪棵树,因此后续求值、类型或翻译可能产生不同结果。
例子与边界
文法 a+a*a 有两种树。通过分层非终结符
推论与应用
识别和控制歧义是编程语言语法、自然语言处理与协议格式设计的核心工作;LL/LR 文法类通过更强的确定性条件换取可预测解析。
参考资料
- 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。