Scala解析器组合器和Reader无限循环

时间:2011-08-18 21:21:58

标签: parsing scala parser-combinators

我对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 个答案:

答案 0 :(得分: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'
}