Antlr4相互左递归错误
Antlr4 mutual left recursion error
我为正在创建的迷你语言准备了语法,但在 var
和 functioncall
之间出现相互左递归错误
var
: NAME
| var '[' exp ']'
| var '.' var
| functioncall '.' var
;
functioncall
: NAME '(' (exp)? (',' exp)* ')'
| var '.' functioncall
| functioncall '.' functioncall
;
具体在 var : functioncall '.' functioncall
和 functioncall : var '.' functioncall
基本对应 somefunction().var
和 instanceofClass.function()
.
有什么方法可以实现吗?
编辑:语法还应该允许像 var '=' exp
这样的东西,其中 var 可以是 instance.var
或 function().var
Antlr 4(而不是之前的版本)可以在同一规则中处理双向递归。所以像
expr: expr '+' expr | NUMBER
有效。
因此我们可以添加另一个新规则来抽象 var 或函数调用。
value
: var
| functioncall
| value '.' value
;
var
: NAME
| var '[' exp ']'
;
functioncall
: NAME '(' exp? (',' exp)* ')'
;
不仅语法更易于解析(对人类读者而言),而且现在没有相互递归。
注:未测试。
我为正在创建的迷你语言准备了语法,但在 var
和 functioncall
var
: NAME
| var '[' exp ']'
| var '.' var
| functioncall '.' var
;
functioncall
: NAME '(' (exp)? (',' exp)* ')'
| var '.' functioncall
| functioncall '.' functioncall
;
具体在 var : functioncall '.' functioncall
和 functioncall : var '.' functioncall
基本对应 somefunction().var
和 instanceofClass.function()
.
有什么方法可以实现吗?
编辑:语法还应该允许像 var '=' exp
这样的东西,其中 var 可以是 instance.var
或 function().var
Antlr 4(而不是之前的版本)可以在同一规则中处理双向递归。所以像
expr: expr '+' expr | NUMBER
有效。
因此我们可以添加另一个新规则来抽象 var 或函数调用。
value
: var
| functioncall
| value '.' value
;
var
: NAME
| var '[' exp ']'
;
functioncall
: NAME '(' exp? (',' exp)* ')'
;
不仅语法更易于解析(对人类读者而言),而且现在没有相互递归。
注:未测试。