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