2

Java でパーサーを作成しており、Java の PushbackReader を活用しようとしています。間違って推測した場合、パーサーはバックトラックする必要があるかもしれませんが、リーダーが EOF に達すると失敗します。

引用符で囲まれた文字列を解析していて、閉じ引用符を探しているとしましょう。パーサー プラグインのいずれかが完全に終了できない場合、リーダーを元の状態のままにして、次のプラグインに渡そうとします。IE: 通常、文字をバッファにプッシュし、次の要素にバッファの解析を試みさせます。

残念ながら、最後の文字まで「読んで」...そして EOF を読んだ場合、PushbackReader では何もプッシュバックできません。その結果、これらの文字が失われるため、解析を完了できません!

このタイプの文字列処理用に独自のリーダーを作成する必要がありますか?

EDIT:さらに、最後の文字(EOFの直前の文字)を読み取ると、その文字を「読み取る」こともできません。これに対する標準的な回避策はありますか?独自のスタックまたはバッファーの実装を作成する以外に?

4

1 に答える 1

5

EOF マーカーを読み取らないように注意してください。PushbackReader 内のバッファーは char[] 型であるため、整数 -1 は char 0xFFFF に変換され、それが read メソッドから返される次の文字になります。たとえば、引用符で囲まれた文字列を解析する場合は、終了の引用符文字に加えて常に -1 のチェックを含め、IOException をスローするなどして、これを失敗のケースとして処理します。

于 2011-02-11T22:41:38.390 に答える