Antlr4相互左递归错误

Antlr4 mutual left recursion error

我为正在创建的迷你语言准备了语法,但在 varfunctioncall

之间出现相互左递归错误
var
: NAME
| var '[' exp ']'
| var '.' var
| functioncall '.' var
;
functioncall
: NAME '(' (exp)? (',' exp)* ')'
| var '.' functioncall
| functioncall '.' functioncall
;

具体在 var : functioncall '.' functioncallfunctioncall : var '.' functioncall 基本对应 somefunction().varinstanceofClass.function().

有什么方法可以实现吗?

编辑:语法还应该允许像 var '=' exp 这样的东西,其中 var 可以是 instance.varfunction().var

Antlr 4(而不是之前的版本)可以在同一规则中处理双向递归。所以像

expr: expr '+' expr | NUMBER

有效。

因此我们可以添加另一个新规则来抽象 var 或函数调用。

value
: var
| functioncall
| value '.' value
;

var
: NAME
| var '[' exp ']'
;

functioncall
: NAME '(' exp? (',' exp)* ')'
;

不仅语法更易于解析(对人类读者而言),而且现在没有相互递归。

注:未测试。