2.3.5 递归规则与文法的递归性
1. 递归规则
所谓递归规则,是指在规则的左部和右部具有相同非终结符的规则。
如果文法中有规则 A → A … 称为规则左递归。
如果文法中有规则 A → … A 称为规则右递归。
如果文法中有规则 A → … A … 称为规则递归。
2. 文法的递归性
文法的递归性是指对文法中任一非终结符,若能建立一个推导过程,在推导所得的符号串****中又出现了该非终结符本身,则文法是递归性的,否则是无递归性的。
若文法中有推导 A ⇒+ A … 称文法左递归。
若文法中有推导 A ⇒+… A 称文法右递归。
若文法中有推导 A ⇒+… A … 称文法递归。
例如,文法中有如下规则:
U → Vx
V →Uy| z
这三条规则都不是递归规则,但有 U ⇒+ Uyx ,则该文法是左递归的。
在文法中使用递归规则,使得我们能用有限的规则去定义无穷集合的语言。
【例 2.11 】
考虑文法 G [ A ]:
A → aB | bB
B → a | b
由于该文法无递归性,由它所描述的语言是有穷的。该文法描述的语言为 L ( G [ A ]) ={aa , ab , ba , bb }
。
【例 2.12 】
考虑文法 G [ N 1 ]:
N 1 → N
N → ND | D
D →0|1|2
该文法有直接左递归规则 N → ND ,则称该文法为左递归文法或称文法左递归,其定义的语言为{0 , 1 , 2 }+ 。
由于文法中使用了递归规则,使得我们可用有限的规则去刻画无穷集合的语言。若不用递归规则来定义文法,要表示无穷集合的语言需要用无穷多条规则。例如,例 2.12 中若不用递归规则 N → ND ,则需要用 N → D | DD | DDD | … 即无穷多条规则来定义由数字 0 ,1 , 2 组成的所有无符号整数。
也就是说,当一个语言是无穷集合时,则定义该语言的文法一定是递归的。
需要指出的是,程序设计语言都是无穷集合,因此描述它们的文法必定是递归的。