[英]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
var : functioncall '.' functioncall
和functioncall : var '.' 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)* ')'
;
不仅语法(对人类读者而言)更易于解析,而且现在您无需相互递归。
注意:未经测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.