2

我对 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

4

1 回答 1

1

我不知道它会解决这个问题,但在我在 Scala 源代码中看到的 Reader 实现中,该first方法在结束时返回文件结尾字符而不是 null。而且我相信避免空值通常是好的......

例如,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'
}
于 2011-08-18T22:16:11.940 回答