Ç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再次分为以下几类:
- 左递归语法(具有左递归)
- 右递归语法(具有右递归)
- 通用递归语法(具有通用递归)
注意:线性语法是一种上下文无关的语法,每个语法的右侧最多具有一个非终结符。