antlr 我怎样才能跳过令牌直到我需要它

antlr how can I skip a token until I need it

有没有办法跳过令牌直到我需要它们?为了更清楚,这里有一个尽可能接近我想要的语法:

grammar example;

file : statement* EOF ;
statement : ID EOL
          | '{' (EOL statement*)? '}' EOL
          ;

EOL : ('\r'? '\n' | '\r') -> skip ;
WHITESPACE : [ \t]+ -> skip ;

希望我的意图很明确:在正常情况下会跳过所有空格(包括换行符),但我可以随时要求出现换行符,所以

foo
{
  bar
}
baz

符合语法,但不符合

foo {
  bar
} baz

foo bar
{
  baz
}

有没有办法做到这一点,还是我只需要在我的语法中加入很多 EOL*

不久前我回答了另一个需要同类机制的问题
有关详细信息,请参阅 here

基本上,您可以通过提供自己的自定义 TokenStream 来实现此目的,该自定义 TokenStream 实现了一种机制,即跳过空格或将其输入解析器,具体取决于它的设置。