Подтвердить что ты не робот

Scala комбинатор парсера, большая проблема с файлом

Я написал парсер следующим образом:

class LogParser extends JavaTokenParsers {

  def invertedIndex: Parser[Array[Array[(Int, Int)]]] = {
    num ~> num ~> num ~> rep(postingsList) ^^ {
      _.toArray
    }
  }

  def postingsList: Parser[Array[(Int, Int)]] = {
    num ~> rep(entry) ^^ {
      _.toArray
    }
  }

  def entry = {
    num ~ "," ~ num ^^ {
      case docID ~ "," ~ count => (docID.toInt, count.toInt)
    }
  }

  def num = wholeNumber ^^ (_.toInt)

}

Если я проанализирую файл (270 МБ) с помощью FileReader следующим образом:

val index = parseAll(invertedIndex, new FileReader("path/to/file")).get

Я получаю Exception in thread "main" java.lang.StackOverflowError (я также пробовал обертывание в BufferedReader), но я могу исправить его, сначала прочитав файл в строке так:

val input = io.Source.fromFile("path/to/file")
val str = input.mkString
input.close()
val index = parseAll(invertedIndex, str).get

Почему это так? Есть ли способ избежать прочтения его как строки вначале, это кажется пустой тратой?

4b9b3361

Ответ 1

Существует еще одна библиотека [1], которая очень похожа на комбинаторы синтаксического анализатора scala, которые поддерживают Trampolining, что и нужно, чтобы остановить ошибки stackoverflow.

[1] https://github.com/djspiewak/gll-combinators