不幸的是,这是不可能的ANTLR支持直接左递归当规则具有传递的参数。 唯一可行的办法是去除左递归 。 有没有一种方法,以消除在下面的文法左递归?
a[int x]
: b a[$x] c
| a[$x - 1]
(
c a[$x - 1]
| b c
)
;
问题是,在涉及左递归第二个选择。 任何形式的帮助将非常感激。
不幸的是,这是不可能的ANTLR支持直接左递归当规则具有传递的参数。 唯一可行的办法是去除左递归 。 有没有一种方法,以消除在下面的文法左递归?
a[int x]
: b a[$x] c
| a[$x - 1]
(
c a[$x - 1]
| b c
)
;
问题是,在涉及左递归第二个选择。 任何形式的帮助将非常感激。
没有参数的简单格式化,它应该是这样的:
a
: b a c
| a (c a | b c)
;
当a
的左递归替代匹配n次,它只是意味着(ca | bc)
将匹配n次,以终止前暂停bac
(第一选择)。 这意味着,此规则将总是以bac
,其次是零次或多个出现(ca | bc)
a
: b a c (c a | b c)*
;