2011-08-18 24 views
2

我對Scala分析器組合器有些困惑。 我使用閱讀器的定製實現直接讀取的標記列表: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

參見HTTP ://www.scala-lang.org/node/5658它提出了同樣的問題。 – mrueg

回答

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' 
} 
+0

是的,我知道這一點。當然,我可以創建一個額外的'Token'子類,並返回它而不是'null',但我懷疑這能解決問題。 這可能只是Scala解析器組合器如何工作的一個設計決定,但這會引起「atEnd」方法的問題。 – mrueg