如何将Iterator [String]转换为Reader [String]?

时间:2012-01-17 13:14:53

标签: parsing scala

我正在尝试使用解析器组合器逐行解析文件。我很清楚如何自己编写解析器,但是何时运行它们我必须提供Input = Reader[String]。鉴于我有一个Iterator[String]读取文件(或Source),通过解析器运行它的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我以这种方式解析文件:

parsers.parseAll(parser, FileReader("foo.bar"))

但我敢打赌,这并没有正确关闭文件。 FileReader是一个Java类,有parseAll的一个版本,它接受java.io.Reader。从API文档中提取真的不容易......

进一步研究表明,StreamReader中存在def apply (in: Reader): StreamReader,可用于手动转换Java Reader

修改

如果你真的解析别的东西而不是一系列的Char,那么,我的答案不适用。从跳过文档开始,您似乎必须推出自己的Reader,因为Reader的所有具体子类似乎都专用于Char。

答案 1 :(得分:0)

这是我最终实施的目标。

class BufferingReader(iterator: Iterator[String], val position: Int) extends Reader[String] {
    def this(iterator: Iterator[String]) = this(iterator, 0)

    val _atEnd = !iterator.hasNext
    val _first = if (!_atEnd) iterator.next else "<THIS SHOULD NEVER BE READ>"
    lazy val _rest = new BufferingReader(iterator, position + 1)

    def atEnd = _atEnd
    def first = _first
    def rest = _rest

    def pos = new Position { def line = position; def column = 0; def lineContents = _first }
}