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