1

漠然とした質問ですが、よろしくお願いします。

「Building Parsers with Java」という本の助けを借りて、小さなパーサーのトークン化部分を構築しています。最初に指定された文字列の最初の文字を検出し、PushbackReader を適切な状態に送信する方法として、PushbackReader とそれに含まれる文字列を使用します (状態は、文字列を含む別のオブジェクトとしてトークンを構築します)。

PushbackReader は、ストリーム内に他の使用文字が見つからない場合にのみ使用されるようです。次に、最後の文字を読み取りません。

CharBuffer の追加で同じことを行うことは可能ですか? できれば、バッファを事前定義する必要がないもの。

4

1 に答える 1

1

私が見たところ、彼が PushbackReader を選んだ理由は 2 つあります。

  1. 彼は、個々の文字を処理できるリーダーを必要としていました。
  2. 彼は、トークン化するときに、現在の文字がトークンの一部であるかどうかを判断するために、1 つ以上の文字を先に見る必要があったため、ストリームでバックアップする必要がありました。

たとえば、メソッド WhitespaceState.nextToken では、空白文字をスキップしています。彼はキャラクターを引き抜いてそれを見ます。それが空白文字の場合、彼は次の文字を引き出します。最終的に空白文字ではない文字を取り出したら、それをストリームに戻して、ストリームを確認する次のメソッドが正しい文字を確認するようにします。

read() と unread() の 2 つのメソッドだけを持つもっと単純なものに置き換えることもできますが、そうすることでおそらく

  1. 入力全体を読み取り、入力を処理します。そのため、大きなファイルがある場合、それを保存するためにメモリを消費します。
  2. 入力をストリームとして 1 回読み取りますが、unread() からの char(s) を保存し、それらを別の構造体に渡します。

PushbackReader を使用すると、入力を一度読み取って処理するだけで済みます。入力全体をバッファリングする必要も、unread() 文字を保存して個別に渡す必要もありません。

于 2012-04-21T16:48:03.890 に答える