Parsing 如何删除以下语法中的左递归?

Parsing 如何删除以下语法中的左递归?,parsing,antlr,grammar,antlr4,antlrworks,Parsing,Antlr,Grammar,Antlr4,Antlrworks,不幸的是,当规则传递了参数时,ANTLR不可能支持直接左递归。唯一可行的选择是删除左递归。在下面的语法中有没有删除左递归的方法 问题出现在涉及左递归的第二个备选方案中。非常感谢您提供的任何帮助。如果没有参数和更简单的格式设置,它将如下所示: a : b a c | a (c a | b c) ; 当a的左递归备选方案匹配n次时,这意味着(c a | b c)将匹配n次,与终止的b a c(第一个备选方案)一起等待。这意味着此规则将始终以BAC开头,然后是零次或多次出现的(CAC):

不幸的是,当规则传递了参数时,ANTLR不可能支持直接左递归。唯一可行的选择是删除左递归。在下面的语法中有没有删除左递归的方法




问题出现在涉及左递归的第二个备选方案中。非常感谢您提供的任何帮助。

如果没有参数和更简单的格式设置,它将如下所示:

a
 : b a c
 | a (c a | b c)
 ;
a
的左递归备选方案匹配n次时,这意味着
(c a | b c)
将匹配n次,与终止的
b a c
(第一个备选方案)一起等待。这意味着此规则将始终以
BAC
开头,然后是零次或多次出现的
(CAC)

a
 : b a c
 | a (c a | b c)
 ;
a
 : b a c (c a | b c)*
 ;