私の仕事は、制御フローグラフを作成することです。まず、コードを基本ブロックに分割することができました。たとえば、このプログラムは次のとおりです。
1 begin
2 int x, y, power;
3 float z;
4 input (x, y);
5 if (y<0)
6 power=-y;
7 else
8 power=y;
9 z=1;
10 while (power!=0){
11 z=z*x;
12 power=power-1;
13 }
14 if (y<0)
15 z=1/z;
16 output(z);
17 end
次の基本ブロックに変わります。
ブロック1
Line 2 int x, y, power;
Line 3 float z;
Line 4 input (x, y);
Line 5 if (y<0)
ブロック2
Line 6 power=-y;
ブロック3
Line 8 power=y;
ブロック4
Line 9 z=1;
ブロック5
Line 10 while (power!=0){
ブロック6
Line 11 z=z*x;
Line 12 power=power-1;
ブロック7
Line 14 if (y<0)
ブロック8
Line 15 z=1/z;
ブロック9
Line 16 output(z);
これを行うには、ファイルをスキャンし、PatternとMatcherを使用して、if、whileなどのステートメントに基づいてプログラムを分割します。基本ブロックはArrayListであり、これらのブロックはすべてArrayList>に保持されます。
次に、基本ブロックが相互に接続されているHashMapを保持しました。たとえば、ブロック1はifステートメントであるためブロック2とブロック3に接続されます(これが一方の方向に進む場合は、もう一方の方向に進みます)。このHashMapは、ブロック番号、および接続されているブロック番号のリスト用の>です。
つまり、基本ブロックと、これらの基本ブロック間の接続のリストがあります。今の私の問題は、これをグラフィカルな形式で表示する方法がわからないことです。以前は、paint()メソッドを使用して円と線を描画し、各ブロックが次のブロックへの接続を1つだけ持つ単純な制御グラフを表現していました。ただし、複数の接続がある場合にこれを行う方法がわかりません。これを行う簡単な方法はありますか?
ありがとう!