Antlr: análisis de números de 2 dígitos cuando otros literales numéricos también son posibles
-
23-08-2019 - |
Pregunta
Estoy escribiendo una gramática para un lenguaje de tamaño moderado, y yo estoy tratando de poner en práctica literales de hora de la forma hh:mm:ss
.
Sin embargo, cada vez que intento analizar, por ejemplo, 12:34:56
como timeLiteral
, consigo excepciones simbólicas desajuste en los dígitos. ¿Alguien sabe lo que podría estar haciendo mal?
Estas son las reglas pertinentes tal como se define actualmente:
timeLiteral
: timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*)
;
timePair
: DecimalDigit DecimalDigit
;
NumericLiteral
: DecimalLiteral
;
fragment DecimalLiteral
: DecimalDigit+ ('.' DecimalDigit+)?
;
fragment DecimalDigit
: ('0'..'9')
;
Solución
El problema es que el léxico se tragan el DecimalDigit y devolviendo una NumericLiteral.
El analizador nunca verá DecimalDigits porque es una regla fragmento.
Yo recomendaría movimiento timeLiteral en el léxico (capitalizar su nombre). Por lo que tendría algo así como
timeLiteral
: TimeLiteral -> ^(TIMELIT TimeLiteral*)
;
number
: DecimalLiteral
;
TimeLiteral
: DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit COLON
DecimalDigit DecimalDigit
;
DecimalLiteral
: DecimalDigit+ ('.' DecimalDigit+)?
;
fragment DecimalDigit
: ('0'..'9')
;
Tenga en cuenta que el analizador léxico analizador y son completamente independientes. El analizador léxico determina qué señales se pasa al analizador, después el analizador llega a agruparlos.