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

时间:2013-08-23 10:58:32

标签: antlr grammar left-recursion

在我在Antlr中编写语法的过程中,有几次我遇到了左递归,这就是为什么我问自己为什么没有自动删除它的工具。在我做了一些研究之后,我发现了两种处理这个问题的方法--Paul的算法和Robert C. Moore的工作Removing Left Recursion from Context-Free Grammars, 2000中讨论的左角变换。我注意到Paull的算法是一个非常不切实际的算法,但另一方面左角变换只会将语法规则的数量从O(n)增加到O(n^2),但大部分时间都远低于此该算法非常有效。所以我的问题是:左递归删除是不是故意实现的,而是将责任留给了语法实现者,或者它不被视为一种选择?

1 个答案:

答案 0 :(得分:2)

这个答案的两个部分。

  1. ANTLR 4 删除直接左递归。
  2. 通常,对于真正的语法,左递归消除更复杂。 ANTLR生成递归下降解析器,它们与生成它们的语法非常相似。左递归消除必须考虑谓词,嵌入式动作,参数,局部变量和(对于ANTLR 3)AST操作。该工具未被创建,因为它必然介于不完整(对受支持的构造的限制),不准确(不会产生行为正常的解析器)和不切实际的复杂之间。