Enviar tokens para canais diferentes
Nos exemplos de gramáticas que temos vindo a apresentar, tem-se optado pela acção skip quando na presença dos chamados espaços em branco ou de comentários.
Esta acção faz desaparecer esses tokens simplificando a análise sintáctica.
O preço a pagar (geralmente irrelevante) é perder o texto completo que lhes está associado.
No entanto, em ANTLR4 é possível ter dois em um. Isto é, retirar tokens da analise sintáctica, sem no entanto fazer desaparecer completamente esses tokens (podendo-se recuperar o texto que lhe está associado).
Esse é o papel dos chamados canais léxicos.
WS: [ \t\r\n]+ ->skip;
COMMENT: '/*" .*? '*/' ->skip;
WS: [ \t\r\n]+ ->channel(1);
COMMENT: '/*" .*? '*/' ->channel(2);
A classe CommonTokenStream encarrega-se de juntar os tokens de todos os canais (o visível – canal zero – e os escondidos).

(É possível ter código para aceder aos tokens de um canal em particular.)
Exemplo: declaração de função
grammar Func ;
func : type=ID function=ID ’(’ varDecl* ’)’ ’;’;
varDecl: type=ID variable=ID ;
ID : [a-zA-Z_]+ ;
WS: [ \t\r\n]+ -> channel(1);
COMMENT: ’/*’ .*? ’*/’ -> channel(2);
Last updated