Я использую библиотеку встроенного анализатора парсеров в scala, и я бы хотел использовать его для анализа большого количества больших файлов. У меня установлены мои комбайнаторы, но файл, который я пытаюсь разобрать, слишком велик, чтобы сразу считывать его в память. Я бы хотел, чтобы поток из входного файла через мой синтаксический анализатор и прочитал его обратно на диск, так что мне не нужно хранить его все в памяти сразу. Моя текущая система выглядит примерно так:Scala Parser Combanators: Разбор в потоке
val f = Source.fromFile("myfile")
parser.parse(parser.document.+, f.reader).get.map{_.writeToFile}
f.close
Это читает весь файл, когда он анализирует, чего я бы хотел избежать.
Это имеет смысл. Есть ли способ воспользоваться тем, что мой комбинатор верхнего уровня - это просто повторение? То есть, могу ли я прочитать в потоке куски размером с один «документ»? –
Пока вы можете найти способ (вручную) разделить документы, да. Затем вы будете передавать каждый документ в свою грамматику по отдельности. Большинство операторов PEG (в том числе повторение) на самом деле полагаются на обратное отслеживание, поскольку выразительность PEG основана на том, что вы можете сказать «попробуйте это, и если это не сработает, мы попробуем что-нибудь еще». –