Estou projetando uma gramática ANTLR que precisa pelo menos reconhecer números em notação exponencial, identificadores de variáveis e strings. Estou me deparando com um problema em que a gramática reconhece 1E4 como se E iniciasse um identificador, em vez de reconhecê-lo como um número em notação exponencial. Estou testando isso no ANTLR Lab (lab.antlr.org).
Aqui está a gramática de teste que estou usando:
grammar prueba;
// Parser rules
program : (numeric_constant | identifier)* EOF;
numeric_constant : sign? number (EXPONENT sign? integer)? ;
number : integer ('.' integer?)? ;
integer : DIGIT+ ;
sign : PLUS_SIGN | MINUS_SIGN ;
identifier : LETTER (LETTER | DIGIT)* ;
// Lexer rules
EXPONENT : 'E' ;
PLUS_SIGN : '+' ;
MINUS_SIGN : '-' ;
LETTER : [A-Za-z] ;
DIGIT : [0-9] ;
E estou testando com a entrada: 1E4, estou recebendo o seguinte erro:
1:0 mismatched input '1' expecting {, '+', '-', ',', ';'}
Alguma ideia de por que ele não reconhece 1E4 como um número e como consertar isso?
O que eu tentei:
Projetei a gramática com o objetivo de identificar números em notação exponencial como 1E4. Eu esperava que a gramática reconhecesse 1E4 como numeric_constant, mas em vez disso, parece tratar E como o início de um identificador.
O que eu esperava:
Dada a entrada 1E4, esperava que ela fosse analisada como numeric_constant. No entanto, o analisador parece tratá-lo como o início de um identificador, o que não era o que eu pretendia.
Clique na guia "Lexer" no canto superior esquerdo do ANTLR Lab e exclua o conteúdo.
Você está especificando uma gramática combinada de lexer/analisador, mas a especificação do Lexer está interferindo.