ANTLR v4 多重赋值

ANTLR v4 multi-assignment

在第 39 页的 Terence Parr 的 Definitiv ANTLR Reference 中,赋值定义如下:

stat: expr (NL|SEMI)            # printExpr
| var EQL expr (NL|SEMI)        # assign        // x = 5; y = x     
| (NL|SEMI)                     # blank
;
...
WS  : [ \r\t]+ -> skip;
NL  : '\r' ? '\n';
SEMI: ';';
...

这很好用。

但是,我怎样才能达到这样的效果 x = 6 y=x ?

此处:两个作业 由一个空格分隔(顺便说一句,跳过了 WS。)

设计为依赖于偶尔的空白意义的语言几乎总是一个坏主意,在尝试使用上下文无关的解析器解析它时更是如此。也就是说,有两种选择,至少对于这个例子:

首先,将WS置于隐藏频道。然后,使用谓词测试标记流中重要的 WS 标记:

| var EQL expr ( {atWS()}? | NL | SEMI )   # assign  

其次,不要隐藏或跳过 WS。然后,在它应该重要的地方像任何其他标记一样使用:

| var WS? EQL WS? expr ( WS | NL | SEMI )  # assign  

并且,添加一个规则来捕获否则未使用 WS:

ws: WS ;  // will pollute the parse tree, but can be ignored there

这两种选择都会产生中度到严重的后果,具体取决于您要实现的目标。