简体   繁体   English

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

[英]How to fix mutual left recursion in ANTLR4

I have two rules that are mutually left recursive:我有两个相互左递归的规则:

frag : ID
   | NUMBER
   | TRUE
   | FALSE
   | expr
;

expr: frag (PLUS | MINUS) frag
   | LBR expr RBR
   | frag
;

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

I'm new to ANTLR4 and am having difficulty removing this mutual left recursion.我是 ANTLR4 的新手,很难消除这种相互左递归。

I understand that left recursion can be removed such that:我知道可以删除左递归,以便:

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

See this answer here 在这里看到这个答案

How might I go about this?我该怎么办?

Indirect left recursion isn”t allowed, but direct left recursion is.不允许间接左递归,但允许直接左递归。 This will work fine:这将正常工作:

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

And if you still want a separate frag rule, you can do this of course:如果你仍然想要一个单独的frag规则,你当然可以这样做:

frag : ID
   | NUMBER
   | TRUE
   | FALSE
;

expr: expr (PLUS | MINUS) expr
   | LBR expr RBR
   | frag
;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM