手書きの降順パーサーを使用してテキストを解析したいと思います。Scanner
次の区切り文字で使用しました: "\\s*"
. 残念ながら、このパターンが空の文字列に一致するという事実は、すべての一致hasNextFoo
とnextFoo
一致するものが何もないように思われます。
ドキュメントは、空のデリミタの可能性について何も述べていません。
手書きの降順パーサーを使用してテキストを解析したいと思います。Scanner
次の区切り文字で使用しました: "\\s*"
. 残念ながら、このパターンが空の文字列に一致するという事実は、すべての一致hasNextFoo
とnextFoo
一致するものが何もないように思われます。
ドキュメントは、空のデリミタの可能性について何も述べていません。
「+」文字に異議がありますか?
空白文字をテストする if ステートメントだけでなく、正規表現を使用してもよろしいですか? あなたは「ランタイム」と言います。あなたのデータは文字列ですか、それともストリーム上にありますか?
StreamTokenizerも検討してください。以下は、再帰降下パーサーで 1 シンボル先読みに使用する例です。
はい、スキャナーをランタイムレクサーとして使用したいからです。つまり、scanner.next(pattern) に、一致した文字列を返すか、ストリームを消費せずに例外を返すように要求できるようにしたいと考えています。スペースは無視してください。これを行うにはスキャナーよりも優れたクラスがあれば、喜んで使用します。
あなたのためにこれを行う既製のライブラリクラスは考えられません。スキャナ/レクサーの通常のモデルでは、無効な文字シーケンス (つまり、例外が発生するもの) が消費されます。したがって、先読み文字を未消費として扱うように注意しながら、独自のスキャナーを手動で実装する必要があると思います。これは、「プッシュバック」リーダーを使用するか、(そのモデルが便利でない場合) 何らかのマーク/リセット モデルを使用して自分で明示的に文字をバッファリングすることで実行できます。1 つ以上のスペースで区切られたトークンに分割するだけの場合は、プッシュバック リーダーのアプローチで問題ありません。