📜  上下文无关文法的分类

📅  最后修改于: 2021-06-28 07:28:17             🧑  作者: Mango

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

1)根据生成的字符串数。

  • 如果CFG生成有限数量的字符串,则CFG为非递归(或语法称为非递归语法)
  • 如果CFG可以生成无数个字符串,则该语法被称为递归语法

在编译期间,解析器使用语言的语法从源代码中生成解析树(或派生树)。使用的语法必须明确。不得使用歧义语法进行解析。 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再次分为以下几类:

  • 左递归语法(具有左递归)
  • 右递归语法(具有右递归)
  • 通用递归语法(具有通用递归)

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