2011-05-03 22 views
8

Quiero analizar las fechas ISO 8601 en mi gramática ANTLR.¿Cómo hacer coincidir un número fijo de caracteres en ANTLR 3?

2001-05-03 

He las siguientes entradas en mi archivo de gramática:

date : FOUR_DIGIT ('-')? TWO_DIGIT ('-')? TWO_DIGIT ; 

FOUR_DIGIT 
    : TWO_DIGIT TWO_DIGIT ; 

TWO_DIGIT 
    : DIGIT DIGIT ; 

DIGIT : ('0'..'9') ; 

sé que puedo coincidir con uno o más con DIGIT+ y cero o más con DIGIT*

Aunque esto funciona, ¿hay una sintaxis más simple para especificar Quiero unir exactamente 2 DIGIT?

+1

solo para aquellos que pasan por aquí en el futuro, abandoné las fechas de análisis en mi analizador sintáctico y decidí que es mejor analizar las fechas directamente en el código hasta que pueda encontrar una forma de analizar las fechas de forma nativa que no termine en conflicto con otros términos que comienzan con patrones 'DIGIT'. –

Respuesta

7

Jarrod Roberson escribió:

Aunque esto funciona, ¿hay una sintaxis simple especificar Quiero coincidir exactamente 2 dígitos?

No, DIGIT DIGIT es la única forma de hacer coincidir exactamente dos dígitos. ANTLR hace no soporte algo así como DIGIT{2}, desafortunadamente.

+0

Quité el mes, no me compró nada, ya que choca con tratar de restringir los días de la misma manera. Además '00' no sería un mes válido. –

+0

Ya veo. Sí, eso se ve mejor: simplemente haga coincidir las fechas "flojamente" y en una etapa posterior verifique si es una fecha válida o no. –

+0

Quizás ya lo sepas, pero ten en cuenta que todos los números de 4 (y 2) dígitos ahora se tokenizan como FOUR_DIGIT (o TWO_DIGIT). Por lo tanto, llamar a DIGIT + desde cualquiera de las reglas de su analizador nunca puede coincidir con cuatro o dos dígitos sucesivos. –

Cuestiones relacionadas