编译原理判断文法的二义性

下列文法是二义的吗?为什么?

文法G=({A,B,S},{a,b,c}P,S),其中P为S→Ac|aB,A→ab,B→bc

答:最右推导:S=>Ac =>abc

                         S=>aB =>abc,

即存在两个不同的最右推导,所以该文法是二义的。

或者:

对输入字符串abc,能够造出如下两颗不同的语法树,所以该文法是二义的。

⭐⭐⭐那么问题来啦,怎么判断文法是不是具有二义性捏?

其实很简单,就看这个文法的某个句子如果有两个不同的最右(最左)推导,那这个文法就有二义性。

⭐⭐⭐又或者说可以用如下方法判断非二义性,

扫描二维码关注公众号,回复: 14621149 查看本文章

1.求出文法所有非终结符号的First集,

2.求出文法所有非终结符号的Follow集,

3.进行两步判断:

(1)非终结符号A的任何两个候选式的first集合不相交

(2)f若A的某个候选式可以推导出ε,则其它候选式的First集与Follow(A)不相交。

满足以上两个条件的文法一定是非二义性的。
 

猜你喜欢

转载自blog.csdn.net/qq_60536278/article/details/127342489