在我的语法中间接左递归?

时间:2015-11-12 12:59:00

标签: parsing recursion compiler-construction grammar left-recursion

我的语法似乎有一个间接左递归的情况,看了一些其他类似的问题,不能完全建立它们和我的语法之间的心理联系,我无法理解如何解决它。

A  ::= A' a
     | A
     | b

A' ::= c
     | A
A'调用

A,但A'cA,这会导致左递归,如何将其重新排列为等效语法,同时消除左递归?

1 个答案:

答案 0 :(得分:1)

您有以下作品:

1:  A  -> A' a
2:  A  -> A
3:  A  -> b
4:  A' -> c
5:  A' -> A

首先请注意,制作#2会使这种语法含糊不清,实际上有点毫无意义。我们将其删除。

1:  A  -> A' a
3:  A  -> b
4:  A' -> c
5:  A' -> A

维基百科上的“左递归”文章包含(无源)algorithm to eliminate all left recursion,包括间接左递归。让我们忽略这个特定的算法并转而关注这个想法:首先将间接递归转换为通过替换直接递归,然后通过添加尾部非终端来解决直接递归。

例如,我们可以用生成#1中的A'替换为

6:  A  -> c a    (see #1 and #4)
7:  A  -> A a    (see #1 and #5)

语法如下:

4:  A' -> c
5:  A' -> A
6:  A  -> c a
7:  A  -> A a

我们已经将所有间接递归转换为直接递归。剩下的就是删除A的直接递归:

4:  A' -> c
5:  A' -> A
6:  A  -> c a T
8:  T  -> epsilon
9:  T  -> a T