您还可以阅读我们之前讨论的有关上下文无关文法的分类的文章。
Çontext˚FREEģrammars(CFGS)被分类基于:
- 派生树数
- 字符串
根据派生树数,CFG细分为两种类型:
- 模棱两可的语法
- 明确的语法
模棱两可的语法:甲CFG是如果存在对于给定的输入字符串即超过一个派生树到所述暧昧,多于一个L EFT中号OST d erivationŤREE(LMDT)或R飞行中号OST d erivationŤREE(RMDT)。定义: G =(V,T,P,S)是仅当T *中存在一个字符串大于解析树上的字符串,CFG才被认为是模棱两可的。
其中V是变量的有限集合。
T是端子的有限集合。
P是形式为A->α的有限乘积集,其中A是变量,而α∈(V∪T)* S是指定的变量,称为开始符号。例如: 1.让我们考虑一下这种语法: E-> E + E | id
我们可以根据该语法创建2个解析树,以获得字符串id + id + id :
以下是由最左导数生成的2个解析树:
以上两个解析树都源自相同的语法规则,但两个解析树均不同。因此,语法是模棱两可的。 2.现在让我们考虑以下语法:
Set of alphabets ∑ = {0,…,9, +, *, (, )}
E -> I
E -> E + E
E -> E * E
E -> (E)
I -> ε | 0 | 1 | … | 9
从上面的语法中,可以通过两种方式得出字符串3 * 2 + 5 :
I) First leftmost derivation II) Second leftmost derivation
E=>E*E E=>E+E
=>I*E =>E*E+E
=>3*E+E =>I*E+E
=>3*I+E =>3*E+E
=>3*2+E =>3*I+E
=>3*2+I =>3*2+I
=>3*2+5 =>3*2+5
以下是歧义语法的一些示例:
- S-> aS | Sa | Є
- E-> E + E | E * E | ID
- A-> AA | (A)|一种
- S-> SS | AB,A-> Aa | a,B-> Bb | b
而以下语法是明确的:
- S->(L)| a,L-> LS |小号
- S-> AA,A-> aA,A-> b
天生含糊的语言:令L为上下文无关语言(CFL)。如果每个语言L = L(G)的上下文无关文法G都是模棱两可的,则称L本质上是模棱两可的语言。歧义是语法的属性,而不是语言的属性。模棱两可的语法不太可能对编程语言有用,因为同一字符串(程序)的两个解析树结构(或多个解析树)暗含该程序的两种不同含义(可执行程序)。
固有的模棱两可的语言绝对不适合用作编程语言,因为我们没有任何办法为其所有程序固定唯一的结构。
例如,
L = {anbncm} ∪ {anbmcm}
注意:语法的歧义性是不确定的,即没有消除语法歧义性的特定算法,但是我们可以通过以下方法消除歧义性:消除语法歧义,即重写语法,以使语法表示的语言字符串只有一个派生树或解析树。