[英]Indirect left recursion in my grammar?
我的语法似乎有间接左递归的情况,研究了其他一些类似的问题,无法在它们和我的语法之间建立一种精神上的联系,我无法理解如何解决它。
A ::= A' a
| A
| b
A' ::= c
| A
从A
调用A'
,但是A'
是c
或A
,这导致左递归,如何在消除左递归的同时将其重新排列为等效语法?
您有以下作品:
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
Wikipedia上的“左递归”文章包含一种(未提供资源) 算法,可消除所有左递归 ,包括间接左递归。 让我们忽略此特定算法,而将注意力集中在此概念上:首先将间接递归转换为通过替换进行的直接递归,然后通过添加尾部非终结符来解决直接递归。
例如,我们可以A'
生产中的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.