Scala парсер комбинаторы и бесконечный цикл Reader - PullRequest
2 голосов
/ 19 августа 2011

Меня немного смущают комбинаторы парсера Scala.Я использую пользовательскую реализацию Reader для непосредственного чтения списка токенов:

private class Token_Reader(tokens: List[Token], val pos: Token_Pos) extends Reader
{
  def first = if(atEnd) null else tokens.head
  def rest = if(atEnd) this else new Token_Reader(tokens.tail, new Token_Pos(pos.p + 1))
  def atEnd = tokens.isEmpty
}

Меня удивляет то, что atEnd кажется полностью игнорируемым фактическими парсерами, что приводит к бесконечному циклу /бесконечная рекурсия при использовании * / rep.

1 Ответ

1 голос
/ 19 августа 2011

Я не знаю, что это решит эту проблему, но в реализациях Reader, которые я вижу в исходном коде Scala, метод first возвращает символ конца файла, а не ноль в конце.И я считаю, что обычно хорошо избегать нулей ...

Например, в CharSequenceReader это выглядит как

  /** Returns the first element of the reader, or EofCh if reader is at its end 
   */
  def first = 
    if (offset < source.length) source.charAt(offset) else EofCh 

И этот символ определяется в объекте-компаньоне:

object CharSequenceReader {
  final val EofCh = '\032'
}
...