Ç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又可以分为以下几种:
- 左递归语法(有左递归)
- 右递归语法(具有正确的递归)
- 一般递归语法(具有一般递归)
注意:线性文法是一种上下文无关文法,它的每个产生式的右侧最多有一个非终结符。