Как конвертировать Iterator [String] в Reader [String]? - PullRequest
2 голосов
/ 17 января 2012

Я пытаюсь разобрать файл построчно, используя комбинаторы парсера.Мне понятно, как писать сами парсеры, но когда их запускать, я должен предоставить Input = Reader[String].Учитывая, что у меня Iterator[String] читает файл (или Source), как лучше всего запустить его через парсеры?

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Это то, что я в итоге реализовал.

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 }
}
0 голосов
/ 17 января 2012

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

parsers.parseAll(parser, FileReader("foo.bar"))

Но держу пари, что файл не закрывается должным образом. FileReader - это класс Java, и существует одна версия parseAll, которая принимает java.io.Reader. Это действительно не легко извлечь из документов API ...

Дальнейшие исследования показывают, что существует def apply (in: Reader): StreamReader в StreamReader, который можно использовать для ручного преобразования Java Reader.

Редактировать

Если вы действительно разбираете что-то еще, кроме последовательности Char, то мой ответ не применим. При просмотре документов кажется, что вам нужно бросить свой собственный Reader, поскольку все конкретные подклассы Reader кажутся специализированными для Char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...