📜  上下文无关语法的分类

📅  最后修改于: 2021-09-27 22:53:24             🧑  作者: Mango

Çontext˚FREEģrammars(CFG)可以以下两个属性的基础上进行分类:

1) 基于它生成的字符串数量。

  • 如果 CFG 生成的字符串数量有限,则 CFG 是Non-Recursive (或者说该文法是 Non-recursive 文法)
  • 如果 CFG 可以生成无限数量的字符串,则称该文法为递归文法

在 Compilation 期间,解析器使用语言的语法从源代码中生成解析树(或派生树)。使用的语法必须是明确的。歧义文法不能用于解析。 2) 基于推导树的数量。

  • 如果只有 1 个派生树,则 CFG 是明确的。
  • 如果推导树超过 1 个,则 CFG 是不明确的。

递归和非递归语法的例子

递归语法

1) S->SaS    
   S->b

上述语法生成的语言(字符串集)是:{b, bab, babab,…},是无限的。

2) S-> Aa
   A->Ab|c

上述语法生成的语言是:{ca, cba, cbba …},无穷大。
注意:不包含无用规则的递归上下文无关文法必然会产生无限语言。

非递归语法

S->Aa
   A->b|c

上述文法生成的语言是:{ba, ca},是有限的。

递归语法的类型

根据递归文法中递归的性质,递归CFG又可以分为以下几种:

  • 左递归语法(有左递归)
  • 右递归语法(具有正确的递归)
  • 一般递归语法(具有一般递归)

注意:线性文法是一种上下文无关文法,它的每个产生式的右侧最多有一个非终结符。