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'
)。