(57)【要約】【課題】ソースコードからステートマシン図を自動的に作成可能な状態遷移図作成装置および状態遷移図作成方法を提供する。【解決手段】リスト作成手段５は、ソースコードＡを解析してコード行の間の対応関係を特定し、その対応関係と、状態宣言アノテーションと、条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストＤを作成する。状態宣言アノテーションは、変化の後の状態を表し、状態変化コード行に付与されており、条件宣言アノテーションは、制御による変化前の状態を表し、制御コード行に付されている。ステートマシン図描画手段４は、遷移リストＤに基づいて、ステートマシン図（状態遷移図）Ｅを作成する。【選択図】図１
2008198103.tif 000002
【特許請求の範囲】
【請求項１】
状態を変数として用いる処理を規定する複数のコード行と、前記複数のコード行のうち、状態の変化を表す状態変化コード行に付与された、前記変化の後の状態を表す状態宣言アノテーションと、前記複数のコード行のうち、状態に対する制御を表す制御コード行に付与された、前記制御による変化前の状態を表す条件宣言アノテーションと、を有するソースコードから、状態遷移図を作成する状態遷移図作成装置であって、
前記ソースコードを解析して前記コード行の間の対応関係を特定し、前記対応関係と、前記状態宣言アノテーションと、前記条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストを作成するリスト作成手段と、
前記遷移リストに基づいて、前記状態遷移図を作成する状態遷移図作成手段と、を含む状態遷移図作成装置。
【請求項２】
請求項１に記載の状態遷移図作成装置において、
前記リスト作成手段は、
前記ソースコードを解析して、前記ソースコードにおけるコード行の入れ子構造および前記制御コード行を特定し、前記入れ子構造および前記制御コード行に基づいて、前記ソースコードから、複数の制御ブロックと、前記制御ブロックに入るための条件と、を抽出し、前記入れ子構造に基づいて、前記制御ブロックに関する制御ブロック木構造を特定し、前記条件を、前記制御ブロック木構造内の当該条件に対応する制御ブロックに付加する制御構造解析手段と、
前記状態宣言アノテーション、前記条件宣言アノテーションおよび前記制御ブロック木構造に基づいて、前記制御ブロックごとに、当該制御ブロックがとり得る前の状態を表すイン状態リストと、当該制御ブロックがとり得る後の状態を表すアウト状態リストと、を生成し、前記制御ブロック木構造内の各制御ブロックに、対応する前記イン状態リストおよび前記アウト状態リストを付加して、イン／アウト状態付制御ブロック木構造を作成する状態解析手段と、
前記状態宣言アノテーションを有する制御ブロックについて、当該制御ブロックの、イン状態リスト、アウト状態リスト、および、条件宣言アノテーションに基づいて、前記遷移リストを作成する遷移解析手段と、を含む、状態遷移図作成装置。
【請求項３】
状態を変数として用いる処理を規定する複数のコード行と、前記複数のコード行のうち、状態の変化を表す状態変化コード行に付与された、前記変化の後の状態を表す状態宣言アノテーションと、前記複数のコード行のうち、状態に対する制御を表す制御コード行に付与された、前記制御による変化前の状態を表す条件宣言アノテーションと、を有するソースコードから、状態遷移図を作成する状態遷移図作成装置が行う状態遷移図作成方法であって、
前記ソースコードを解析して前記コード行の間の対応関係を特定し、前記対応関係と、前記状態宣言アノテーションと、前記条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストを作成するリスト作成ステップと、
前記遷移リストに基づいて、前記状態遷移図を作成する状態遷移図作成ステップと、を含む状態遷移図作成方法。
【請求項４】
請求項３に記載の状態遷移図作成方法において、
前記リスト作成ステップは、
前記ソースコードを解析して、前記ソースコードにおけるコード行の入れ子構造および前記制御コード行を特定し、前記入れ子構造および前記制御コード行に基づいて、前記ソースコードから、複数の制御ブロックと、前記制御ブロックに入るための条件と、を抽出し、前記入れ子構造に基づいて、前記制御ブロックに関する制御ブロック木構造を特定し、前記条件を、前記制御ブロック木構造内の当該条件に対応する制御ブロックに付加する制御構造解析ステップと、
前記状態宣言アノテーション、前記条件宣言アノテーションおよび前記制御ブロック木構造に基づいて、前記制御ブロックごとに、当該制御ブロックがとり得る前の状態を表すイン状態リストと、当該制御ブロックがとり得る後の状態を表すアウト状態リストと、を生成し、前記制御ブロック木構造内の各制御ブロックに、対応する前記イン状態リストおよび前記アウト状態リストを付加して、イン／アウト状態付制御ブロック木構造を作成する状態解析ステップと、
前記状態宣言アノテーションを有する制御ブロックについて、当該制御ブロックの、イン状態リスト、アウト状態リスト、および、条件宣言アノテーションに基づいて、前記遷移リストを作成する遷移解析ステップと、を含む、状態遷移図作成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、状態遷移図作成装置および状態遷移図作成方法に関し、特には、ソースコードから状態遷移図（ステートマシン図）を作成する状態遷移図作成装置および状態遷移図作成方法に関する。
【背景技術】
【０００２】
従来、ソースコードの開発の多くは、ステートマシン図を利用して行われる。「ステートマシン図」は、ステートチャート（図）および状態遷移図と同義である。
【０００３】
開発者の意図（設計情報）が正確に反映されていないステートマシン図に基づいて、ソースコードが作成されると、そのソースコードに基づく処理は、設計情報と乖離し、状態遷移に不整合が生じる。開発者は、状態遷移に生じる不整合を、ソースコードを一目で見て分からない。
【０００４】
この問題を解決する１つの方法は、ソースコードからステートマシン図をリバースし、そのステートマシン図に基づいて仕様の誤りをチェックする方法である。「リバース」とは、開発プロセス上で、前工程の成果から後工程の成果を作る通常の作業に対して、後工程の成果から前工程の成果を作ることを表わす。
【０００５】
なお、特許文献１には、イベントシーケンスからステートマシン図をリバースする手順が記述されている。
【０００６】
また、市販されているＢｏｒｌａｎｄ社の「Ｔｏｇｅｔｈｅｒ」やチェンジビジョン社の「ＪＵＤＥ」といったＵＭＬ（Ｕｎｉｆｉｅｄ Ｍｏｄｅｌｉｎｇ Ｌａｎｇｕａｇｅ）記法のモデル記述ツールには、ソースコードからＵＭＬ記法のモデルへリバースする機能が備わっている。
【特許文献１】特開平１１−２４９００号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
特許文献１には、ソースコードからステートマシン図をリバースして生成するための方式や装置に関する記載はない。
【０００８】
また、Ｂｏｒｌａｎｄ社の「Ｔｏｇｅｔｈｅｒ」やチェンジビジョン社の「ＪＵＤＥ」といったＵＭＬ記法のモデル記述ツールにおいても、生成できるモデルの種類は、プログラムを構成するクラスとその関係を表わすクラス図や、できても処理の流れを表わすシーケンス図、コミュニケーション図に限られており、ソースコードから状態遷移を表わすステートマシン図をリバースするツールは存在しなかった。
【０００９】
このため、開発者は、手作業で、ソースコードや設計書を解析してステートマシン図を描画するしかなく、ミスが発生したり、時間がかかるといった欠点もあった。
【００１０】
本発明の目的は、ソースコードからステートマシン図（状態遷移図）を自動的に作成可能な状態遷移図作成装置および状態遷移図作成方法を提供することである。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明の状態遷移図作成装置は、状態を変数として用いる処理を規定する複数のコード行と、前記複数のコード行のうち、状態の変化を表す状態変化コード行に付与された、前記変化の後の状態を表す状態宣言アノテーションと、前記複数のコード行のうち、状態に対する制御を表す制御コード行に付与された、前記制御による変化前の状態を表す条件宣言アノテーションと、を有するソースコードから、状態遷移図を作成する状態遷移図作成装置であって、前記ソースコードを解析して前記コード行の間の対応関係を特定し、前記対応関係と、前記状態宣言アノテーションと、前記条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストを作成するリスト作成手段と、前記遷移リストに基づいて、前記状態遷移図を作成する状態遷移図作成手段と、を含む。
【００１２】
また、本発明の状態遷移図作成方法は、状態を変数として用いる処理を規定する複数のコード行と、前記複数のコード行のうち、状態の変化を表す状態変化コード行に付与された、前記変化の後の状態を表す状態宣言アノテーションと、前記複数のコード行のうち、状態に対する制御を表す制御コード行に付与された、前記制御による変化前の状態を表す条件宣言アノテーションと、を有するソースコードから、状態遷移図を作成する状態遷移図作成装置が行う状態遷移図作成方法であって、前記ソースコードを解析して前記コード行の間の対応関係を特定し、前記対応関係と、前記状態宣言アノテーションと、前記条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストを作成するリスト作成ステップと、前記遷移リストに基づいて、前記状態遷移図を作成する状態遷移図作成ステップと、を含む。
【００１３】
状態宣言アノテーションは、変化の後の状態を表し、状態の変化を表す状態変化コード行に付与されている。条件宣言アノテーションは、制御による変化前の状態を表し、状態に対する制御を表す制御コード行に付与されている。
【００１４】
コード行の間の対応関係から、複数のコード行に応じた状態変化処理を行なった際の処理の流れを特定することが可能であり、その際の状態の変化を、状態宣言アノテーションと条件宣言アノテーションを用いて特定することが可能となる。
【００１５】
このため、上記発明によれば、コード行の間の対応関係と、状態宣言アノテーションと、条件宣言アノテーションとに基づいて、複数のコード行に応じた処理を行なった際の状態の変化の変遷を特定することが可能になる。よって、遷移前の状態と遷移後の状態を対応させた遷移リストを作成可能になり、その遷移リストに基づいて、状態遷移図を作成することが可能になる。
【００１６】
したがって、状態宣言アノテーションおよび条件宣言アノテーションが付与されたソースコードから状態遷移図を作成することが可能になる。
【００１７】
このため、ユーザは、ソースコードから作成された状態遷移図と設計情報とを比較することによって、ソースコードの実装の正しさを検証することが可能になる。
【００１８】
また、ソースコードから状態遷移図を自動作成できるので、人為的なミスを防止でき、短時間で状態遷移図を作成することが可能となる。
【００１９】
なお、前記リスト作成手段は、前記ソースコードを解析して、前記ソースコードにおけるコード行の入れ子構造および前記制御コード行を特定し、前記入れ子構造および前記制御コード行に基づいて、前記ソースコードから、複数の制御ブロックと、前記制御ブロックに入るための条件と、を抽出し、前記入れ子構造に基づいて、前記制御ブロックに関する制御ブロック木構造を特定し、前記条件を、前記制御ブロック木構造内の当該条件に対応する制御ブロックに付加する制御構造解析手段と、前記状態宣言アノテーション、前記条件宣言アノテーションおよび前記制御ブロック木構造に基づいて、前記制御ブロックごとに、当該制御ブロックがとり得る前の状態を表すイン状態リストと、当該制御ブロックがとり得る後の状態を表すアウト状態リストと、を生成し、前記制御ブロック木構造内の各制御ブロックに、対応する前記イン状態リストおよび前記アウト状態リストを付加して、イン／アウト状態付制御ブロック木構造を作成する状態解析手段と、前記状態宣言アノテーションを有する制御ブロックについて、当該制御ブロックの、イン状態リスト、アウト状態リスト、および、条件宣言アノテーションに基づいて、前記遷移リストを作成する遷移解析手段と、を含むことが望ましい。
【００２０】
上記発明によれば、高い確度で、状態遷移図を作成することが可能になる。
【発明の効果】
【００２１】
本発明によれば、ソースコードから状態遷移図を自動的に作成することが可能になる。
【発明を実施するための最良の形態】
【００２２】
以下、本発明の実施例を図面を参照して説明する。
【００２３】
図１は、本発明の一実施例であるステートマシン図リバース装置１００を示したブロック図である。
【００２４】
ステートマシン図リバース装置１００は、状態遷移図作成装置の一例であり、アノテーション付きのソースコードＡを入力としてステートマシン図Ｅを生成する。
【００２５】
ステートマシン図リバース装置１００は、制御構造解析手段１、状態解析手段２、遷移解析手段３、および、ステートマシン図描画手段４を含み、中間生成物として、制御ブロック木構造Ｂ、ｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃ、および、遷移リストＤを生成する。なお、制御構造解析手段１と、状態解析手段２と、遷移解析手段３とで、リスト作成手段５を構成する。
【００２６】
図２は、アノテーション付きのソースコードＡの一例を示した説明図である。
【００２７】
ソースコードＡは、アノテーション付きのプログラム、または、アノテーション付きのプログラムの一部である。
【００２８】
ソースコードＡは、３つの要素、具体的には、状態宣言アノテーションと、条件宣言アノテーションと、業務ロジックが記述されたコード部（上記の２種類アノテーションに該当しないコード部）と、から成り立っている。
【００２９】
コード部は、状態を変数として用いる処理を規定する複数のコード行からなる。
【００３０】
状態の変化を表す状態変化コード行「state=・・・」には、変化の後の状態を表す状態宣言アノテーション「//@state=・・・」が付与されている。
【００３１】
具体的には、状態変化コード行「int state=0」には、状態宣言アノテーション「//@state=initial」が付与されている。また、状態変化コード行「state=prepare()」には状態宣言アノテーション「//@state=prepare」が、状態変化コード行「state=go()」には状態宣言アノテーション「//@state=go.first」が、状態変化コード行「state=next()」には状態宣言アノテーション「//@state=go.second」が、状態変化コード行「state=end()」には状態宣言アノテーション「//@state=end」が付与されている。
【００３２】
状態に対する制御を表す制御コード行「例えば、if(state==・・・)」には、制御による変化前の状態を表す条件宣言アノテーション「//@condition=・・・」が付与されている。
【００３３】
例えば、制御コード行「if(state==1)」には、条件宣言アノテーション「//@condition=prepare」が付与されている。
【００３４】
制御構造解析手段１は、ソースコードＡを解析して、ソースコードＡ内の制御部（具体的には、条件分岐（ｉｆ文、）と繰返し（ｗｈｉｌｅ文、ｆｏｒ文））および入れ子構造を特定する。なお、制御部は、状態に対する制御を表す制御コード行を含む。
【００３５】
制御構造解析手段１は、ソースコードＡ内の制御部および入れ子構造に基づいて、ソースコードＡから複数の制御ブロックを抽出する。制御ブロックは、制御部および入れ子構造に基づいてソースコードＡから分割されたプログラムの断片である。
【００３６】
なお、プログラム言語により、ｅｌｓｅ節（ｉｆ文のどの条件にもあてはまらない場合に実行されるブロック）の表記が省略される場合があるため、制御構造解析手段１は、省略されたｅｌｓｅ節に関しても、何も処理を伴わない制御ブロックとして定義する。
【００３７】
図３は、制御構造解析手段１によって複数の制御ブロックに分割されたソースコードＡの例を示した説明図である。
【００３８】
制御構造解析手段１は、個々の制御ブロックの入れ子構造を解析して、制御ブロックの木構造を構成し、その木構造を、制御ブロック木構造Ｂとする処理を行なう。
【００３９】
制御構造解析手段１は、親の制御ブロックと子の制御ブロックをつなぐ線をエッジとし、エッジには、種別（「排他」または「繰返し」またはＮＵＬＬのいずれか）と、子の制御ブロックに制御が移るための条件を表わすラベルとを、属性として持たせる。
【００４０】
なお、制御構造解析手段１は、子の制御ブロックに制御が移るための条件を、入れ子構造および制御コード行に基づいて、ソースコードＡから抽出する。
【００４１】
図４は、制御構造解析手段１が図３で示したソースコードＡの各制御ブロックについて作成した制御ブロック木構造Ｂの例を示した説明図である。
【００４２】
状態解析手段２は、ソースコードＡを順にたどることによって制御ブロック木構造Ｂを深さ優先で探索し、それぞれの制御ブロックに対して、木構造上の位置、状態宣言アノテーション、および、条件宣言アノテーションを基に、ｉｎ（イン）状態リストおよびｏｕｔ（アウト）状態リストを作成する。
【００４３】
状態解析手段２は、ｉｎ状態リストおよびｏｕｔ状態リストを、それらリストに対応する各制御ブロックに付加して、ｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃを作成する処理を行なう。
【００４４】
ｉｎ状態リストとは、そのリストに対応する制御ブロックに制御が入る際にとりうる状態を表したリストのことであり、ｏｕｔ状態リストとは、そのリストに対応する制御ブロックから制御が出る際にとりうる状態を表したリストのことである。
【００４５】
図５は、状態解析手段２が図４で示した制御ブロック木構造Ｂについて作成したｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃの例を示した説明図である。
【００４６】
遷移解析手段３は、状態宣言アノテーションを有するそれぞれの制御ブロックに対して、制御ブロック内のコード、イン状態リスト、アウト状態リスト、および、条件宣言アノテーションに基づいて、イベント、条件、遷移前の状態、遷移後の状態を特定して、遷移リストＤを作成する。
【００４７】
図７は、遷移解析手段３が図５で示したｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃについて作成した遷移リストＤの例を示した説明図である。
【００４８】
図７に示したように、遷移リストＤは、遷移番号、イベント、条件、遷移前の状態、遷移後の状態から構成される。
【００４９】
ステートマシン図描画手段４は、状態遷移図作成手段の一例であり、遷移リストＤに基づいて、ステートマシン図を作成する。具体的には、ステートマシン図描画手段４は、遷移リストＤ内の各状態、開始状態、終了状態をステートマシン図に描画し、また、遷移リストＤ内のそれぞれの遷移に対して、遷移前の状態から遷移後の状態への遷移を描画する処理を行なう。
【００５０】
図８は、ステートマシン図描画手段４が図７で示した遷移リストＤについて作成したステートマシン図Ｅの例を示した説明図である。
【００５１】
リスト作成手段５は、ソースコードＡを解析してコード行の間の対応関係（例えば、コード行における親子関係）を特定し、その対応関係と、状態宣言アノテーションと、条件宣言アノテーションと、に基づいて、遷移前の状態と遷移後の状態とを対応させた遷移リストＤを作成する。
【００５２】
次に、動作を説明する。
【００５３】
図９は、ステートマシン図リバース装置１００の動作を説明するためのフローチャートである。以下、図９のフローチャートを参照して、本実施例の全体の動作について詳細に説明する。
【００５４】
なお、以下の説明では、図２に示したソースコードＡからステートマシン図を作成する動作を説明するが、ソースコードは、図２に示したものに限らず適宜変更可能である。
【００５５】
制御構造解析手段１は、ソースコードＡを構文解析し、まず、ソースコードＡの入れ子構造に基づいて、ソースコードＡから複数の制御ブロックを抽出し、その後、それら制御ブロックを、条件分岐（ｉｆ文）および繰返し（ｗｈｉｌｅ文、ｆｏｒ文）等の制御部の直前と直後で分割する。
【００５６】
具体的には、制御構造解析手段１は、まず、入れ子構造に基づいて、ソースコードＡから、制御ブロックａと、制御ブロックｂ１〜ｂ３をまとめた制御ブロックと、を抽出し、その後、制御部に基づいて、制御ブロックｂ１〜ｂ３をまとめた制御ブロックを、制御ブロックｂ１、制御ブロックｂ２（制御部）、制御ブロックｂ３に分割して、制御ブロックｂ１〜ｂ３を抽出する。
【００５７】
続いて、制御構造解析手段１は、制御部（制御ブロックｂ２）内部に関しても、入れ子構造に基づいて、複数の制御ブロック（制御ブロックｂ２−１、制御ブロックｂ２−２、制御ブロックｃ１、制御ブロックｃ２、制御ブロックｃ３、制御ブロックｃ４、制御ブロックｅ１、制御ブロックｅ２、制御ブロックｅ３）に分割して、それらを抽出する（ステップａ）。
【００５８】
ここまでの動作で、図３に示した複数の制御ブロックが抽出される。
【００５９】
続いて、制御構造解析手段１は、個々の制御ブロックの入れ子構造を解析して木構造を構成し、その木構造を制御ブロック木構造Ｂとする。
【００６０】
その際に、制御ブロックが制御部で始まる場合、制御構造解析手段１は、子の制御ブロックに制御が移るための条件を、親の制御ブロックと子の制御ブロックとの関係として、木構造のエッジのラベルに記述し、エッジの種別も排他と繰返しに応じて変えておく。
【００６１】
また、その条件に条件宣言アノテーションが記述されている場合、制御構造解析手段１は、その条件宣言アノテーションの内容も、ラベルに”ａｎｄ”でつないで記述する（ステップｂ）。
【００６２】
ここまでの動作で、図４に示した制御ブロック木構造Ｂが作成される。
【００６３】
続いて、状態解析手段２は、対象ブロックを一番親の制御ブロック（制御ブロックａ）とし、また、空の前ｏｕｔ状態リストを作成する（ステップｃ）。
【００６４】
状態解析手段２は、対象ブロックを探索し、ｉｎ状態リストおよびｏｕｔ状態リストを作成する。状態解析手段２は、制御ブロック木構造Ｂを全て探索して、ｉｎ状態リストおよびｏｕｔ状態リストを、制御ブロック木構造Ｂ内の全ての制御ブロックについて付与したものを、ｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃとする（ステップｄ）
図１０は、ｉｎ状態リストおよびｏｕｔ状態リストを作成するための処理を説明するためのフローチャートである。
【００６５】
以下、図１０を参照して、ｉｎ状態リストおよびｏｕｔ状態リストの方法を説明する。
【００６６】
まず、状態解析手段２は、対象ブロックである制御ブロックのｉｎ状態リストおよびｏｕｔ状態リストがなければ、空のｉｎ状態リストとｏｕｔ状態リストを作成する（ステップｄ１）。
【００６７】
続いて、状態解析手段２は、前ｏｕｔ状態リストの値を、対象ブロックである制御ブロックのｉｎ状態リストに追加登録する（ステップｄ３）。
【００６８】
続いて、状態解析手段２は、対象ブロックに対応する変数ｉおよびｊを０にし（ステップｄ１０１）、対象ブロックとなっている制御ブロックに対応するソースコードＡの断片を最初から最後まで順に走査していき（ステップｄ１０２Ａ〜ステップｄ１０２Ｂ）、その走査中に以下の処理を行なう。
【００６９】
状態宣言アノテーションに到達した場合（ステップｄ１０３）（例えば図５の制御ブロックｅ１）、状態解析手段２は、状態遷移と判断して、状態宣言アノテーションの値ひとつをｏｕｔ状態リストに登録する。複数の状態宣言アノテーションがあった場合は、状態解析手段２は、その都度ｏｕｔ状態リストの値を、新たな状態宣言アノテーションの値に置換していく（ステップｄ４）。その後、状態解析手段２は、対象ブロックに対応する変数ｉに１を加算する（ステップｄ１０４）。
【００７０】
状態宣言アノテーションに到達せずに子の制御ブロックに到達した場合（ステップｄ１０３、ｄ１０５）（例えば図５の制御ブロックｃ４）、状態解析手段２は、対象ブロックに対応する変数ｊに１を加算し（ステップｄ１０６）、その後、子の制御ブロックを対象ブロックとして（ステップｄ１０７）、ステップｄの処理を行なう。探索した制御ブロックと子の制御ブロックとの関係が繰返しの場合、状態解析手段２は、最後の子のｏｕｔ状態リストが変わらなくなるまで、子の制御ブロックの探索を順番に繰返し行なう（ステップｄ’）。
【００７１】
一方、状態宣言アノテーションが見つからなかった場合（ステップｄ１０３）、状態解析手段２は、変数ｉ＝０を保持しながら、以下の処理を行なう。
【００７２】
当該制御ブロックが子の制御ブロックを持たない場合（ステップｄ１０５）（例えば図５の制御ブロックｅ３）、ｊ＝０も保持され、状態解析手段２は、ステップｄ１０８およびｄ１０９を通り、ｉｎ状態リストの値をそのままｏｕｔ状態リストに登録する（ステップｄ５）。
【００７３】
子の制御ブロックを持ち（この場合、ｊ≠０となる。）、子の制御ブロックとの間のエッジの種別が排他の場合（例えば図５の制御ブロックｃ４）、状態解析手段２は、ステップｄ１０８、ｄ１０９およびｄ１１０を通り、子の制御ブロックのｏｕｔ状態リストの各状態（値）を高々ひとつずつ当該制御ブロックのｏｕｔ状態リストに追加する（ステップｄ６）。
【００７４】
子の制御ブロックを持ち（この場合、ｊ≠０となる。）、子の制御ブロックとの間のエッジの種別が繰返しの場合（例えば図５の制御ブロックｃ２）、状態解析手段２は、ステップｄ１０８、ｄ１０９、ｄ１１０およびｄ１１１を通り、当該制御ブロックのｉｎ状態リストの各状態と子の制御ブロックのｏｕｔ状態リストの各状態を高々ひとつずつ合わせて当該制御ブロックのｏｕｔ状態リストに登録する（ステップｄ１０）。
【００７５】
子の制御ブロックを持ち（この場合、ｊ≠０となる。）、その間のエッジの種別が排他でも繰返しでもない場合（例えば図５の制御ブロックａ）、状態解析手段２は、ステップｄ１０８、ｄ１０９、ｄ１１０およびｄ１１１を通り、最後の子の制御ブロックのｏｕｔ状態リストの値を当該制御ブロックのｏｕｔ状態リストに登録する（ステップｄ７）。
【００７６】
また、探索した制御ブロックとその親の制御ブロックとの間のエッジの種別が排他の場合（ステップｄ１１２）（例えば図５の制御ブロックｅ３）、状態解析手段２は、当該制御ブロックのｉｎ状態リストの値を前ｏｕｔ状態リストにコピーする（ステップｄ８）。
【００７７】
また、探索した制御ブロックとその親の制御ブロックとのエッジの種別が排他でない場合（ステップｄ１１２）（例えば図５の制御ブロックｃ３）、状態解析手段２は、当該制御ブロックのｏｕｔ状態リストの値を前ｏｕｔ状態リストにコピーする（ステップｄ９）。
【００７８】
ここまでの動作で、図５に示したｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃが作成される。
【００７９】
図１１は、各制御ブロックに対して、図１０に示したフローチャートの処理が適用される流れを示した説明図である。
【００８０】
遷移解析手段３は、遷移リストＤを初期化して空のリストとしておく。
【００８１】
遷移解析手段３は、遷移番号として、遷移リストＤに遷移が追加される順に連番をふることとする。
【００８２】
遷移解析手段３は、各制御ブロックに対して、対応するソースコードＡの断片を走査して状態宣言アノテーションを見つけた場合、その制御ブロックのｉｎ状態リストの各状態を遷移前の状態とし、状態宣言アノテーションで記述された状態を遷移後の状態とする遷移を遷移リストＤに加え、そのｉｎ状態リストを状態宣言アノテーションで記述された状態に更新する。
【００８３】
遷移解析手段３は、対応するソースコードＡの断片が終了するまで走査を続ける。
【００８４】
なお、遷移解析手段３は、遷移のイベントには、状態宣言アノテーションが記述された行に記述された操作名（関数名：具体的には、prepare、go、next、end）を記述する。
【００８５】
また、遷移解析手段３は、当該制御ブロックの最初の状態の遷移を遷移リストＤに追加する場合、遷移の条件として、木構造の親を全てたどってエッジに記述されたラベルを全て”ａｎｄ”でつないだものを記述する。
【００８６】
次に、遷移解析手段３は、遷移リストＤ内で、条件に状態が記述されている状況で、その状態が遷移前の条件（条件宣言アノテーションに表された状態）と合致しない場合（例えば図７の遷移番号４）、当該遷移を遷移リストＤから削除する（ステップｅ）。
【００８７】
図６は、遷移解析手段３が、図５のｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃに対して、ステップｅを実行した後の状態のｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃを示した説明図である。
【００８８】
ステートマシン図描画手段４は、開始状態と、遷移リストＤ内の各遷移の遷移前の状態に記述された状態と遷移後の状態に記述された状態を高々ひとつずつ、および、終了状態を順番に、例えば縦一列または横一列に、配置する。
【００８９】
ただし、ステートマシン図描画手段４は、状態がピリオドで区切られている場合は、コンポジット状態と判断して、入れ子にして状態を記述する。
【００９０】
ステートマシン図描画手段４は、コンポジット状態にも開始状態と終了状態をひとつずつ配置する（ステップｆ）。
【００９１】
次に、ステートマシン図描画手段４は、遷移リスト内のそれぞれの遷移に関して、イベントや条件を、ＵＭＬで決められた書式のラベルとして、遷移前の状態から遷移後の状態への結線を行なう。
【００９２】
状態前の遷移がＮＵＬＬの場合、ステートマシン図描画手段４は、開始状態からの遷移とする。
【００９３】
また、状態後の遷移がＮＵＬＬの場合、ステートマシン図描画手段４は、終了状態への遷移とする。
【００９４】
コンポジット状態の外から内への遷移の場合、ステートマシン図描画手段４は、コンポジット状態への遷移を記述し、またコンポジット状態内の開始状態から遷移後の状態への遷移も記述する。
【００９５】
ステートマシン図描画手段４は、条件を、前者の遷移のラベルとして描画する。
【００９６】
コンポジット状態の内から外への遷移の場合、ステートマシン図描画手段４は、遷移前の状態からコンポジット状態内の終了状態への遷移を記述し、またコンポジット状態から遷移後の状態への遷移も記述する。
【００９７】
ステートマシン図描画手段４は、条件を、後者の遷移のラベルとして描画する（ステップｇ）。
【００９８】
本実施例によれば、コード行の間の対応関係と、状態宣言アノテーションと、条件宣言アノテーションとに基づいて、複数のコード行に応じた処理を行なった際の状態の変化の変遷を特定することが可能になる。よって、遷移前の状態と遷移後の状態を対応させた遷移リストを作成可能になり、その遷移リストに基づいて、状態遷移図を作成することが可能になる。
【００９９】
本実施例によれば、以下の効果を奏する。
【０１００】
第１の効果は、ソースコードが設計通りに実装されているか検証を行なうことができる点にある。
【０１０１】
その理由は、ソースコード上では人間が容易に状態遷移を把握することが困難であったが、本実施例によりリバースしたステートマシン図により人間が設計情報を比較して実装の正しさを判断できるためである。
【０１０２】
第２の効果は、ステートマシン図の作成に関する正確性や開発生産性が向上する点にある。
【０１０３】
その理由は、ソースコードから状態遷移図を手作業で書くのは、ミスが発生したり、時間がかかっていたが、本発明によりソースコードからステートマシン図を自動作成できるので、工数が削減できるためである。
【０１０４】
なお、以上説明した実施例において、図示した構成は単なる一例であって、本発明はその構成に限定されるものではない。
【０１０５】
例えば、プログラミング言語の仕様により、繰返し処理においては、
（１）図３で示したように繰返しループに入らない可能性がある場合（ｗｈｉｌｅ文など）
（２）必ず一度は繰返しループに入る場合（ｄｏ〜ｗｈｉｌｅ文など）
（３）繰返しの回数が決まっている場合（ｆｏｒ文で繰返し数が定数の場合など）
などの記法があるため、これを区別するようなアノテーションを定義して、リスト作成部５が、そのアノテーションを解析する。
【０１０６】
例えば、リスト作成部５（状態解析手段２）は、（２）の場合、ステップｄ１０でなくステップｄ７を通るような処理フローを実行し、（３）の場合、ステップｄ’の繰返し数を決めてステップｄ’をその数だけ繰り返すことによって、正確なステートマシン図を得ることが可能になる。
【０１０７】
また、ステートマシン図リバース装置１００が、プログラムにしたがって動作するコンピュータによって実現されてもよい。
【０１０８】
この場合、制御構造解析手段１、状態解析手段２、遷移解析手段３、および、ステートマシン図描画手段４は、ステートマシン図リバース装置１００の動作を規定するプログラムを読み取り実行するコンピュータによって実現される。
（発明の利用が考えられる分野）
本発明を利用すれば、実装まで開発を行なったソフトウェアのソースコードに対して、状態に関するアノテーションを記述しさえすれば、リバースしてステートマシン図を自動で生成して、状態遷移の検証に利用するといった用途に適用することが可能である。
【図面の簡単な説明】
【０１０９】
【図１】本発明の一実施例であるステートマシン図リバース装置１００を示したブロック図である。
【図２】アノテーション付きのソースコードＡの一例を示した説明図である。
【図３】複数の制御ブロックに分割されたソースコードＡの例を示した説明図である。
【図４】制御ブロック木構造Ｂの例を示した説明図である。
【図５】ｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃの例を示した説明図である。
【図６】修正されたｉｎ／ｏｕｔ状態付き制御ブロック木構造Ｃの例を示した説明図である。
【図７】遷移リストＤの例を示した説明図である。
【図８】ステートマシン図Ｅの例を示した説明図である。
【図９】ステートマシン図リバース装置１００の動作を説明するためのフローチャートである。
【図１０】ステートマシン図リバース装置１００の動作を説明するためのフローチャートである。
【図１１】ステートマシン図リバース装置１００の動作を説明するための説明図である。
【符号の説明】
【０１１０】
１      制御構造解析手段
２      状態解析手段
３      遷移解析手段
４      ステートマシン図描画手段
５      リスト作成手段
１００  ステートマシン図リバース装置
【図１】
2008198103.tif 000003
【図２】
2008198103.tif 000004
【図３】
2008198103.tif 000005
【図４】
2008198103.tif 000006
【図５】
2008198103.tif 000007
【図６】
2008198103.tif 000008
【図７】
2008198103.tif 000009
【図８】
2008198103.tif 000010
【図９】
2008198103.tif 000011
【図１０】
2008198103.tif 000012
【図１１】
2008198103.tif 000013