明白了,現在。好的,有一個比分叉更簡單的解決方案。這裏:
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))
}
}
}
對不起,當然!但是輸入仍然是`Reader [Elem]`,``source``方法返回`CharSequence`。我沒有看到如何使用它來將字符串傳遞到外部解析框架。對我來說,這似乎是一件不可能的事情,因爲組合器在流中工作。你基本上不知道日期字符串會有多少個字符,因此需要一個可以處理流的日期分析器,並給出它已經消耗了多少流的信息。 – 2011-02-03 14:37:36
我指的是最終組合語法分析器的輸入。我試圖編寫的解析器的輸出應該是一個日期。 – 2011-02-03 14:51:53
@hedefalk它是`scala.util.parsing.input.Reader`,你可以繼承任何你需要的東西。例如,您可以使用詞法分析器返回標記,然後使用標記進行處理。請發佈一些你正在嘗試做的代碼,因爲它不清楚。 – 2011-02-03 15:18:09