下列文法是二义的吗?为什么?
文法G=({A,B,S},{a,b,c}P,S),其中P为S→Ac|aB,A→ab,B→bc
答:最右推导:S=>Ac =>abc
S=>aB =>abc,
即存在两个不同的最右推导,所以该文法是二义的。
或者:
对输入字符串abc,能够造出如下两颗不同的语法树,所以该文法是二义的。
⭐⭐⭐那么问题来啦,怎么判断文法是不是具有二义性捏?
其实很简单,就看这个文法的某个句子如果有两个不同的最右(最左)推导,那这个文法就有二义性。
⭐⭐⭐又或者说可以用如下方法判断非二义性,
1.求出文法所有非终结符号的First集,
2.求出文法所有非终结符号的Follow集,
3.进行两步判断:
(1)非终结符号A的任何两个候选式的first集合不相交
(2)f若A的某个候选式可以推导出ε,则其它候选式的First集与Follow(A)不相交。
满足以上两个条件的文法一定是非二义性的。