antlr如何在我需要之前跳过令牌

时间:2017-08-13 23:40:50

标签: antlr antlr4

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

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*

1 个答案:

答案 0 :(得分:0)

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

基本上,您可以通过提供自己的自定义TokenStream来实现此目的,该自定义populateCashierRiskProfiles() { const that = this; //// Observable technique this.service.getCashierRiskProfiles() .subscribe((riskProfiles) => { that.cashierRiskProfiles = riskProfiles }); } 实现了一种跳过空格或根据其设置将其提供给解析器的机制。