Compiler construction 手工去除左递归算法

Compiler construction 手工去除左递归算法,compiler-construction,grammar,Compiler Construction,Grammar,我不确定如何完成此语法的左递归删除算法 S ::= a B | B S b | S a | S B A | b B ::= S b A | B B | A S B | a D ::= b a | S b A ::= b S A | b | a b 这是我的工作 using the order S, B, D, A. S ::= a B M | B S b M | b M M ::= a M | B A M | ε B ::= a B M b A | B S b M b A | b M b

我不确定如何完成此语法的左递归删除算法

S ::= a B | B S b | S a | S B A | b
B ::= S b A | B B | A S B | a
D ::= b a | S b
A ::= b S A | b | a b
这是我的工作

using the order S, B, D, A.

S ::= a B M | B S b M | b M
M ::= a M | B A M | ε

B ::= a B M b A | B S b M b A | b M b A | B B | A S B | a

B ::= a B M b A N | b M b A N | A S B b A N | a N
N ::= S b M N | B N | ε
我应该如何从这里开始

鉴于以下规则:

A → Aα1 | ... | Aαm | β1 | ... | βn
如果βi是非左递归右侧,则写入:

A → β1 A' | ... | βn A'
A' → α1 A' | ... | αm A' | ε
要删除所有左递归,请使用此算法,为每个非终端分配一个数字,A1…An,以及:

for(int i = 1; i <= n; i++)
    for(int j = 1; j < i; j++)
        foreach(Ai → Ajα && Aj → β1 | ... | βn)
            replace with Ai → β1α |... | βnα
   remove left recursion from Ai
for(int i=1;i