通常、CFG は下位レベルの表現 (JVM バイトコードなど) で計算されます。数年前、誰かがそのようなことについて論文を書きました。その表現に到達する方法については、そこに説明されている役立つ方法があるかもしれません。
ソース言語とターゲット言語が同じなので、コード生成の手順はありません。これで完了です。ただし、AST を実行できるようになりました。AST の各ノードで、これは「ジャンプ」命令かどうかを自問する必要があります。メソッド呼び出しと if ステートメントは、ジャンプ命令の例です。ループ構造 ( や などfor
)も同様while
です。加算や乗算などの命令は非ジャンプです。
最初に、CFG 内の各 Java ステートメントに、入口ノードと出口ノードとともにノードを関連付けます。最初の概算として、ツリーをたどって次のことを行います。
- 現在のステートメントがメソッド呼び出しの場合、そのメソッド呼び出しの対応する本体のエントリ ノードがどこにあるかを把握し、現在のステートメントからそのエントリ ノードを指すエッジを作成します。ステートメントがメソッドの戻り値である場合は、それを呼び出した可能性のある場所を列挙し、それらにエッジを追加します。
- ジャンプしないステートメントごとに、それと次のステートメントの間にエッジを作成します。
これにより、ある種の CFG が得られます。呼び出されたメソッドはライブラリで宣言され、AST の他の場所では宣言されていない可能性があるため、手順はステップ 2 で少し複雑です。ライブラリメソッド。
これは理にかなっていますか?