如何消除下述文法的二义性?目标字符串为bbaaa
如何将歧义文法转换为无二义性文法
首先,我们先拆解你遇到的这个文法问题:
原文法 S -> Sa | SbSa | ε 之所以存在歧义,是因为生成某些字符串时存在多种推导路径——比如你的目标字符串 bbaaa,原文法可以通过不同的规则应用顺序得到它,导致推导树不唯一。
要构造无二义性文法,核心是给推导过程规定唯一的生成顺序,避免分支选择的模糊性。针对这个文法对应的语言(所有满足「总a数≥b数,且任意后缀中a数≥b数」的a/b字符串),我们可以设计如下无二义文法:
S -> a S | T T -> b S a | ε
为什么这个文法无二义?
这个文法通过明确的规则限制了推导的选择:
- 如果字符串以
a开头,只能用S -> a S规则,递归推导剩余的子串; - 如果字符串以
b开头,必须用T -> b S a规则(因为S的另一个分支是a S,无法生成b开头的串),这意味着每个b必须对应后面的一个a,中间的部分由S递归生成,完全消除了选择歧义。
用目标字符串bbaaa验证推导过程
唯一的推导路径如下:
S → T → b S a → b T a → b (b S a) a → b b (a S) a a → b b a (T) a a → b b a ε a a → bbaaa
整个过程每一步都没有其他规则可选,推导树完全唯一,不存在歧义。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

