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
中存在可用于手动转换JavaReader
编辑
如果你真的解析了字符序列以外的东西,那么我的答案就不适用了。从跳过文档开始,您似乎必须滚动自己的阅读器
,因为阅读器
的所有具体子类似乎都专用于Char。我这样解析文件:
parsers.parseAll(parser, FileReader("foo.bar"))
但我打赌这不会正确关闭文件。是一个Java类,有一个版本的parseAll
,它接受Java.io.Reader
。这真的不容易从API文档中提取
进一步的研究表明,StreamReader
中存在可用于手动转换JavaReader
编辑
如果你真的解析了字符序列以外的东西,那么我的答案就不适用了。从跳过文档开始,您似乎必须滚动自己的阅读器
,因为阅读器
的所有具体子类似乎都专用于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
中。您使用什么类型的解析器
?