在第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被跳过,顺便说一句。)
答案 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
两种选择都有后果,从中到重,取决于你想要完成的事情。