消除特定语法的左递归

时间:2014-05-06 14:19:11

标签: left-recursion

我已经浏览了一百万个示例/教程,但我仍然无法为此语法消除左递归:

S --> C
C --> Dc|c
D --> Cd|d

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先通过消除D来间接递归到一个直接递归。你只有两个非终结符,所以它可以完成。

S --> C
C --> Cdc|dc|c

然后你可以努力使其尾递归:

S --> C
C --> dcC'|cC'
C'--> dcC'

第二部分的技巧是从C(这里是dc和c)得到所有终端并给它们一个尾部(C - > dcC' | cC')。此dc和c与第一个规则集中Cdc之后的终端集相同。然后为新的非终结符(尾部)创建一个规则,并将其放在第一个规则的终端之后(即,此dc来自Cdc)。

更清楚:

S --> C
C --> Db|f
D --> Ca|c

-->

S --> C
C --> Cab|cb|f

-->

S --> C
C --> cbC'|fC'
C'--> abC'