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

How to fix mutual left recursion in 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 | ε

this answer here

我该怎么做?

不允许间接左递归,但允许直接左递归。这将正常工作:

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
;