ドラゴンブックを持っているけど、その話題は扱っていないようだ...
最新の言語では、コード内での出現が順不同であっても、特定の変数を使用することができます。
例
class Foo {
void bar() {
plonk = 42;
}
int plonk;
}
plonk
関数の後に変数が宣言されていてもかまいません。
質問
これを実装するためのベストプラクティス/有用なパターンはありますか? 私の心に浮かぶ2つのアプローチがあります:
解析中に、目に見えないシンボルのダミー シンボルを追加します。宣言が解析されると、これらのダミーは実際のシンボルに置き換えられます。解析後、ダミーが残っているかどうかを確認し、残っている場合はエラーを出力します。
解析中はシンボル操作を行わず、AST のみを作成します。AST を解析した後、ノードに応じてシンボルを追加します。たとえば、クラスノードの場合、子のシンボルを追加してから処理します。たとえば、ステートメントブロックは子をステップスルーし、子が処理される直前にシンボルを追加します。
アプローチ1.の方が簡単で、「他のコンパイルユニットのインポート」などにも便利です。
編集:
アプローチ1で見られる問題は、順序付けられたシンボルに対して何らかの処理が必要なことです。たとえば、関数内では、使用する前にローカル シンボルを使用することはできません。