Recursion 从CFG中删除左递归

Recursion 从CFG中删除左递归,recursion,context-free-grammar,left-recursion,Recursion,Context Free Grammar,Left Recursion,以下语法保留了递归: T -> Tx | TYx | YX | x X -> xx Y -> Yy | Yx | y A -> A a1 | A a2 | ... | b1 | b2 | ... # converts to A -> b1 A' | b2 A' | ... A' -> e | a1 A' | a2 A' | ... # where e = epsilon 如何删除左递归。我读过维基百科的解释,但我对CFGs

以下语法保留了递归:

T -> Tx | TYx | YX | x
X -> xx
Y -> Yy | Yx | y
A -> A a1 | A a2 | ... | b1 | b2 | ...
# converts to
A  -> b1 A' | b2 A' | ...
A' -> e | a1 A' | a2 A' | ...                 # where e = epsilon

如何删除左递归。我读过维基百科的解释,但我对CFGs还相当陌生,所以它没有太多意义。谢谢你的帮助?简单的英语解释更为可取。

在本例中,您可以按照Robert C.Moore的方法将具有左递归的规则转换为具有右递归的规则:

T -> Tx | TYx | YX | x
X -> xx
Y -> Yy | Yx | y
A -> A a1 | A a2 | ... | b1 | b2 | ...
# converts to
A  -> b1 A' | b2 A' | ...
A' -> e | a1 A' | a2 A' | ...                 # where e = epsilon
在我们的第一个例子中:
A=T,a1=x,a2=Yx,b1=y,b2=x
。。。(类似于
Y


YXT'
是否仍然是递归的?同样,对于
YxT'
&
YxY'
?还是我遗漏了什么。谢谢你。它非常有用。或者不是左递归的,因为这些元素的左侧会导致不同的非终端,而不是它的来源?
T'->YxT'
是右递归的,但不是左递归的(不可能让T'在左侧)。ooops:
YxY'
是一个打字错误(更正为
xY'
)。