1

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


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

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

4

1 回答 1

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)*
 ;
于 2013-07-16T20:42:30.507 回答