0

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

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 | ε

我应该如何从这里进步?

4

1 回答 1

2

出自龙书

给定以下规则:

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
于 2013-11-02T02:37:26.987 回答