Parsing 如何将迭代器[String]转换为读取器[String]?

Parsing 如何将迭代器[String]转换为读取器[String]?,parsing,scala,Parsing,Scala,我正在尝试使用解析器组合器逐行解析文件。我很清楚如何编写解析器本身,但在运行它们时,我必须提供输入=读取器[String]。假设我有一个迭代器[String]读取文件(或源代码),那么通过解析器运行它的最佳方式是什么?我这样解析文件: parsers.parseAll(parser, FileReader("foo.bar")) 但我打赌这不会正确关闭文件。是一个Java类,有一个版本的parseAll,它接受Java.io.Reader。这真的不容易从API文档中提取 进

我正在尝试使用解析器组合器逐行解析文件。我很清楚如何编写解析器本身,但在运行它们时,我必须提供
输入
=
读取器[String]
。假设我有一个
迭代器[String]
读取文件(或
源代码),那么通过解析器运行它的最佳方式是什么?

我这样解析文件:

parsers.parseAll(parser, FileReader("foo.bar"))
但我打赌这不会正确关闭文件。是一个Java类,有一个版本的
parseAll
,它接受
Java.io.Reader
。这真的不容易从API文档中提取

进一步的研究表明,
StreamReader
中存在可用于手动转换Java
Reader

编辑
如果你真的解析了字符序列以外的东西,那么我的答案就不适用了。从跳过文档开始,您似乎必须滚动自己的
阅读器
,因为
阅读器
的所有具体子类似乎都专用于Char。

我这样解析文件:

parsers.parseAll(parser, FileReader("foo.bar"))
但我打赌这不会正确关闭文件。是一个Java类,有一个版本的
parseAll
,它接受
Java.io.Reader
。这真的不容易从API文档中提取

进一步的研究表明,
StreamReader
中存在可用于手动转换Java
Reader

编辑
如果你真的解析了字符序列以外的东西,那么我的答案就不适用了。从跳过文档开始,您似乎必须滚动自己的
阅读器
,因为
阅读器
的所有具体子类似乎都专用于Char。

这就是我最终实现的

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 }
}
class-BufferingReader(迭代器:迭代器[String],val-position:Int)扩展读取器[String]{
定义this(迭代器:迭代器[String])=this(迭代器,0)
val _atEnd=!iterator.hasNext
val _first=if(!\u atEnd)迭代器。下一个else“”
lazy val_rest=新的BufferingReader(迭代器,位置+1)
def atEnd=\u atEnd
def first=_first
def rest=\u rest
def pos=新位置{def line=位置;def column=0;def lineContents=_first}
}

这就是我最终实现的

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 }
}
class-BufferingReader(迭代器:迭代器[String],val-position:Int)扩展读取器[String]{
定义this(迭代器:迭代器[String])=this(迭代器,0)
val _atEnd=!iterator.hasNext
val _first=if(!\u atEnd)迭代器。下一个else“”
lazy val_rest=新的BufferingReader(迭代器,位置+1)
def atEnd=\u atEnd
def first=_first
def rest=\u rest
def pos=新位置{def line=位置;def column=0;def lineContents=_first}
}

这不会返回一个
阅读器[Char]
?@huynhjl它以我能想象的最正常的方式工作。如果您的解析器接受字符串标记,那么其他东西可能会更好。关闭
StreamReader
将关闭
FileReader
。Java保证了这一点。那是什么
FileReader
?我在API中找不到它。此外,我在
Parsers
中找不到
parseAll
,只有在专门用于
Char
regexparser
中。你使用什么样的
解析器
?它不会返回一个
阅读器[Char]
?@huynhjl它以我能想象到的最正常的方式工作。如果您的解析器接受字符串标记,那么其他东西可能会更好。关闭
StreamReader
将关闭
FileReader
。Java保证了这一点。那是什么
FileReader
?我在API中找不到它。此外,我在
Parsers
中找不到
parseAll
,只有在专门用于
Char
regexparser
中。您使用什么类型的
解析器