我已经浏览了一百万个示例/教程,但我仍然无法为此语法消除左递归:
S --> C
C --> Dc|c
D --> Cd|d
有什么想法吗?
答案 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'