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

时间:2013-07-16 20:35:57

标签: parsing antlr grammar antlr4 antlrworks

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


a[int x]
    : b a[$x] c
    | a[$x - 1] 
    (
          c a[$x - 1]
        | b c
    )
    ;

问题在于涉及左递归的第二种选择。任何形式的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

a的左递归替代匹配 n 次时,这只意味着(c a | b c)将匹配 n 次,使用终止b a c(第一个替代)。这意味着此规则始终以b a c开头,然后出现零次或多次(c a | b c)

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