首页 > 代码库 > 文法的二义性和化简
文法的二义性和化简
1,判断一个文法是否存在二义性
一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性。如果一个文法含有二义性的句子,则该文法具有二义性。这里的二义性是指语法结构上的。如果一个句子具有二义性,那么对于这个句子的结构可能有多种“正确”的解释。通常情况下,句子的语义要通过其语法结构来定义,所以,二义性一般是有害的。
2,文法的二义性是否能够判定呢???
文法的二义性是不可判定的。即不存在一个算法,它能在有限的步骤内确切地判定一个文法是否具有二义性。
3,怎么消除文法的二义性
a,从语义解释方面加以限制
b,重新构造一个等价的无二义性文法
4,文法的化简
a,无用非终结符号和不可达文法符号的产生式应删除
b,单产生式应删除 (对于形如 A→A 的产生式,即使A是一个有用的符号,此类产生式也是不必要的。并且,如果一个句型中含有非终结符号A,那么可任意多次使用产生式A→A,这除了使同一句型具有不同的语法树即引起二义性外,别无其它作用。因而一开始我们就可将这样的产生式从文法中删去)
PS:把右部仅含一个非终结符号的产生式,即形如A→B (A,B∈Vn)的产生式称为单产生式。
c,ε 产生式应删除
PS:所谓 ε 产生式,是指右部为单一空符号串 ε 的产生式。
5,无用非终结符号
如果文法的某个非终结符不出现在文法的任何一个句型中,并且不能从它推导出终结符号串,则称该非终结符为无用非终结符号。
for example:
设文法G[A]:
A→aaBbb
B→aBb|ab
C→cD|c
D→Ef
PS:此文法中的非终结符号D 与E ,不可能出现在任何一个句型中,而且不能从它们推导出终结符号串,所以,D与E是无用非终结符号(且非终结符C 是一个不可达的文法符号)。
6,不可达文法符号
如果一个非终结符号不出现在文法的任何一条产生式的右部,则称该非终结符为不可达文法符号。对于上例文法G[A] 中非终结符C 就是一个不可达的文法符号。
PS:不可达文法符号和无用非终结符号都不可能出现在文法的句型中,也就是说,它们对于生成文法的语言都毫无意义,或者说包含不可达文法符号和无用非终结符号的产生式对于文法来讲都是多余的。
7,可空非终结符
对2 型文法可进行扩充,允许产生式中包含空产生式。如果某个非终结符号能直接推导出 ε(A→ ε) ,那么这个非终结符号称为可空非终结符。2 型文法添加空产生式之后,文法的语言除了增加一个空串 ε 之外,并没有改变文法的类型。
本文出自 “珞辰的博客” 博客,谢绝转载!
文法的二义性和化简