(请先看置顶博文)本博打开方式,请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净
学编译原理时,会学到文法,老师在介绍完文法的相关定义后又介绍了文法的二义性,但是没说到底是如何避免文法的二义性的。
这篇博文就是我的学习结果
文法的二义性:如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。
我举个例子,来说明文法的二义性及其避免方法:
有下面这个文法:
S - >S and S | S or S | not S | p | q | (S)
那么要是得到 not p and q:
其推导过程如下:都用最左推导
A、S -> not S
-> not S and S
-> not p and S
-> not p and q
B、S -> S and S
-> not S and S
-> not p and S
-> not p and q
显然这两个推导过程不同,说明与两个过程相对应的语法树也不同,所以,此文法具有二义性。
那么怎么修改呢?
这就到了消除二义性的方法了:
1、人为规定其中的“not”,“and”,“or”的优先级
依照此法,可将上述文法修改为:
S -> S or T | T
T -> T and F | F
F -> not F | (E) | p | q
2、第二种方法就是重写文法
文中的文法例子来源于:如何消除文法的二义性_dianaaaaa的博客-CSDN博客_消除二义性,这个博客是我在寻找方法的时候学习的,但是他写的没我的详细,哈哈!