为什么没有';Antlr中语法的左递归删除选项是什么?

为什么没有';Antlr中语法的左递归删除选项是什么?,antlr,grammar,left-recursion,Antlr,Grammar,Left Recursion,在用Antlr编写语法的过程中,有几次我遇到了左递归,这就是为什么我问自己为什么没有自动删除它的工具。在我做了一些研究之后,我发现了两种处理这个问题的方法——Paull算法和Robert C.Moore的著作《从上下文无关文法中移除左递归》,2000年《代码》中讨论的左角变换。我注意到Paull的算法非常不切实际,但另一方面,左角变换只会将语法规则的数量从O(n)增加到O(n^2),但大多数时间比这要低得多,这使得该算法非常有效。因此,我的问题是:左递归删除不是故意实现的,而是将责任留给语法实现

在用Antlr编写语法的过程中,有几次我遇到了左递归,这就是为什么我问自己为什么没有自动删除它的工具。在我做了一些研究之后,我发现了两种处理这个问题的方法——Paull算法和Robert C.Moore的著作《从上下文无关文法中移除左递归》,2000年《代码》中讨论的左角变换。我注意到Paull的算法非常不切实际,但另一方面,左角变换只会将语法规则的数量从
O(n)
增加到
O(n^2)
,但大多数时间比这要低得多,这使得该算法非常有效。因此,我的问题是:左递归删除不是故意实现的,而是将责任留给语法实现者,还是不将其视为一种选择?

这个答案有两个部分

  • ANTLR 4确实删除了直接左递归
  • 一般来说,对于实文法,左递归消除更为复杂。ANTLR生成的递归下降解析器与生成它们的语法非常相似。左递归消除必须考虑谓词,嵌入动作,参数,局部变量,和(ANTLR 3)AST操作。之所以没有创建该工具,是因为它必须介于不完整(对支持的构造的限制)、不准确(不能生成行为正常的解析器)和不现实的复杂之间