我见过许多使用空格处理的 ANTLR 语法,如下所示:
WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
所以空格被丢弃,分别发送到隐藏通道。
使用这样的语法:
grammar Not;
start: expression;
expression: NOT expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r]+ -> skip;
有效输入是“ not true ”或“ not false ”,但也有“ nottrue ”,这不是期望的结果。将语法更改为:
grammar Not;
start: expression;
expression: NOT WS+ expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r];
解决了这个问题,但我不想在每个规则中手动处理空格。
通常,我希望每个标记之间有一个空格,但有一些例外(例如,' !true ' 之间不需要空格)。
有没有一种简单的方法可以做到这一点?