この質問は、正規表現を使用したトークン化の実行に関するものではなく、適切なタイプのオブジェクト (またはオブジェクトの適切なコンストラクター) を一致させて、トークナイザーからのトークン出力を処理する方法に関するものです。
もう少し説明すると、私の目的は、トークンの行を含むテキスト ファイルを解析して、データを説明する適切なオブジェクトにすることです。実際、私のパーサーはすでに完成していますが、現時点ではswitch
...case
ステートメントの混乱があり、私の質問の焦点は、優れた OO アプローチを使用してこれをリファクタリングする方法です。
まず、私が全体的に行っていることを説明するための例を示します。次の 2 つのような多くのエントリを含むテキスト ファイルを想像してください。
cat 50 100 "abc"
dog 40 "foo" "bar" 90
ファイルのこれら 2 つの特定の行を解析するとき、クラスCat
とDog
それぞれのインスタンスを作成する必要があります。実際には、非常に多くの異なるオブジェクト タイプが記述されており、場合によっては引数の数の異なるバリエーションがあり、値が明示的に記述されていない場合はデフォルトが想定されることがよくあります (つまり、ビルダーを使用するのが通常は適切であることを意味します)。オブジェクトを作成するときのパターン、または一部のクラスには複数のコンストラクターがあります)。
各行の最初のトークン化は、可能なトークンの各タイプ (整数、文字列、およびこのアプリケーションに関連する他のいくつかの特別なトークン タイプ) とおよびTokenizer
に一致する正規表現のグループを使用する、私が作成したクラスを使用して行われています。このトークナイザー クラスの最終結果は、解析する行ごとに、オブジェクトのリストを返します。各オブジェクトには、プリミティブ値のプロパティと共にプロパティ (整数、文字列などを指定) があります。Pattern
Matcher
Token
Token
.type
解析された行ごとに、次のことを行う必要があります。
switch
...case
オブジェクトタイプ(最初のトークン);switch
引数の数に基づいて、その引数の数に適したコンストラクターを選択します。- 各トークン タイプが、オブジェクトの構築に必要な引数のタイプに適していることを確認します。
- 引数の型の数または組み合わせが、呼び出されているオブジェクトの型に適していない場合は、エラーをログに記録します。
現時点で私が持っているパーサーには、これを処理するためのswitch
/case
またはif
/else
があちこちにあり、機能しますが、かなり多くのオブジェクト タイプがあるため、少し扱いにくくなっています。
誰かが、トークンのリストを適切なメソッド呼び出しにパターンマッチングする、よりクリーンでより「OO」な代替方法を提案できますか?