如何删除左递归在以下语法?(How to remove left-recursion in the

2019-10-18 08:53发布

不幸的是,这是不可能的ANTLR支持直接左递归当规则具有传递的参数。 唯一可行的办法是去除左递归 。 有没有一种方法,以消除在下面的文法左递归?


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

问题是,在涉及左递归第二个选择。 任何形式的帮助将非常感激。

Answer 1:

没有参数的简单格式化,它应该是这样的:

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)*
 ;


文章来源: How to remove left-recursion in the following grammar?