发送记号到不同的通道

对于大多数语法,注释和空格都是语法分析器可以忽略的东西。如果我们不想让注释和空格在语法中到处都是,那么就需要让词法分析器把它们扔掉。不幸的是,这意味着任何后续处理步骤都不能再访问注释和空格。安全地忽略掉注释和空格的方法是把这些发送给语法分析器的记号放到一个“隐藏通道”中,语法分析器仅需要调协到单个通道即可。我们可以把任何我们想要的东西传递到其它通道中。这里是如何实现的语法:

  1. COMMENT
  2. : '/*' .*? '*/' -> channel(HIDDEN) // match anything between /* and */
  3. ;
  4. WS : [ \r\t\n]+ -> channel(HIDDEN)
  5. ;

就像我们前面讨论过的-> skip那样,-> channel(HIDDEN)也是一个的词法分析器指令。在这里,它设置那些记号的通道号码以便这些记号可以被语法分析器忽略。记号流仍然维护着原始的记号序列,但在喂食给语法分析器时则略过离线通道中的记号。