我对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
时无限循环/无限递归。
答案 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'
}