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
这两种选择都会产生中度到严重的后果,具体取决于您要实现的目标。
在第 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
这两种选择都会产生中度到严重的后果,具体取决于您要实现的目标。