我见过许多使用空格处理的ANTLR语法,如下所示:
WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
Run Code Online (Sandbox Code Playgroud)
因此将空格分别丢弃发送到隐藏的频道.
用这样的语法:
grammar Not;
start: expression;
expression: NOT expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)
有效输入" 不是真 "或" 非假 ",但也是"非真实 ",这不是理想的结果.将语法更改为:
grammar Not;
start: expression;
expression: NOT WS+ expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r];
Run Code Online (Sandbox Code Playgroud)
解决了这个问题,但我不想在每个规则中手动处理空格.
一般来说,我希望每个令牌之间都有一个空格,但有一些例外(例如' !true '之间不需要空格).
有一个简单的方法吗?