ANTLR v4多任务

时间:2015-10-24 15:48:54

标签: whitespace variable-assignment antlr4

在第39页的Terence Parr'S Definitiv ANTLR参考文献中,作业定义如下:

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被跳过,顺便说一句。)

1 个答案:

答案 0 :(得分:1)

一种旨在依赖偶尔的空白重要性的语言几乎总是一个坏主意,而且当尝试使用无上下文解析器解析它时也是如此。也就是说,有两种选择,至少在这个例子中是这样的:

首先,将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

两种选择都有后果,从中到重,取决于你想要完成的事情。