简体   繁体   English

Antlr4相互左递归错误

[英]Antlr4 mutual left recursion error

I prepared a grammar for a mini language I am creating, but I am getting a mutual left recursion error between var and functioncall 我为正在创建的迷你语言准备了一个语法,但是在varfunctioncall之间出现了相互左递归错误

var
: NAME
| var '[' exp ']'
| var '.' var
| functioncall '.' var
;
functioncall
: NAME '(' (exp)? (',' exp)* ')'
| var '.' functioncall
| functioncall '.' functioncall
;

specifically at var : functioncall '.' functioncall 特别是在var : functioncall '.' functioncall var : functioncall '.' functioncall and functioncall : var '.' functioncall var : functioncall '.' functioncallfunctioncall : var '.' functioncall functioncall : var '.' functioncall which basically corresponds to somefunction().var and instanceofClass.function() . functioncall : var '.' functioncall其基本上对应于somefunction().varinstanceofClass.function()

Is there any way I can achieve this? 有什么办法可以实现?

Edit : Grammar should also allow something like var '=' exp where var can be instance.var or function().var 编辑:语法还应该允许类似var '=' exp ,其中var可以是instance.varfunction().var

Antlr 4 (and not before that) can handle both-side recursion in the same rule. Antlr 4(而不是之前的版本)可以按照同一规则处理双向递归。 So something like 所以像

expr: expr '+' expr | NUMBER

is valid. 已验证。

So we can put another new rule to abstract either a var or a function call. 因此,我们可以添加另一个新规则来抽象一个var或一个函数调用。

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

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

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

Not only the grammar is simpler to parse (to human readers), but now you have no mutual recursion. 不仅语法(对人类读者而言)更易于解析,而且现在您无需相互递归。

Note: untested. 注意:未经测试。

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

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