📜  歧义语法

📅  最后修改于: 2021-06-28 06:55:36             🧑  作者: Mango

您还可以阅读我们之前讨论的有关上下文无关文法的分类的文章。

Ç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个解析树:

解析树(3)

以上两个解析树都源自相同的语法规则,但两个解析树均不同。因此,语法是模棱两可的。 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} 

注意:语法的歧义性是不确定的,即没有消除语法歧义性的特定算法,但是我们可以通过以下方法消除歧义性:消除语法歧义,即重写语法,以使语法表示的语言字符串只有一个派生树或解析树。