不幸的是,当规则传递参数时, ANTLR 不支持直接左递归。唯一可行的选择是删除左递归。有没有办法在以下语法中删除左递归?
a[int x]
: b a[$x] c
| a[$x - 1]
(
c a[$x - 1]
| b c
)
;
问题在于涉及左递归的第二种选择。任何形式的帮助将不胜感激。
答案 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)*
;