(57)【特許請求の範囲】
【請求項１】
ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶手段に追加する順次関係形成手段、を備え、
前記順次関係形成手段は、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除するデータフロー解析装置。
【請求項２】
前記順次関係形成手段は、前記制御構文がｔｈｅｎ節とｅｌｓｅ節を有するｉｆ文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する、請求項１のデータフロー解析装置。
【請求項３】
前記順次関係形成手段は、前記制御構文がｅｌｓｅ節の無いｉｆ文、または、繰り返し処理制御文である場合、前記制御構文に付随する１つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している１つの下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する、請求項１のデータフロー解析装置。
【請求項４】
前記プログラムのソースコードを取得して、前記抽象構文木を抽出する抽象構文木抽出手段と、
前記ＤＦＧ記憶手段と、をさらに備えた請求項１乃至３の何れか１項のデータフロー解析装置。
【請求項５】
ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶手段に追加し、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除する、データフロー解析方法。
【請求項６】
前記制御構文がｔｈｅｎ節とｅｌｓｅ節を有するｉｆ文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する、請求項５のデータフロー解析方法。
【請求項７】
前記制御構文がｅｌｓｅ節の無いｉｆ文、または、繰り返し処理制御文である場合、前記制御構文に付随する１つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している１つの下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する、請求項５のデータフロー解析方法。
【請求項８】
ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶手段に追加し、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除する処理を、コンピュータに実行させるプログラム。
【請求項９】
前記制御構文がｔｈｅｎ節とｅｌｓｅ節を有するｉｆ文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する処理をコンピュータに実行させる、請求項８のプログラム。
【請求項１０】
前記制御構文がｅｌｓｅ節の無いｉｆ文、または、繰り返し処理制御文である場合、前記制御構文に付随する１つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している１つの下位ブロックのノード間のリンクを生成して前記ＤＦＧ記憶手段に追加する処理をコンピュータに実行させる、請求項８のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのデータフローを解析するデータ解析装置、データ解析方法、および、プログラムに関する。
【背景技術】
【０００２】
特許文献１は、対象変数に関する関数のコントロールフローグラフを生成し、その生成されたコントロールフローグラフに対して解析を行い、対象変数毎の解析結果に基づいてデータフローグラフを生成する装置を開示する。
【０００３】
特許文献２は、プログラムのソースコードを入力して、そのプログラムの変数依存関係を導出するシステムを開示する。このシステムは、ソースコードを入力して、構文木を作成し、その構文木から制御フローを導出し、最終的に、制御フローから変数依存関係を導出する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１２−１６４０２４号公報
【特許文献２】特開２０１３−１５６７８６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に記載された装置は、データフロー解析の入力情報として制御フローグラフを用いる。このため、この装置は、データフロー解析の前段階で、構文解析、制御フロー解析を行い、制御フローグラフを作成する。
【０００６】
制御フローグラフは、分岐を含まない逐次的コード列の纏まりのノードと、ノード間の制御の流れを表すリンクの情報を持つ。この装置が、このような制御フローグラフを作成すると、当該装置は、主記憶装置に各ソースファイルに対応する制御フローグラフとデータフローグラフの情報を同時に持つことになる。さらに制御フローグラフとデータフローグラフが同じサイズの情報であった場合、当該装置は、主記憶装置に同じソースファイルの情報を２重に持つこととなり主記憶装置を圧迫する。
【０００７】
特許文献２に記載されたシステムも、同様の課題を持つ。
【０００８】
本願発明は、上述の課題を解決するデータ解析装置、データ解析方法、および、プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の一実施形態のデータフロー解析装置は、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ａ）ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、ｂ）前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶部に追加する順次関係形成手段、を備える。
【００１０】
本発明の一実施形態のデータフロー解析方法は、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ａ）ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、ｂ）前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶部に追加する。
【００１１】
本発明の一実施形態のプログラムは、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ａ）ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、ｂ）前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記ＤＦＧ記憶部に追加する処理をコンピュータに実行させる。
【発明の効果】
【００１２】
本発明にかかるデータ解析装置は、効率の良いデータフローグラフ作成ができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、第１の実施形態のデータフロー解析装置１０の全体構成を示す図である。
【図２】図２は、ブロック対応作業域３０のデータ構造を示す図である。
【図３】図３は、順次関係形成部２１の動作フローチャート（その１）である。
【図４】図４は、順次関係形成部２１の動作フローチャート（その２）である。
【図５】図５は、順次関係形成部２１の動作フローチャート（その３）である。
【図６】図６は、順次関係形成部２１の動作フローチャート（その４）である。
【図７】図７は、ｉｆ文がｔｈｅｎ節を含むサンプルソースコード（その１）である。
【図８】図８は、上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０を示す図である。
【図９】図９は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０を示す図である。
【図１０】図１０は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０に登録しているＤＦＧノードを、上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０に登録した状況を示す図である。
【図１１】図１１は、上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０に、上位ブロック(関数：ｆｕｎｃ１)内のＤＦＧノードを登録した状況を示す図である。
【図１２】図１２は、サンプルソースコード（その１）のデータフローグラフを示す図である。
【図１３】図１３は、ｉｆ文がｔｈｅｎ節とｅｌｓｅ節を含むサンプルソースコード（その２）である。
【図１４】図１４は、上位ブロック(関数：ｆｕｎｃ２)のブロック対応作業域３０を示す図である。
【図１５】図１５は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０を示す図である。
【図１６】図１６は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０のＤＦＧノードを登録した後の上位ブロック(関数：ｆｕｎｃ２)のブロック対応作業域３０を示す図である。
【図１７】図１７は、下位ブロック(ｉｆ文のｅｌｓｅ節)のブロック対応作業域３０を示す図である。
【図１８】図１８は、下位ブロック(ｉｆ文のｅｌｓｅ節)のブロック対応作業域３０のＤＦＧノードを登録した後の上位ブロック(関数：ｆｕｎｃ２)のブロック対応作業域３０を示す図である。
【図１９】図１９は、上位ブロック内(関数：ｆｕｎｃ２)のＤＦＧノードを登録した後の上位ブロック(関数：ｆｕｎｃ２)のブロック対応作業域３０を示す図である。
【図２０】図２０は、サンプルソースコード（その２）のデータフローグラフを示す図である。
【図２１】図２１は、ネストが多段であるｉｆ文のサンプルソースコード（その３）である。
【図２２】図２２は、下位ブロックのさらに下位ブロックのブロック対応作業域３０を示す図である。
【図２３】図２３は、下位ブロック（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０を示す図である。
【図２４】図２４は、最下位ブロックのブロック対応作業域３０に登録しているＤＦＧノードを登録した後の、下位ブロックの（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０を示す図である。
【図２５】図２５は、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０を示す図である。
【図２６】図２６は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０に登録しているＤＦＧノードを登録した後の、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０を示す図である。
【図２７】図２７は、上位ブロック(関数：ｆｕｎｃ３)のＤＦＧノードを登録した後の、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０を示す図である。
【図２８】図２８は、サンプルソースコード（その３）のデータフローグラフを示す図である。
【図２９】図２９は、ｗｈｉｌｅ文のサンプルソースコード（その４）である。
【図３０】図３０は、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０を示す図である。
【図３１】図３１は、下位ブロック(ｗｈｉｌｅ文)のブロック対応作業域３０を示す図である。
【図３２】図３２は、下位ブロック(ｗｈｉｌｅ文)のブロック対応作業域３０に登録している最終ＤＦＧノードを登録した後の、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０を示す図である。
【図３３】図３３は、下位ブロックの(ｗｈｉｌｅ文)のブロック対応作業域３０の先頭ＤＦＧノードを登録した後の、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０を表した図である。
【図３４】図３４は、上位ブロックのＤＦＧノードを登録した後の、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０を示す図である。
【図３５】図３５は、サンプルソースコード（その４）のデータフローグラフを示す図である。
【図３６】図３６は、第２の実施形態のデータフロー解析装置１０の全体構成を示す図である。
【図３７】図３７は、抽象構文木の例（その１）を示す図である。
【図３８】図３８は、抽象構文木の例（その２）を示す図である。
【発明を実施するための形態】
【００１４】
＜第１の実施の形態＞
本実施の形態のデータフロー解析装置１０は、ソースコードを構文解析して作成した抽象構文木（以降、ＡＳＴ：Abstract Syntax Tree ）を入力情報とする。データフロー解析装置１０は、データフロー解析過程で、制御フローグラフを生成せずにデータフローグラフ（以降、ＤＦＧ：Data Flow Graph）を作成する。このデータフロー解析装置１０は、制御構文に対してのみ制御フロー解析を行い、制御構文の処理の流れに沿った変数のデータフローグラフを作成する。
【００１５】
ここで、以降で用いる用語について説明する。
【００１６】
本実施の形態のデータフロー解析装置１０は、一ファイルのソースコードに対応するＡＳＴを解析してＤＦＧを作成する。ＡＳＴは木構造のデータ構造であり、分岐点や葉に演算子と非演算子（変数や定数、ブロック文）の情報を持つ。ＡＳＴの分岐点や葉がＡＳＴノードである。ブロック文は、複数の文の纏まりである。
【００１７】
ＡＳＴノードは、０個以上の子ＡＳＴノードを持つ。子ＡＳＴノードを持つＡＳＴノードは、子ノードから見れば親ノードである。あるＡＳＴノードの親ＡＳＴノードの先の親ＡＳＴノードは先祖ＡＳＴノードである。あるＡＳＴノードの子ＡＳＴノードの先の子ＡＳＴノードは子孫ＡＳＴノードである。
【００１８】
ブロック文は、ブロック文の内部に０個以上のブロック文を持つ。下位ブロックは、あるブロック文の内部にあるブロック文である。また、下位ブロックから見た、当該下位ブロックを含むブロックは上位ブロックである。
【００１９】
制御構文は、例えば、ｉｆ文、繰り返し処理制御文である。繰り返し処理制御文は、処理のループを制御する文であり、例えば、Ｃ言語における、ｗｈｉｌｅ文、ｆｏｒ文、ｄｏｗｈｉｌｅ文である。
【００２０】
図３７及び図３８は、（ａ）ソースコードの一部分と（ｂ）その部分に対応するＡＳＴの例を示す。両図の（ｂ）が示すように、ＡＳＴは、制御構文に対応して、制御構文を表す最上位ノードと、その直下の制御構文内のブロックを表すノードを有する。ここで、ブロックは、図において｛…｝で表されている。ＡＳＴは、ブロックを表すノードの配下に、ブロック内の各命令文に対応した演算子及び変数、定数をノードとしたサブツリーを有する。なお、プログラムにおいて、ブロックは制御構文、下位ブロックを包含することが有り、この場合ＡＳＴは、ブロックを表すノード配下に、制御構文、更に下位ブロックに対応するサブツリーを包含する。
【００２１】
データフロー解析装置１０が作成するＤＦＧは、変数毎のデータフローの集まりである。ＤＦＧは変数の宣言毎に作成され、ノードとリンクを含むグラフ構造のデータである。データフローにおいて、変数の「宣言」、「参照」、「代入」はそれぞれノード(以降、データフローのノードをＤＦＧノードと呼ぶ)で表され、順次関係、代入関係はＤＦＧノード間のリンクで表現される。
【００２２】
ＤＦＧノードは、情報として「ＤＦＧノード識別子」、「変数名」、「ＤＦＧノードの種別(宣言、参照、代入の区別)」、「変数の行桁情報」、「変数が所属する関数定義名」、「変数が所属するファイルパス」を持つ。
【００２３】
順次関係は、ソースコード上の処理の流れに沿った同じ変数名の変数における出現順序を表す。例えば、ソースコード上に「int a;」 と変数：aが宣言され、その宣言された変数の次行に「int b = a;」と変数：bが変数：aを参照する場合、宣言のＤＦＧノード：aから、参照のＤＦＧノード：aにかけて順次関係が形成される。
【００２４】
代入関係は、ソースコード上の変数を、値や変数で置き換える場合の流れを表す。例えば、ソースコード上に「b = a;」という代入式が有る場合、参照のＤＦＧノード：aから代入のＤＦＧノード：bにかけて代入関係が形成される。
【００２５】
順次関係や代入関係が形成されると、データフロー解析装置１０は、作成しているＤＦＧにＤＦＧノード間の順次関係のリンクや、代入関係のリンクを登録する。
【００２６】
ＤＦＧノード間のリンクは、順次関係、代入関係というリンク種別と、依存元のＤＦＧノード、依存先のＤＦＧノードの情報を持つ。例えば、ソースコード上に「int a;」 と変数：aが宣言され、次行で「a++;」と変数：aが参照される場合、宣言のＤＦＧノード：aから参照のＤＦＧノード：aにかけて順次関係が形成される。この場合、宣言のＤＦＧノード：aが依存元のＤＦＧノード、参照のＤＦＧノード：aが依存先のＤＦＧノードである。
【００２７】
順次関係や代入関係を結ぶ、あるいは、順次関係や代入関係を形成するということは、順次関係や代入関係のリンクを作成中のＤＦＧに登録することを意味する。
【００２８】
＜構成＞
次に、本実施形態のデータフロー解析装置１０の構成を説明する。
【００２９】
図１は、本実施形態のデータフロー解析装置１０の全体構成を示す図である。データフロー解析装置１０は、抽象構文木抽出部２０、順次関係形成部２１、依存元ノード候補保持部２２、および、ＤＦＧ記憶部２３を備える。
【００３０】
抽象構文木抽出部２０は、プログラムファイルのソースコードを読み込んで、構文解析を行い、ＡＳＴを出力する。抽象構文木抽出部２０は、よく知られた方法で構文解析を行えばよい。
【００３１】
順次関係形成部２１は、ＡＳＴを入力情報として、制御構文の処理の流れに沿ってＤＦＧのノードを作成し、ノード間の順次関係を結ぶ。順次関係形成部２１は、ＤＦＧ記憶部２３にＤＦＧを作成していく。ＤＦＧ記憶部２３は、ノードの情報と、ノード間のリンク情報との両者を記憶する。
【００３２】
依存元ノード候補保持部２２は、ＤＦＧノード間で順次関係を結ぶために、順次関係の依存元ＤＦＧノードの情報を一時的に保持する。順次関係形成部２１は、或るブロック内のデータフロー解析を行っている間、当該ブロック対応に一時的な記憶域であるブロック対応作業域３０を作成する。依存元ノード候補保持部２２は、ブロック対応作業域３０を格納する。
【００３３】
順次関係形成部２１は、ブロック内のデータフロー解析の開始時にブロック対応作業域３０を作成し、ブロックの解析が終了すると当該ブロックのブロック対応作業域３０を削除する。ブロックがネストしている場合、順次関係形成部２１は、ネストしている各レベルのブロック対応にブロック対応作業域３０を作成する。
【００３４】
図２は、ブロック対応作業域３０のデータ構造を示す図である。ブロック対応作業域３０は、依存元ＤＦＧノード候補一覧表、下位ブロックの先頭ＤＦＧノード一覧表、下位ブロックの最終ＤＦＧノード一覧表を包含する。
【００３５】
依存元ＤＦＧノード候補一覧表、下位ブロックの先頭ＤＦＧノード一覧表、下位ブロックの最終ＤＦＧノード一覧表は、変数名をキーとし、ＤＦＧノードを値とした連想コンテナである。
【００３６】
依存元ＤＦＧノード候補一覧表は、そのブロック対応作業域３０に対応するブロック内の変数参照を表すＤＦＧノード情報を変数名ごとに記憶する。具体的に、依存元ＤＦＧノード候補一覧表は、各変数の先頭ＤＦＧノードと最終ＤＦＧノードの情報を記憶する。ここで、先頭ＤＦＧノードは、その変数に関してブロックで最初に登録したＤＦＧノードである。最終ＤＦＧノードは、その変数に関してブロックで最後に登録したＤＦＧノードである。
【００３７】
下位ブロックの先頭ＤＦＧノード一覧表は、ブロック対応作業域３０に対応するブロックの下位ブロック内の変数参照を表すＤＦＧノードのうち先頭ＤＦＧノードの情報を変数名ごとに記憶する。下位ブロックの最終ＤＦＧノード一覧表は、ブロック対応作業域３０に対応するブロックの下位ブロック内の変数参照を表すＤＦＧノードのうち最終ＤＦＧノードの情報を変数名ごとに記憶する。
【００３８】
なお、抽象構文木抽出部２０、および、順次関係形成部２１は、論理回路で構成される。抽象構文木抽出部２０、または、順次関係形成部２１は、コンピュータであるデータフロー解析装置１０の図示されないメモリに格納され、図示されないプロセッサによって実行されるプログラムによって実現されても良い。
【００３９】
依存元ノード候補保持部２２、および、ＤＦＧ記憶部２３は、ＩＣ（Integrated Circuit）メモリ、ディスク装置等の記憶装置である。
【００４０】
＜動作＞
次に、本実施形態のデータフロー解析装置１０の動作を説明する。
【００４１】
図３乃至図６は、順次関係形成部２１の動作フローチャートである。順次関係形成部２１は、抽象構文木抽出部２０からＡＳＴを入力として受け取ると、データフロー解析を開始する。
【００４２】
まず、図３が示すように、順次関係形成部２１は、受け取ったＡＳＴからＡＳＴノードを一つ取り出す（Ａ４-２）。ブロック文を表すＡＳＴノードを検出した場合（Ａ４−３でＹｅｓ）、順次関係形成部２１は、当該ブロック対応のブロック対応作業域３０を作成し（Ａ４−４）、ブロック間のＤＦＧノードの順次関係を制御構文に基づいて形成する（Ａ４-５）。このステップで、順次関係形成部２１は、取得したブロック文を表すＡＳＴノードの親ＡＳＴノード、先祖ＡＳＴノードと調べていき、制御構文を表すものであるＡＳＴノードを検出した場合に、制御構文の処理に沿った順次関係をＤＦＧノード間で結ぶ。図５及び図６はこの処理の詳細を示す。
【００４３】
その後、順次関係形成部２１は、当該ブロック対応のブロック対応作業域３０を削除し（Ａ４-６）、次のＡＳＴノードの処理（Ａ４−２）に移行する（Ａ４-１２でＮｏ）。すべてのＡＳＴノードの処理が終了した場合（Ａ４-１２でＹｅｓ）、ＤＦＧがＤＦＧ記憶部２３の中で完成している。
【００４４】
順次関係形成部２１は、ＤＦＧの読み出し要求を受けた際にＤＦＧ記憶部２３からＤＦＧを読み出して、外部に出力する（Ａ４−１３）。順次関係形成部２１は、例えば、ＤＦＧをネットワーク経由で送信する、あるいは、順次関係形成部２１に接続されている、図示されないディスプレイ装置に表示する。
【００４５】
取り出したＡＳＴノードが、ブロック文を表すＡＳＴノードでない場合（Ａ４−３でＮｏ）、順次関係形成部２１は、図４の処理に移行する。
【００４６】
図４において、順次関係形成部２１は、当該ＡＳＴノードが変数を表すかどうかを調べ、変数であれば（Ａ４-７でＹｅｓ）、当該変数参照に対するＤＦＧノードをＤＦＧ記憶部２３に作成する（Ａ４-８）。
【００４７】
次いで、順次関係形成部２１は、作成したＤＦＧノードと、ブロック対応作業域３０の下位ブロックの先頭ＤＦＧノード一覧表に登録されている別ブロックのＤＦＧノードとの間で順次関係を形成する（Ａ４-９）。さらに、順次関係形成部２１は、作成したＤＦＧノードと、ブロック対応作業域３０の依存元ＤＦＧノード候補一覧表に登録されている同じブロック内のＤＦＧノードと、の間で順次関係を形成する（Ａ４-１０）。最後に、順次関係形成部２１は、作成したＤＦＧノードを、ブロック対応作業域３０の依存元ＤＦＧノード候補一覧表に登録して（Ａ４-１１）、当該ＡＳＴノードの処理を終了し、図３のＡ４-１２に移行する。
【００４８】
順次関係形成部２１は、当該ＡＳＴノードが変数でなければ（Ａ４-７でＮｏ）、当該ＡＳＴノードについては何もせず、図３のＡ４-１２に移行する。
【００４９】
次に、図５を用いて、ブロック間のＤＦＧノードの順次関係を形成する動作について説明する。
【００５０】
順次関係形成部２１は、ブロックを表すＡＳＴノードから子ＡＳＴノードを取得し（Ａ５-１）、取得した子ＡＳＴノード以下のサブツリーを対象に図３と図４の処理を実行し、子ＡＳＴノード内を探索する（Ａ５-２）。これは、順次関係形成部２１が、子ＡＳＴノード以下のサブツリーを入力して、自身をリカーシブに起動することを意味する。
【００５１】
リカーシブに起動されたとき、順次関係形成部２１は、子ＡＳＴノード内の変数を表すＡＳＴノードからＤＦＧノードを作成し、ブロック対応作業域３０にＤＦＧノードを登録する。ブロック対応作業域３０に登録したＤＦＧノードは、後述する図６のフローの処理で用いる。図６は、ブロック間に跨ったＤＦＧノード間の順次関係を形成する処理のフローチャートである。
【００５２】
子ＡＳＴノード内の探索が完了したら、順次関係形成部２１は、ブロックを表すＡＳＴノードから親ＡＳＴノードを取り出す（Ａ５-３）。取り出した親ＡＳＴノードが制御構文を表すＡＳＴノードである場合（Ａ５-４でＹｅｓ）、順次関係形成部２１は、図６の処理を行う（Ａ５-５）。 
取り出した親ＡＳＴノードが制御構文を表すＡＳＴノードでない場合（Ａ５-４でＮｏ）、順次関係形成部２１は図５のフロー処理を終了する。
【００５３】
図６において、順次関係形成部２１は、上位ブロック内のＤＦＧノードと下位ブロック内のＤＦＧノード間の順次関係を結ぶ（Ａ６−２）。この時、順次関係形成部２１は、ブロック対応作業域３０の依存元ＤＦＧノード候補一覧表、下位ブロックの最終ＤＦＧノード一覧表、下位ブロックの先頭ＤＦＧノード一覧表を用いる。
【００５４】
この動作において、順次関係形成部２１は、まず依存元ノード候補保持部２２から上位ブロックの「依存元ＤＦＧノード候補一覧表」から変数毎の最終ＤＦＧノードを取得する。次に順次関係形成部２１は、下位ブロックの「依存元ＤＦＧノード候補一覧表」から下位ブロックの変数毎の先頭ＤＦＧノードを取得する。同部は更に、下位ブロックの「下位ブロックの先頭ＤＦＧノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の先頭ＤＦＧノードを取得する。次に、順次関係形成部２１は、取得した最終ＤＦＧノードから下位ブロックの先頭ＤＦＧノードと、最終ＤＦＧノードから下位ブロックのさらに下位ブロックの先頭ＤＦＧノードにかけて同じ変数名のＤＦＧノード間で順次関係を結ぶ。
【００５５】
次に、順次関係形成部２１は、ブロックを表すＡＳＴノードの親ＡＳＴノードを調べ、制御構文で無い場合は、さらに親ＡＳＴノード(先祖ＡＳＴノード)を調べていく（Ａ６−３）。調べた結果、親ＡＳＴノード または 先祖ＡＳＴノードがｉｆ文を表すＡＳＴノードであった場合は（Ａ６-４でｉｆ文）、順次関係形成部２１はＡ６−５の処理に移る。親ＡＳＴノード または 先祖ＡＳＴノードがｆｏｒ文 またはｗｈｉｌｅ文または ｄｏｗｈｉｌｅ文を表すＡＳＴノードであった場合は（Ａ６−４で繰り返し処理制御文）、順次関係形成部２１は、Ａ６−１０の処理に移る。
【００５６】
Ａ６−５において、順次関係形成部２１は、下位ブロック(ｉｆ文ｔｈｅｎ節)の「依存元ＤＦＧノード候補一覧表」から下位ブロックに含まれる変数毎の最終ＤＦＧノードを取得する。さらに、同部は、下位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の最終ＤＦＧノードを取得する。順次関係形成部２１は、上位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」に取得した最終ＤＦＧノードを登録する（Ａ６-５）。
【００５７】
Ａ６−５の処理を行うことにより、順次関係形成部２１は、ｉｆ文のブロックの後に出現するＤＦＧノードを作成した際に、この処理で登録した下位ブロックの最終ＤＦＧノードと、ブロック後に出現するＤＦＧノード間で順次関係を結ぶことが可能となる。
【００５８】
次に、順次関係形成部２１は、下位ブロック(ｉｆ文のｔｈｅｎ節)の「依存元ＤＦＧノード候補一覧表」から下位ブロックに含まれる先頭ＤＦＧノードを取得する。同部はさらに、下位ブロックの「下位ブロックの先頭ＤＦＧノード一覧表」から下位ブロックのさらに下位ブロックに含まれる先頭ＤＦＧノードを取得する。順次関係形成部２１は、取得したそれぞれの先頭ＤＦＧノードに対して先頭ＤＦＧノードのＤＦＧノード種別が「宣言」で無いか確認する。ＤＦＧノード種別が「宣言」である場合、順次関係形成部２１は何もしない。ＤＦＧノード種別が「宣言」で無い場合、順次関係形成部２１は、取得したそれぞれの先頭ＤＦＧノードを依存元ノード候補保持部２２に登録されている上位ブロックの「下位ブロックの先頭ＤＦＧノード一覧表」に登録する（Ａ６−６）。
【００５９】
ここで、取得した先頭ＤＦＧノードに対してＤＦＧノード種別が「宣言」で無いことを確認する理由は、変数のスコープが上位ブロックで含まれていることを確認するためである。
【００６０】
Ａ６−６の処理を行うことにより、順次関係形成部２１は、ネストが深い場合でも、Ａ６−２において、上位ブロックと下位ブロックのＤＦＧノード間で順次関係を結ぶことが出来る。
【００６１】
Ａ６−６の処理が終了した後、順次関係形成部２１は、Ａ６−４の処理と同じようにブロックを表すＡＳＴノードの親ＡＳＴノードを確認していき、ｉｆ文にｅｌｓｅ節があるか判断する（Ａ６−７）。ｉｆ文にｅｌｓｅ節が有る場合は（Ａ６−７でＹｅｓ）、Ａ６−８に処理が移り、無い場合は（Ａ６−７でＮｏ）処理を終了する。
【００６２】
ｉｆ文にｅｌｓｅ節が有る場合、順次関係形成部２１は、Ａ６−２と同じ処理で上位ブロックのＤＦＧノードと、ｅｌｓｅ節である下位ブロックのＤＦＧノード間の順次関係を結ぶ（Ａ６−８）。
【００６３】
Ａ６−８の後、順次関係形成部２１は、依存元ノード候補保持部２２に登録されている上位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」からｉｆ文ｔｈｅｎ節に含まれる変数毎の最終ＤＦＧノードを取得する。同部は更に、下位ブロックの「依存元ＤＦＧノード候補一覧表」からｉｆ文ｅｌｓｅ節に含まれる変数毎の最終ＤＦＧノードも取得する。同部は、下位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」からｉｆ文ｅｌｓｅ節に含まれるさらに下位ブロックの変数毎の最終ＤＦＧノードも取得する。
【００６４】
その後、順次関係形成部２１は、取得した最終ＤＦＧノードを、依存元ノード候補保持部２２にある上位ブロックの「依存元ＤＦＧノード候補一覧表」に登録する（Ａ６−９）。
【００６５】
Ａ６−９の処理を行うことにより、ｉｆ文のブロック以降で作成するＤＦＧノードと、Ａ６−９で登録した上位ブロックの「依存元ＤＦＧノード候補一覧表」の最終ＤＦＧノード間に順次関係を結ぶことが可能となる。この結果、順次関係形成部２１は、ｉｆ文ｔｈｅｎ節を通る場合と、ｉｆ文のｅｌａｓｅ節を通る場合のデータフローを求めることができる。
【００６６】
親ＡＳＴノードまたは先祖ＡＳＴノードが、繰り返し処理制御文（ｆｏｒ文 、ｗｈｉｌｅ文または ｄｏｗｈｉｌｅ文）であった場合について説明する。
【００６７】
順次関係形成部２１は、依存元ノード候補保持部２２に登録されている下位ブロック(繰り返し処理制御文のブロック)の「依存元ＤＦＧノード候補一覧表」から下位ブロックに含まれる変数毎の最終ＤＦＧノードを取得する。さらに同部は、下位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の最終ＤＦＧノードを取得する。順次関係形成部２１は、上位ブロックの「下位ブロックの最終ＤＦＧノード一覧表」に取得した最終ＤＦＧノードを登録する（Ａ６−１０）。
【００６８】
Ａ６−１０の処理を行うことで、順次関係形成部２１は、この処理で登録した下位ブロックの最終ＤＦＧノードと、繰り返し制御構文のブロック以降に作成するＤＦＧノードとの間に順次関係を結ぶことが出来る。その結果、順次関係形成部２１は、繰り返し制御構文を通る場合のデータフローを求めることが出来る。
【００６９】
また同じように、順次関係形成部２１は、依存元ノード候補保持部２２に登録されている下位ブロック（繰り返し処理制御文のブロック）の「依存元ＤＦＧノード候補一覧表」から下位ブロックに含まれる変数毎の先頭ＤＦＧノードを取得する。さらに同部は、下位ブロックの「下位ブロックの先頭ＤＦＧノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の先頭ＤＦＧノードを取得する。順次関係形成部２１は、上位ブロックの「下位ブロックの先頭ＤＦＧノード一覧表」に取得した先頭ＤＦＧノードを登録する（Ａ６−１１）。
【００７０】
Ａ６−１１の処理を行うことにより、順次関係形成部２１は、ネストが深い場合でも、Ａ６−２において、上位ブロックと下位ブロックのＤＦＧノード間で順次関係を結ぶことが出来る。
【００７１】
Ａ６−２からＡ６−１１までの処理が完了したら、順次関係形成部２１は、図６の処理を終了する。
【００７２】
＜具体例＞
図７のｉｆ文のサンプルソースコードを例に説明する。まず、順次関係形成部２１は、上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０（図８)の最終ＤＦＧノードと、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０（図９)の先頭ＤＦＧノード間で順次関係を結ぶ(Ａ６-２)。これにより、３行目の変数：aから４行目の変数：aにかけて、変数ａに対応するＤＦＧノード間で順次関係が結ばれる。
【００７３】
次に、順次関係形成部２１は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０（図９)にあるＤＦＧノードを上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０（図８)に登録(Ａ６-４〜Ａ６-６)する。これにより、上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０が図８から図１０のように変化する。
【００７４】
この後、順次関係形成部２１は、６行目の変数：aに対応するＤＦＧノードを作成する（Ａ４-８）。次に順次関係形成部２１は、上位ブロックのブロック対応作業域３０（図１０)のＤＦＧノードの情報を元に４行目の変数：aから６行目の変数：a、３行目の変数：aから６行目の変数：aに対応するＤＦＧノード間で順次関係を結ぶ（Ａ４−９／１０）。
【００７５】
順次関係を結んだ後、順次関係形成部２１は、作成した６行目の変数：aに対応するＤＦＧノードを上位ブロック(関数：ｆｕｎｃ１)のブロック対応作業域３０（図１０)に登録する（Ａ４-１１）。これにより、上位ブロック(関数：ｆｕｎｃ１)の記憶部が図１０から図１１のように変化する。
【００７６】
最終的に、図７のソースコードのデータフローは、図１２のようになる。
【００７７】
次に、図１３のｉｆ文にｔｈｅｎ節、ｅｌｓｅ節の両方が含まれるサンプルソースコードを例に説明する。まず、順次関係形成部２１は、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１４)の最終ＤＦＧノードと、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０（図１５)の先頭ＤＦＧノード間で順次関係を結ぶ(Ａ６-２)。これにより、３行目の変数：aから４行目の変数にかけて、変数に対応するＤＦＧノード間で順次関係が結ばれる。
【００７８】
次に順次関係形成部２１は、下位ブロック（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０（図１５)の最終ＤＦＧノードを上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１４)に登録する(Ａ６-５)。また順次関係形成部２１は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０（図１５)の先頭ＤＦＧノードを上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１４)に登録する(Ａ６-６)。これにより、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０が、図１４から図１６のように変化する。
【００７９】
図１３のサンプルソースコードはｉｆ文のｅｌｓｅ節を含む。従って、順次関係形成部２１は、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１６)の最終ＤＦＧノードと下位ブロック(ｉｆ文のｅｌｓｅ節)のブロック対応作業域３０（図１７)の先頭ＤＦＧノード間で順次関係を結ぶ(Ａ６-８)。
【００８０】
次に、順次関係形成部２１は、下位ブロック(ｉｆ文のｅｌｓｅ節)のブロック対応作業域３０（図１７)のＤＦＧノードを、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１６)に登録し直す(Ａ６-９)。これで、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０が、図１５から図１８のように変化する。順次関係形成部２１は、Ａ６-８を行うことで、３行目の変数：aから７行目の変数：aにかけてＤＦＧノード間で順次関係を結ぶ。
【００８１】
その後順次関係形成部２１は、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０（図１８)の情報を用いて、９行目の変数：aに対応するＤＦＧノードを作成する（Ａ４-８）。このとき順次関係形成部２１は、４行目の変数：aから９行目の変数：aに、また７行目の変数：aから９行目の変数：aにかけて、対応するＤＦＧノード間で順次関係を結ぶ（Ａ４−１０）。順次関係形成部２１が、９行目の変数：aに対応するＤＦＧノードを登録すると、上位ブロック（関数：ｆｕｎｃ２）のブロック対応作業域３０は、図１８から図１９のように変化する。
【００８２】
最終的に、図１３のソースコードのデータフローグラフは、図２０のようになる。
【００８３】
図２１のネストが多段であるｉｆ文のサンプルソースコードを例について、変数：aに着目して説明する。
【００８４】
まず順次関係形成部２１は、下位ブロックのさらに下位ブロック(最下位ブロックと呼ぶ)のブロック対応作業域３０（図２２)の最終ＤＦＧノードを、下位ブロック（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０（図２３)に登録する(Ａ６-５)。順次関係形成部２１は、同じように最下位ブロックのブロック対応作業域３０（図２２)の先頭ＤＦＧノードを下位ブロック（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０（図２３)に登録し直す(Ａ６-６)。これで、下位ブロック（ｉｆ文のｔｈｅｎ節）のブロック対応作業域３０が図２３から図２４のように変化する。
【００８５】
その後順次関係形成部２１は、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０（図２５)のＤＦＧノードから最下位ブロックのＤＦＧノードに対して順次関係を結ぶ(Ａ６-２)。これにより、２行目の変数：aと、６行目の変数：aに対応するＤＦＧノード間で順次関係が結ばれる。
【００８６】
その後、順次関係形成部２１は、下位ブロック(ｉｆ文のｔｈｅｎ節)のブロック対応作業域３０に登録しているＤＦＧノードを、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０（図２５)に登録し直す(Ａ６-６)。これで、上位ブロック(関数：ｆｕｎｃ３)のブロック対応作業域３０が図２５から図２６のように変化する。
【００８７】
その後、順次関係形成部２１は、９行目の変数：aに対応するＤＦＧノードを作成する。このとき、順次関係形成部２１は、上位ブロック（関数：ｆｕｎｃ３）のブロック対応作業域３０（図２６)の情報を用いて、６行目の変数：aから９行目の変数：aにかけて、対応するＤＦＧノード間で順次関係を結ぶ（Ａ４-９）。さらに、順次関係形成部２１は、２行目の変数：aから９行目の変数：aにかけて、対応するＤＦＧノード間で順次関係を結ぶ（Ａ４-１０）。上位ブロック（関数：ｆｕｎｃ.３）のブロック対応作業域３０は、９行目の変数：aに対応するＤＦＧノードが登録されると（Ａ４-１１）、図２６から図２７のように変化する。
【００８８】
最終的に、図２１のサンプルソースコードの変数ａのデータフローグラフは、図２８（ａ）のようになる。なお、変数ｂのデータフローグラフは、図２８（ｂ）のようになる。
【００８９】
次に、図２９のｗｈｉｌｅ文のサンプルソースコードを例に説明する。順次関係形成部２１は、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０（図３０)の最終ＤＦＧノードから下位ブロック(ｗｈｉｌｅ文)のブロック対応作業域３０（図３１)の先頭ＤＦＧノードにかけて順次関係を結ぶ(Ａ６-２)。これにより、３行目の変数：aから４行目の変数：aにかけて、変数ａに対応するＤＦＧノード間の順次関係が結ばれる。
【００９０】
次に、順次関係形成部２１は、下位ブロック(ｗｈｉｌｅ文)のブロック対応作業域３０（図３１)の最終ＤＦＧノードを、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０（図３０)に登録する(Ａ６-１０)。上位ブロック（関数：ｆｕｎｃ.４）のブロック対応作業域３０は、５行目の変数：aに対応するＤＦＧノードを登録されると、図３０から図３２のように変化する。
【００９１】
その後、順次関係形成部２１は、下位ブロックの(ｗｈｉｌｅ文)のブロック対応作業域３０（図３１)の先頭ＤＦＧノードを、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０（図３２)に登録する(Ａ６-１１)。これにより、上位ブロック(関数：ｆｕｎｃ４)のブロック対応作業域３０は、図３２から図３３のように変化する。
【００９２】
最後に、順次関係形成部２１は、７行目の変数：aに対応するＤＦＧノードを作成する（Ａ４-８）。この際、順次関係形成部２１は、上位ブロック（関数：ｆｕｎｃ４）のブロック対応作業域３０（図３３)の情報を用いて、５行目の変数：aから９行目の変数：aにかけて、対応するＤＦＧノード間で順次関係を結ぶ（Ａ４-９）。さらに、順次関係形成部２１は、３行目の変数：aから７行目の変数：aにかけて、対応するＤＦＧノード間で順次関係を結ぶ（Ａ４-１０）。その後、上位ブロック（関数：ｆｕｎｃ.４）のブロック対応作業域３０は、７行目の変数：aに対応するＤＦＧノードが登録されて（Ａ４-１１）、図３３から図３４のように変化する。
【００９３】
最終的に、図２９のソースコードのデータフローは、図３５のようになる。
【００９４】
＜効果＞
本実施の形態のデータフロー解析装置１０は、効率の良いデータフローグラフ作成ができる。その理由は、順次関係形成部２１が制御フローグラフを生成することなく、ＡＳＴからデータフローグラフを作成するからである。このため、制御フローグラフの作成領域が不要となる。
【００９５】
本実施の形態のデータフロー解析装置１０の順次関係形成部２１は、データフロー解析中にデータフロー解析に必要な制御フロー解析のみを行う。当該制御フロー解析の出力情報は制御フローグラフでは無く、データフローグラフのノード間のリンク情報である。順次関係形成部２１は、データフロー解析中に制御フロー解析を行うことで、データフロー解析で必要の無い処理を行わず、制御フロー解析の結果をデータフローグラフの情報として出力できる。
【００９６】
＜第２の実施形態＞
図３６は、第２の実施形態のデータフロー解析装置１０の全体構成を示す図である。本実施の形態のデータフロー解析装置１０は、抽象構文木抽出部２０を備えない。ソースコードからＡＳＴの抽出は他の装置で行われ、本実施の形態のデータフロー解析装置１０は、その結果のＡＳＴをネットワーク経由で受信するなどして、データフロー解析を行う。
【００９７】
さらに、本実施の形態のデータフロー解析装置１０は、依存元ノード候補保持部２２及びＤＦＧ記憶部２３を備えない。例えば、他の装置が依存元ノード候補保持部２２及びＤＦＧ記憶部２３を備え、データフロー解析装置１０は、ネットワーク経由でそれらをアクセスする。
【００９８】
本実施の形態のデータフロー解析装置１０は、順次関係形成部２１を備える。順次関係形成部２１は、ブロック構造を有するプログラムの抽象構文木を取得する。
【００９９】
順次関係形成部２１は、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをＤＦＧ記憶部２３に作成して、両端ノード情報をブロック対応に記憶する。
【０１００】
順次関係形成部２１は、当該抽象構文木から、ブロック内の対象変数の参照を検出すると、対応するノードと、当該ノードとブロック対応に記憶している下位ブロックのノード間のリンクと、を生成してＤＦＧ記憶部２３に追加する。
【０１０１】
本実施の形態のデータフロー解析装置１０は、効率の良いデータフローグラフ作成ができる。その理由は、順次関係形成部２１が制御フローグラフを生成することなく、ＡＳＴからデータフローグラフを作成するからである。このため、制御フローグラフの作成領域が不要となる。
【０１０２】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【０１０３】
１０    データフロー解析装置
２０    抽象構文木抽出部
２１    順次関係形成部
２２    依存元ノード候補保持部
２３    ＤＦＧ記憶部
３０    ブロック対応作業域
【図１】
0006502044.tif 000002
【図２】
0006502044.tif 000003
【図３】
0006502044.tif 000004
【図４】
0006502044.tif 000005
【図５】
0006502044.tif 000006
【図６】
0006502044.tif 000007
【図７】
0006502044.tif 000008
【図８】
0006502044.tif 000009
【図９】
0006502044.tif 000010
【図１０】
0006502044.tif 000011
【図１１】
0006502044.tif 000012
【図１２】
0006502044.tif 000013
【図１３】
0006502044.tif 000014
【図１４】
0006502044.tif 000015
【図１５】
0006502044.tif 000016
【図１６】
0006502044.tif 000017
【図１７】
0006502044.tif 000018
【図１８】
0006502044.tif 000019
【図１９】
0006502044.tif 000020
【図２０】
0006502044.tif 000021
【図２１】
0006502044.tif 000022
【図２２】
0006502044.tif 000023
【図２３】
0006502044.tif 000024
【図２４】
0006502044.tif 000025
【図２５】
0006502044.tif 000026
【図２６】
0006502044.tif 000027
【図２７】
0006502044.tif 000028
【図２８】
0006502044.tif 000029
【図２９】
0006502044.tif 000030
【図３０】
0006502044.tif 000031
【図３１】
0006502044.tif 000032
【図３２】
0006502044.tif 000033
【図３３】
0006502044.tif 000034
【図３４】
0006502044.tif 000035
【図３５】
0006502044.tif 000036
【図３６】
0006502044.tif 000037
【図３７】
0006502044.tif 000038
【図３８】
0006502044.tif 000039