从CFG中删除左递归

Jam*_*nks 4 recursion context-free-grammar left-recursion

以下语法已经离开了递归:

T -> Tx | TYx | YX | x
X -> xx
Y -> Yy | Yx | y
Run Code Online (Sandbox Code Playgroud)

你如何去除左递归.我阅读了维基百科的解释,但我对CFG很新,所以它没有多大意义.任何帮助表示赞赏?一个简单的英语解释将更加赞赏.

And*_*den 5

在此示例中,您可以按照Robert C. Moore的常规算法将带有左递归的规则转换为具有正确递归的规则:

A -> A a1 | A a2 | ... | b1 | b2 | ...
# converts to
A  -> b1 A' | b2 A' | ...
A' -> e | a1 A' | a2 A' | ...                 # where e = epsilon
Run Code Online (Sandbox Code Playgroud)

在我们的第一个案例中: A=T, a1=x, a2=Yx, b1=y, b2=x ......(同样如此Y)

T  -> YXT' | xT'
T' -> e | xT' | YxT'
X  -> xx
Y  -> yY'
Y' -> e | yY' | xY' 
Run Code Online (Sandbox Code Playgroud)