Pregunta

Estoy escribiendo un analizador para una interfaz de línea de comandos de una herramienta externa y estoy usando la librería de combinadores analizador de la biblioteca.Como parte de esto es necesario analizar una fecha estándar del formato EEE MMM d HH:mm:ss yyyy Z.

Scala parser, combinadores son "stream" y funciona con CharSequence del lugar de Cadenas.Eso hace que sea difícil para mí hacer uso de cualquiera de los java.texto.DateTimeFormat o DateTimeFormat de JodaTime ya que ambos trabajan con Cadenas.

A partir de ahora, me hade escribir mi propio regex-analizador como este para analizar la fecha, pero me gustaría mucho más incorporar el trabajo que se ha hecho con la JodaTime en mi analizador.Yo realmente no quiero reinventar la rueda.He estado mirando el código fuente de JodaTime y no estoy realmente seguro de por qué necesita para trabajar con Cadenas en lugar de sólo CharSequences.Me estoy perdiendo algún aspecto?

¿Fue útil?

Solución 3

Esta es mi solución en este momento:

Hice el tiempo de joda e hice pequeños cambios para que trabajara CharSequences en lugar de Strings. Esta aquí https://github.com/hedefalk/joda time/commit/ef3bdafd89b3334fb052ce0dd192613683b3486a4

Entonces podría escribir un DateParser como esto:

trait DateParsers extends RegexParsers {
  def dateTime(pattern: String): Parser[DateTime] = new Parser[DateTime] {
    val dateFormat = DateTimeFormat.forPattern(pattern);

    def jodaParse(text: CharSequence, offset: Int) = {
      val mutableDateTime = new MutableDateTime
      val newPos = dateFormat.parseInto(mutableDateTime, text, offset)
      (mutableDateTime.toDateTime, newPos)
    }

    def apply(in: Input) = {
      val source = in.source
      val offset = in.offset
      val start = handleWhiteSpace(source, offset)
      val (dateTime, endPos) = jodaParse(source, start)
      if (endPos >= 0)
        Success(dateTime, in.drop(endPos - offset))
      else
        Failure("Failed to parse date", in.drop(start - offset))
    }
  }
}

Entonces puedo usar este rasgo para tener reglas de producción como:

private[this] def dateRow = "date:" ~> dateTime("EEE MMM d HH:mm:ss yyyy Z")

¿Estoy exagerando esto? Estoy realmente cansado ahora mismo ...

Otros consejos

Ya lo pillo. Ok, hay una solución más simple que el bifurcación. Aquí:

trait DateParsers extends RegexParsers {
  def dateTime(pattern: String): Parser[DateTime] = new Parser[DateTime] {
    val dateFormat = DateTimeFormat.forPattern(pattern);

    def jodaParse(text: CharSequence, offset: Int) = {
      val mutableDateTime = new MutableDateTime
      val maxInput = text.source.subSequence(offset, dateFormat.estimateParsedLength + offset).toString
      val newPos = dateFormat.parseInto(mutableDateTime, maxInput, 0)
      (mutableDateTime.toDateTime, newPos + offset)
    }

    def apply(in: Input) = {
      val source = in.source
      val offset = in.offset
      val start = handleWhiteSpace(source, offset)
      val (dateTime, endPos) = jodaParse(source, start)
      if (endPos >= 0)
        Success(dateTime, in.drop(endPos - offset))
      else
        Failure("Failed to parse date", in.drop(start - offset))
    }
  }
}

No estoy seguro de lo que estás preguntando. ¿Estás preguntando por qué RegexParser.parse()'s in El parámetro toma un CharSequence? Si es así, hay otro sobrecargado RegexParser.parse() que requiere un Reader, que puede escribir una función de conversión simple como así:

def stringToReader(str: String): Reader = new StringReader(str)

En cuanto al formato de fecha, me parece perfectamente bien definirlo como un token en el analizador.

Espero que esto ayude.

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