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 ではなく、ファイルの終わりの文字を返します。そして、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 に答える