编译原理:文法及其二义性(判定及消除)

(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419

学编译原理时,会学到文法,老师在介绍完文法的相关定义后又介绍了文法的二义性,但是没说到底是如何避免文法的二义性的。

这篇博文就是我的学习结果

文法的二义性:如果文法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、第二种方法就是重写文法

文中的文法例子来源于:https://blog.csdn.net/chunjiekid/article/details/82319161,这个博客是我在寻找方法的时候学习的,但是他写的没我的详细,哈哈!

你可能感兴趣的:(Compile)