Antlr: análisis de números de 2 dígitos cuando otros literales numéricos también son posibles

StackOverflow https://stackoverflow.com/questions/886511

  •  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')
    ;
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top