Recursion 不带后续字符串的左递归

Recursion 不带后续字符串的左递归,recursion,compiler-construction,left-recursion,Recursion,Compiler Construction,Left Recursion,我对维基百科有以下两种定义: 左递归 当且仅当存在非终结符时,文法是左递归的 一种符号,可以派生成句子形式,并以自身为中心 最左边的符号。象征性地, A.⇒ Aα在哪里⇒ 表示进行一个或多个替换的操作,α是终端符号和非终端符号的任意序列 及 直接左递归 当定义只能用一个替换来满足时,就会发生直接左递归。它需要一个形式为a的规则⇒ Aα,其中α是非终结符和终结符的序列 举个例子: S → AB A → B | ab | abc B → A | d | cd 这不是关于左递归本身,而是关于α。α

我对维基百科有以下两种定义:

左递归

当且仅当存在非终结符时,文法是左递归的 一种符号,可以派生成句子形式,并以自身为中心 最左边的符号。象征性地, A.⇒ Aα在哪里⇒ 表示进行一个或多个替换的操作,α是终端符号和非终端符号的任意序列

直接左递归

当定义只能用一个替换来满足时,就会发生直接左递归。它需要一个形式为a的规则⇒ Aα,其中α是非终结符和终结符的序列

举个例子:

S → AB
A → B | ab | abc
B → A | d | cd
这不是关于左递归本身,而是关于α。α允许是空字(作为终端)还是空字符串?在所有间接左递归的例子中,总是有一个α型

A→巴布或 B→Ab


但我不知道如何争论,如果→ B和B→ A(因此没有任何α可遵循)。根据定义,它仍然是左递归吗?

α可以是任何终端序列​ 和非终端,包括空序列

但是,形式为
a的生成→ 一个
是没有意义的。更糟糕的是,它会产生歧义,因为它可以在派生中应用任意次数,因此无法确定地解析gramar。如果存在循环间接派生(
a⇒ A
在您的符号中)。这就是为什么你很少在例子中找到这样的例子。但它们仍然是递归的。(它们也是右递归的。)

单位产量(
A)→ B
其中A和B是不同的)是非常常见的,应该不会有问题。显然,在分析语法时需要考虑它们。但我不认为这是你的问题