Scala Parser Combinators:在流中解析

Joh*_*van 3 scala parser-combinators

我在scala中使用本机解析器组合器库,我想用它来解析许多大文件.我已经设置了组合器,但是我要解析的文件太大而无法一次性读入内存.我希望能够通过我的解析器从输入文件流式传输并将其读回磁盘,这样我就不需要将它全部存储在内存中了.我当前的系统看起来像这样:

val f = Source.fromFile("myfile")
parser.parse(parser.document.+, f.reader).get.map{_.writeToFile}
f.close
Run Code Online (Sandbox Code Playgroud)

这会在解析时读取整个文件,我想避免使用它.

J C*_*ell 6

使用scala的解析器组合器没有简单或内置的方法来实现这一点,它提供了实现解析表达式语法的工具.

诸如|||(最长匹配)之类的运算符在很大程度上与流解析模型不兼容,因为它们需要广泛的回溯功能.为了完成你想要做的事情,你需要重新制定你的语法,这样就不需要回溯.这通常比听起来要困难得多.

正如其他人所提到的,你最好的选择是进入一个初步阶段,在这个阶段你输入你的输入(例如按行),这样你就可以一次处理一部分流.