Tengo un extraño efecto secundario de una regla antlr lexer y he creado un ejemplo de trabajo (casi) mínimo para demostrarlo. En este ejemplo, quiero hacer coincidir la cadena [0..1]
, por ejemplo. Pero cuando depuro la gramática, la secuencia de token que llega al analizador solo contiene [..1]
. El primer entero, no importa cuántos dígitos contenga, siempre se consume y no tengo ni idea de cómo sucede eso. Si elimino la regla FLOAT
todo está bien, así que supongo que el error se encuentra en alguna parte de esa regla. Pero como no debería coincidir con nada en [0..1]
en absoluto, estoy bastante perplejo.La regla ANTLR lexer consume caracteres incluso si no coincide?
Estaría feliz por cualquier apuntador en el que podría haberme equivocado. Este es mi ejemplo:
grammar min;
options{
language = Java;
output = AST;
ASTLabelType=CommonTree;
backtrack = true;
}
tokens {
DECLARATION;
}
declaration : LBRACEVAR a=INTEGER DDOTS b=INTEGER RBRACEVAR -> ^(DECLARATION $a $b);
EXP : 'e' | 'E';
LBRACEVAR: '[';
RBRACEVAR: ']';
DOT: '.';
DDOTS: '..';
FLOAT
: INTEGER DOT POS_INTEGER
| INTEGER DOT POS_INTEGER EXP INTEGER
| INTEGER EXP INTEGER
;
INTEGER : POS_INTEGER | NEG_INTEGER;
fragment NEG_INTEGER : ('-') POS_INTEGER;
fragment POS_INTEGER : NUMBER+;
fragment NUMBER: ('0'..'9');
Ahora que fue (al menos para mí) un comportamiento inesperado. Gracias por el ejemplo completo, lo tengo todo listo para funcionar ahora :-) – Lichtblitz
@Lichtblitz, de nada, y sí, tokenizar '..' (en combinación con INT- y FLOAT-tokens) es complicado ! :) –