Ich versuche, eine Daten mit combinator Parser zum Parsen eines Parser zurückzukehren [java.util.Date]Kombination eines Parsers andthen unter Verwendung eines anderen Parser von einem anderen Typ erstellen
ich, dass in zwei Phasen, zunächst , ich ein Jahr mit einem simpleYear Parser analysieren, dann habe ich im Ergebnis dieser einfachen Parser in andthen zu stopfen versuchte, würde ich dann diesen Eingang manipulieren als Ausgang dieses andthen ein parseResult [Datum] haben:
Leider bekomme ich den folgenden Fehler vom Compiler in der Zeile der Deklaration:
type mismatch; found :
parser.DateParser.Input ⇒ parser.DateParser.ParseResult[java.util.Date] (which
expands to)
scala.util.parsing.input.Reader[Char] ⇒ parser.DateParser.ParseResult[java.util. required: parser.DateParser.Parser[java.util.Date]
hier ist der Code:
object DateParser extends RegexParsers {
val formatter: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
def year = """\d{4}""".r
def month: Parser[String] =
def day = """[0-2]\d""".r | """3[01]""".r
def month = """0\d""".r | """1[0-2]""".r
def simpleDate: Parser[String] =
(year ~ "-" ~ month ~ "-" ~ day) ^^
{ case y ~ "-" ~ m ~ "-" ~ d => y + "-" + m + "-" + d }
def date: Parser[Date] = simpleDate andThen {
case Success(s, in) =>
val x: ParseResult[Date] = try {
Success(formatter.parse(s), in)
} catch {
case pe: ParseException => Failure("date format invalid", in)
}
x
case f: Failure => f
}
}
es, dass nicht eine implizite Konvertierung selbst in einen Parser [Datum] (vielleicht wegen des Versuchs von der Art des Zeitpunkt tun kann, der scala Compiler scheint/fangen?)
Gibt es eine andere Möglichkeit zu tun, was ich tun möchte?
Vielen Dank für Ihre großartige Antwort, und auch all die anderen Tipps. Ich frage mich, wie kommt es, dass Sie die Methode apply von Parser auf Input => ParseResult [Date] verwenden und einen Parser [Date] zurückbekommen können? Ich überprüfte die api: http://www.scala-lang.org/api/2.10.3/index.html#scala.util.parsing.combinator.ParsersParser aber es ist nicht sichtbar als legal aufgeführt. – Simonlbc
@Simonlbc Es ist eine Methode in 'Parsers' http://www.scala-lang.org/api/2.10.3/index.html # scala.util.parsing.combinator.Parsers Sie erweitern 'RegexParser', die' Parser' erweitern, so dass Sie es nennen können. – Kolmar