如何修复ANTLR4中的相互左递归



我有两个相互左递归的规则:

frag : ID
| NUMBER
| TRUE
| FALSE
| expr
;
expr: frag (PLUS | MINUS) frag
| LBR expr RBR
| frag
;

问题是:The following sets of rules are mutually left-recursive [frag, expr]

我是ANTLR4的新手,很难去除这种相互左递归。

我知道左递归可以被删除,这样:

A -> Aa | b
-- becomes --
A -> bR
R -> aR | ε

点击此处查看答案

我该怎么办?

不允许间接左递归,但允许直接左递归。这会很好地工作:

expr: expr (PLUS | MINUS) expr
| LBR expr RBR
| ID
| NUMBER
| TRUE
| FALSE
;

如果你仍然想要一个单独的frag规则,你当然可以这样做:

frag : ID
| NUMBER
| TRUE
| FALSE
;
expr: expr (PLUS | MINUS) expr
| LBR expr RBR
| frag
;

相关内容

  • 没有找到相关文章

最新更新