今日は SELECT に取り組みましたが、見た目以上のものがあります。gcc バックエンドは、多方向分岐ステートメントを作成するときに選択肢をバイナリ ツリーに格納しますが、これは整数に対してのみ機能します。文字列も処理する必要があります。
フロントエンド ツリーの最初の用途は、ケースの重複を防ぐことです。バックエンドは整数のみを処理するため、フロントエンド ツリーは文字列選択のコードを生成するためにも使用されます。通常、バックエンドはジャンプ テーブルを生成しますが、一連のテストとジャンプを生成するにはツリーが必要になります。ツリー構造を具体的に使用することで、O(n) ではなく、O(log(n)) 検索時間の選択を生成できます。
Fortran の SELECT ステートメントでは、無制限の下限と上限を指定することもできます。これはバックエンドでサポートされていないようで、おそらくそれらの境界をテストする IF ステートメントで選択を効果的にラップすることで処理されるでしょう。
とにかく、ツリーを作成せずに、基本的な SELECT ステートメントと CASE ステートメントのマッチャーが実行されます。構文解析サブルーチンを簡素化するために多くの作業が行われました。現在、実行可能なステートメントを文字列でつなぎ、必要に応じて IF/SELECT/DO/FORALL/WHERE パーサーを呼び出すだけの parse_executable() サブルーチンがあります。
これにより、ブロックパーサーも単純化されます。これは、一般に、実行可能なステートメントと織り交ぜられると予想される独自の特別なステートメントがあるためです。
SELECT/CASE ステートメント マッチャーをデバッグすると、前のステートメントの後の取り消し/クリーンアップに関する多くの問題も明らかになりました。