我为我正在创建的迷你语言准备了一个语法,但我在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
答案 0 :(得分:2)
Antlr 4(而不是之前)可以在同一规则中处理双方递归。像
这样的东西expr: expr '+' expr | NUMBER
有效。
因此我们可以使用另一个新规则来抽象var或函数调用。
value
: var
| functioncall
| value '.' value
;
var
: NAME
| var '[' exp ']'
;
functioncall
: NAME '(' exp? (',' exp)* ')'
;
不仅语法更容易解析(对于人类读者),但现在你没有相互递归。
注意:未经测试。