Antlr4相互左递归错误

时间:2016-08-08 21:39:41

标签: antlr antlr4

我为我正在创建的迷你语言准备了一个语法,但我在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

1 个答案:

答案 0 :(得分:2)

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

这样的东西
expr: expr '+' expr | NUMBER

有效。

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

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

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

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

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

注意:未经测试。