我有两个相互左递归的规则:
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
;