(57)【特許請求の範囲】
【請求項１】
変更前後のソースコードを構文解析し差分を抽出するコンピュータ装置であって、前記コンピュータ装置は、
変更前後のソースコードに含まれる予約語に基づき構文解析を行い、前記変更前後のソースコードの各々に対して、前記予約語をノードとする抽象構文木データを生成する構文解析手段と、
前記生成した抽象構文木データの木構造データの深さに基づきネスト情報の解析を行い、前記変更前後のソースコードの各々に対して、ネスト構文要素データを生成するネスト情報解析手段と、
前記生成したネスト構文要素データの各々の比較に基づき、差分抽出データを生成する差分抽出手段であって、前記差分抽出データは、前記変更前後のソースコードにおいて変更があったことを示す第１の差分識別子を含む、差分抽出手段と、
少なくとも一致判別ルールと条件追加・削除抽出ルールとに基づき前記生成した差分抽出データを解析し、差分解析データを生成する差分解析手段であって、前記差分解析データは、変更前後の変更がどのような変更かを示す第２の差分識別子、ならびに変更前後の予約語と、非予約語と、ネスト数と、行番号とを変更前後の行単位で対応して有し、前記第２の差分識別子は、前記第１の差分識別子と比較して、少なくとも、変更前後の変更内容が条件文の条件の追加、または削除であることを多く示すことができ、前記差分解析データを生成することは、
前記一致判別ルールに従った解析として、前記生成した差分抽出データのうちの、変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の行として一致するか否かを判定すること
を含む、差分解析手段と
を備えたことを特徴とするコンピュータ装置。
【請求項２】
前記差分解析データを生成することは、
前記条件追加・削除抽出ルールに従った解析として、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の変更が条件文の条件の追加、または削除であるか否かを判定すること
をさらに含むことを特徴とする請求項１に記載のコンピュータ装置。
【請求項３】
前記差分解析データを生成することは、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行のネスト数を比較して、字上げまたは字下げが発生しているか否かを判定することをさらに含み、前記第２の差分識別子は、前記第１の差分識別子と比較して、変更前後の変更内容が字上げまたは字下げであることをさらに示すことができることを特徴とする請求項１または２に記載のコンピュータ装置。
【請求項４】
前記コンピュータ装置は、前記生成した差分解析データと前記生成した変更前のソースコードに対するネスト構文要素データを設計書用文言に変換し、設計書データを生成する設計書生成手段であって、前記設計書データは、変更前後の変更内容を、変更前後の行単位で対応して有する、設計書生成手段をさらに備えたことを特徴とする請求項１乃至３のいずれか一項に記載のコンピュータ装置。
【請求項５】
前記設計書データは、前記変更前後の変更内容を修飾表示するためのデータと、前記変更前後の変更内容をハイライト表示するためのデータとをさらに有することを特徴とする請求項４に記載のコンピュータ装置。
【請求項６】
変更前後のソースコードを構文解析し差分を抽出し、設計書データを生成するコンピュータ実行方法であって、前記コンピュータ実行方法は、
変更前後のソースコードに含まれる予約語に基づき構文解析を行い、前記変更前後のソースコードの各々に対して、前記予約語をノードとする抽象構文木データを生成するステップと、
前記生成した抽象構文木データの木構造データの深さに基づきネスト情報の解析を行い、前記変更前後のソースコードの各々に対して、ネスト構文要素データを生成するステップと、
前記生成したネスト構文要素データの各々の比較に基づき、差分抽出データを生成するステップであって、前記差分抽出データは、前記変更前後のソースコードにおいて変更があったことを示す第１の差分識別子を含む、生成するステップと、
少なくとも一致判別ルールと条件追加・削除抽出ルールとに基づき前記生成した差分抽出データを解析し、差分解析データを生成するステップであって、前記差分解析データは、変更前後の変更がどのような変更かを示す第２の差分識別子、ならびに変更前後の予約語と、非予約語と、ネスト数と、行番号とを変更前後の行単位で対応して有し、前記第２の差分識別子は、前記第１の差分識別子と比較して、少なくとも、変更前後の変更内容が条件文の条件の追加、削除、字上げ、または字下げであることを多く示すことができ、前記差分解析データを生成するステップは、
前記一致判別ルールに従った解析として、前記生成した差分抽出データのうちの、変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の行として一致するか否かを判定するステップと、
前記条件追加・削除抽出ルールに従った解析として、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の変更が条件文の条件の追加、または削除であるか否かを判定するステップと、
前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行のネスト数を比較して、字上げまたは字下げが発生しているか否かを判定するステップと
を含む、生成するステップと、
前記生成した差分解析データと前記生成した変更前のソースコードに対するネスト構文要素データを設計書用文言に変換し、設計書データを生成するステップであって、前記設計書データは、変更前後の変更内容を、変更前後の行単位で対応して有する、生成するステップと
を備えたことを特徴とするコンピュータ実行方法。
【請求項７】
変更前後のソースコードを構文解析し差分を抽出し、設計書データを生成するコンピュータ実行方法をコンピュータに実行させるためのコンピュータ実行可能命令からなるコンピュータプログラムであって、前記コンピュータ実行方法は、
変更前後のソースコードに含まれる予約語に基づき構文解析を行い、前記変更前後のソースコードの各々に対して、前記予約語をノードとする抽象構文木データを生成するステップであって、前記抽象構文木データは、前記予約語をノードとする木構造データであり、前記予約語と、前記予約語に対応する非予約語と、前記予約語を含む行を示す行番号データとを有する、生成するステップと、
前記生成した抽象構文木データの木構造データの深さに基づきネスト情報の解析を行い、前記変更前後のソースコードの各々に対して、ネスト構文要素データを生成するステップと、
前記生成したネスト構文要素データの各々の比較に基づき、差分抽出データを生成するステップであって、前記差分抽出データは、前記変更前後のソースコードにおいて変更があったことを示す第１の差分識別子を含む、生成するステップと、
少なくとも一致判別ルールと条件追加・削除抽出ルールとに基づき前記生成した差分抽出データを解析し、差分解析データを生成するステップであって、前記差分解析データは、変更前後の変更がどのような変更かを示す第２の差分識別子、ならびに変更前後の予約語と、非予約語と、ネスト数と、行番号とを変更前後の行単位で対応して有し、前記第２の差分識別子は、前記第１の差分識別子と比較して、少なくとも、変更前後の変更内容が条件文の条件の追加、削除、字上げ、または字下げであることを多く示すことができ、前記差分解析データを生成するステップは、
前記一致判別ルールに従った解析として、前記生成した差分抽出データのうちの、変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の行として一致するか否かを判定するステップと、
前記条件追加・削除抽出ルールに従った解析として、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の変更が条件文の条件の追加、または削除であるか否かを判定するステップと、
前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行のネスト数を比較して、字上げまたは字下げが発生しているか否かを判定するステップと
を含む、生成するステップと、
前記生成した差分解析データと前記生成した変更前のソースコードに対するネスト構文要素データを設計書用文言に変換し、設計書データを生成するステップであって、前記設計書データは、変更前後の変更内容を、変更前後の行単位で対応して有する、生成するステップと
を備えたことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、構文解析を用いたソースコードの差分抽出方法およびシステムに関する。
【背景技術】
【０００２】
コンピュータを動作させるために、Ｊａｖａ（登録商標）、Ｃ言語、Ｃ＋＋などのプログラミング言語を用いて、人間（場合によってはコンピュータ自身）により記述されるコンピュータプログラム（ソースコード）は、一度記述された後であっても、再度記述が見直され、場合によっては変更されることが少なくない。例えば、当該ソースコードにより動作するアプリケーションやシステムなどの開発段階、またはリリース後などに、機能（仕様）変更が発生したり、バグの発生による修正作業が発生したりする場合があるためである。ソースコードを変更した場合、変更したソースコードの品質を確保するために、変更前後のソースコードを比較し、変更内容が正しくソースコードに反映されているかの確認作業を行う。この確認作業は、ソースコードを変更した開発者自身による自己レビューのみならず、他の開発者や開発者以外の者（例えば、当該ソースコードにより動作するアプリケーションやシステムなどの利用者、すなわち顧客など）による第三者レビューによって実施される。このレビューは、変更内容が正しくソースコードに反映されているか確認するために、変更前後のソースコードを視認して変更箇所を抽出し、これを比較、検討することにより行われる。しかしながら、アプリケーションやシステムの規模によるが、ソースコードが数千、数万行に及ぶ場合や、また変更箇所も数百、数千箇所に及ぶ場合もあるため、変更前後のソースコードから変更箇所を抽出する作業（差分抽出作業）には膨大な工数を要している。また、ソースコードの記述は、類似箇所が多数あったり、同一内容を繰り返し記述していたりする場合などがあり、変更箇所の抽出に一層工数を要したり、場合によっては、変更前後のソースコードの誤った箇所同士を変更前後として対応付けてしまう場合もある。さらに、特に開発者以外の者は、ソースコードを読めない場合が多いいため、ソースコードから差分を抽出し、設計書（例えば詳細設計書など）を修正する作業がさらに必要となる。この際の設計書の修正箇所は、ソースコードの修正箇所にほぼ等しく、またソースコードと設計書の修正箇所の対応付けを誤る場合もある。このように、ソースコードの差分抽出により、工数増大や品質低下の問題が発生している。
【０００３】
上記問題を解決するために、従来より、多くの差分抽出ツール（またはシステム）が利用されてきた。これらは、変更前後のソースコードの互いの１行づつを比較し、同一行を特定し、特定されなかった行を変更箇所として抽出するものである。差分抽出ツールの一態様では、例えば、ＧＵＩ（グラフィカルユーザインターフェース）を介して、比較する変更前後のソースコードを選択し、ＧＵＩ上の左右に変更前後のソースを表示し、変更があった行をハイライト表示したり、削除・追加された行はソースコードの一方を空行で表示するなどし、変更箇所をユーザに示す。別の態様では、結果をファイルに出力するものもある。いずれにせよ、変更前後のソースコードの行の対応付け（例えば変更前後のソースコードを横並びにして同じ高さの行を同一行としたり、変更前後の行番号を示す、など）と、変更内容が示される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平６−３１８１５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来の差分抽出ツールは、必ずしもユーザにとって十分な情報が示されているとは言えない。例えば、行の一部の変更（例えば、ＩＦ文の複数パラメータの１つのパラメータの変更）や単にインデントの上げ下げ（以下、「字上げ」、「字下げ」という）を行った場合であっても、その行に変更があったことしか判断できず、また変更前後の行の対応関係を正確に検知することもできない。すなわち、ユーザは結局、示された情報から、「２行目から７行目が変更行として示されているが、その中の５行は変更後のソースコードでは空行のため、５行が削除され、残りの１行は、変更前のソースコードの６行目と一致するため、６行目だけが２行目として残っている」、または「１行目のＩＦ文が変更箇所として示されているが、１つ目のパラメータ部分は同一で、２つ目のパラメータ部分は異なり、３つ目の・・・」などと、比較、検討を行う必要がある。この作業を変更箇所のほぼ全てに対して行うことになり、場合によっては誤認や見落としが発生する場合もある。このように、従来の差分抽出ツールは、本来解決すべき、ソースコードの差分抽出による工数増大や品質低下の問題を十分に解決できているとは言い難い。 
【０００６】
また、特許文献１に記載の発明など、設計書などドキュメントの保守を目的として、ソースコード（プログラム）中のコメントや制御文を構文解析し、コンピュータによりドキュメントを作成する方法が開示されているが、作成されるドキュメントは修正後のソースコードによるもののみであり、ソースコードの差分抽出をし、変更箇所を明確に示すようなドキュメントを生成するものではない。
【０００７】
本発明は、このような問題に鑑みてなされたもので、その目的とするところは、構文解析を用いたソースコードの差分抽出方法およびシステムを提供することにある。
【課題を解決するための手段】
【０００８】
本発明は、このような目的を達成するために、
変更前後のソースコードを構文解析し差分を抽出するコンピュータ装置であって、前記コンピュータ装置は、
変更前後のソースコードに含まれる予約語に基づき構文解析を行い、前記変更前後のソースコードの各々に対して、前記予約語をノードとする抽象構文木データを生成する構文解析手段と、
前記生成した抽象構文木データの木構造データの深さに基づきネスト情報の解析を行い、前記変更前後のソースコードの各々に対して、ネスト構文要素データを生成するネスト情報解析手段と、
前記生成したネスト構文要素データの各々の比較に基づき、差分抽出データを生成する差分抽出手段であって、前記差分抽出データは、前記変更前後のソースコードにおいて変更があったことを示す第１の差分識別子を含む、差分抽出手段と、
少なくとも一致判別ルールと条件追加・削除抽出ルールとに基づき前記生成した差分抽出データを解析し、差分解析データを生成する差分解析手段であって、前記差分解析データは、変更前後の変更がどのような変更かを示す第２の差分識別子、ならびに変更前後の予約語と、非予約語と、ネスト数と、行番号とを変更前後の行単位で対応して有し、前記第２の差分識別子は、前記第１の差分識別子と比較して、少なくとも、変更前後の変更内容が条件文の条件の追加、または削除であることを多く示すことができ、前記差分解析データを生成することは、
前記一致判別ルールに従った解析として、前記生成した差分抽出データのうちの、変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の行として一致するか否かを判定すること
を含む、差分解析手段と
を備えたことを特徴とする。
【０００９】
また、前段落に記載の発明における、前記差分解析データを生成することは、
前記条件追加・削除抽出ルールに従った解析として、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行で対応する予約語および非予約語の各々同士の一致度合いに応じて、変更前後の変更が条件文の条件の追加、または削除であるか否かを判定すること
をさらに含むことを特徴とする。
【００１０】
さらに、前段落に記載の発明における、前記差分解析データを生成することは、前記一致判別ルールに従った解析において変更前後の行として一致すると判定された場合、前記変更前後の行のネスト数を比較して、字上げまたは字下げが発生しているか否かを判定することをさらに含み、前記第２の差分識別子は、前記第１の差分識別子と比較して、変更前後の変更内容が字上げまたは字下げであることをさらに示すことができることを特徴とする。
【００１１】
また、前段落に記載の発明における、前記コンピュータ装置は、前記生成した差分解析データと前記生成した変更前のソースコードに対するネスト構文要素データを設計書用文言に変換し、設計書データを生成する設計書生成手段であって、前記設計書データは、変更前後の変更内容を、変更前後の行単位で対応して有する、設計書生成手段をさらに備えたことを特徴とする。
【００１２】
さらに、前段落に記載の発明における、前記設計書データは、前記変更前後の変更内容を修飾表示するためのデータと、前記変更前後の変更内容をハイライト表示するためのデータとをさらに有することを特徴とする。
【発明の効果】
【００１３】
以上説明したように、本発明によれば、変更前後のコンピュータプログラム（ソースコード）に対して構文解析、差分抽出を行い、さらに差分の詳細を解析することにより、変更箇所を明確に示すようなドキュメントを生成することが可能となる。
【図面の簡単な説明】
【００１４】
【図１】本発明の一実施形態に係るコンピュータの構成を示すブロック図である。
【図２】本発明の一実施形態に係るソースコード差分抽出・解析処理フローを示す図である。
【図３】本発明の一実施形態に係る旧ソースコードを示す図である。
【図４】本発明の一実施形態に係る新ソースコードを示す図である。
【図５】従来の差分抽出ツールによる新旧ソースコードの差分抽出例を示す図である。
【図６】理想的な、新旧ソースコードの差分抽出例を示す図である。
【図７】本発明の一実施形態に係る旧ソースコードの抽象構文木を示す図である。
【図８】本発明の一実施形態に係る新ソースコードの抽象構文木を示す図である。
【図９】本発明の一実施形態に係る旧ソースコードの抽象構文木データを示す図である。
【図１０】本発明の一実施形態に係る新ソースコードの抽象構文木データを示す図である。
【図１１】本発明の一実施形態に係る旧ソースコードのネスト・構文要素ＴＳＶを示す図である。
【図１２】本発明の一実施形態に係る新ソースコードのネスト・構文要素ＴＳＶを示す図である。
【図１３】本発明の一実施形態に係る差分抽出結果を示す図である。
【図１４】本発明の一実施形態に係る差分解析処理フローを示す図である。
【図１５】本発明の一実施形態に係る一致判別ルールに従った判定処理フローを示す図である。
【図１６】本発明の一実施形態に係る条件追加・削除抽出ルールに従った解析処理フローを示す図である。
【図１７】本発明の一実施形態に係る字上げ・字下げ抽出ルールに従った解析処理フローを示す図である。
【図１８】本発明の一実施形態に係る差分解析結果を示す図である。
【図１９】本発明の一実施形態に係る設計書生成処理フローを示す図である。
【図２０】本発明の一実施形態に係る予約語−日本語変換テーブルを示す図である。
【図２１】本発明の一実施形態に係る設計書生成結果を示す図である。
【発明を実施するための形態】
【００１５】
以下、図面を参照しながら本発明の実施形態について詳細に説明する。
【００１６】
図１は、本発明の一実施形態に係るコンピュータの構成を示すブロック図である。コンピュータ１００は、処理装置１０１に、システムバス１０２を介してメモリ１０３、入力装置１０４、出力装置１０５、通信制御装置１０６および不揮発性記憶媒体（ＲＯＭやＨＤＤなど）で構成される記憶装置１０７が接続された構成を有する。記憶装置１０７は、差分抽出システム１１０を格納しており、差分抽出システム１１０は、各機能を奏するためのソフトウェアプログラムを格納するプログラム格納領域と、随時取得するデータや処理結果としてのデータなどを格納するデータ格納領域とを備えている。以下に説明するプログラム格納領域の各手段は、実際は独立したソフトウェアプログラム、そのルーチンやコンポーネントなどであり、処理装置１０１によって記憶装置１０７から呼び出されメモリ１０３のワークエリアに展開されて、データベースなどを適宜参照しながら順次実行されることで、各機能を奏するものである。
【００１７】
プログラム格納領域に格納されているソフトウェアプログラムは、本発明に関連するものだけを列挙すると、構文解析手段１１１、ネスト情報解析手段１１２、差分抽出手段１１３、差分解析手段１１４、および設計書生成手段１１５を備えている。
【００１８】
データ格納領域は、本発明に関連するものだけを列挙すると、ソースコードデータ記憶部１２１、抽象構文木データ記憶部１２２、ネスト・構文要素ＴＳＶデータ記憶部１２３、差分抽出データ記憶部１２４、差分解析データ記憶部１２５、設計書データ記憶部１２６、構文解析データ記憶部１２７、および構文変換データ記憶部１２８を備える。何れも、記憶装置１０７内に確保された一定の記憶領域である。
【００１９】
図２は、本発明の一実施形態に係るソースコード差分抽出・解析処理フローを示す図である。本フローは、大きく分けて５つのステップからなる。各ステップの詳細な説明は、図を用いて後述する。ここでは、処理の大まかな流れを説明する。
【００２０】
まず、ステップ２０１にて、構文解析手段１１１が、ソースコードデータ記憶部１２１に記憶された変更前のソースコード（以下、「旧ソースコード」という）と、変更後のソースコード（以下、「新ソースコード」という）を取得する。続いて、構文解析手段１１１は、取得した新旧ソースコードの各々に対し、構文解析データ記憶部１２７に記憶された構文解析データ（ソースコード中の定型語、例えば、ＩＦ文の“ＩＦ”や“ＥＬＳＥ”などの予約語）に基づき、構文解析を行い、抽象構文木というデータ構造を生成する。抽象構文木は、その詳細は後述するが、予約語をノードとし、各予約語に対応する非予約語（例えばＩＦ文の条件部分）を各々の葉として持つ木構造である。抽象構文木は、新旧ソースコードの各々で生成され、抽象構文木データ記憶部１２２に記憶される。
【００２１】
次に、ステップ２０２にて、ネスト情報解析手段１１２が、生成された新旧ソースコードの抽象構文木を、抽象構文木データ記憶部１２２から取得し、各予約語についてルートからの深さをカウントすることでネスト情報を解析し、ネスト数を算出する。続いて、ネスト情報解析手段１１２は、各予約語単位に、対応する非予約語と算出したネスト数を１レコードとし、各レコードをソースコードの行番号順に持ったネスト・構文要素ＴＳＶ（Ｔａｂ  Ｓｅｐａｒａｔｅｄ  Ｖａｌｕｅｓ／タブ区切り）データを生成する。ネスト・構文要素ＴＳＶは、新旧ソースコードの各々で生成され、ネスト・構文要素ＴＳＶデータ記憶部１２３に記憶される。
【００２２】
次に、ステップ２０３にて、差分抽出手段１１３が、生成された新旧ソースコードのネスト・構文要素ＴＳＶデータを、ネスト・構文要素ＴＳＶデータ記憶部１２３から取得し、各レコードを比較することで、差分を抽出する。ここでの差分抽出は、従来技術と同等のものであり、新旧ソースコードにおける変更箇所（変更行）を特定するのみである。すなわち、ソースコードの削除、追加、変更を差分として抽出することはできるが、変更についてはどのような変更がされたのか、および行中の全体についての変更なのか、または一部なのかを示すことはできない。抽出された差分データは、差分抽出データ記憶部１２４に記憶される。
【００２３】
次に、ステップ２０４にて、差分解析手段１１４が、生成された差分抽出データを、差分抽出データ記憶部１２４から取得し、所定のルールに基づいて、各予約語、および非予約語を比較することで、各変更がどのような変更（行追加・削除、条件の追加・削除、など）なのかを解析する。また、各ネスト数を比較することで、字上げ・字下げによる変更の有無を解析する。解析結果は、差分解析データ記憶部１２５に記憶される。
【００２４】
次に、ステップ２０５にて、設計書生成手段１１５が、旧ネスト・構文要素ＴＳＶデータをベースに、差分解析データと、構文変換データ記憶部１２８に記憶された構文変換データ（例えば、予約語と日本語の変換テーブル）とに基づき、設計書を生成する。
【００２５】
次に、図３‐１３、および１８のソースコードやデータ、図１４−１７のフローチャートを参照して、一実施形態に係るソースコードの差分抽出および解析処理を詳細に説明する。なお、図３‐１３、および１８のソースコードやデータは、以下の説明において、流れに沿って説明できるよう、一貫性を持たせてある。
【００２６】
図３は、本発明の一実施形態に係る旧ソースコードを示す図であり、図４は、本発明の一実施形態に係る新ソースコードを示す図である。３０１および４０１はソースコードの行数を表し、３０２および４０２にはソースコードを示す。また、図３の旧ソースコードに対し、変更を行ったものが図４の新ソースコードである。より具体的には、図３の旧ソースコードから、「QTY = 0 AND ID != 4」なる条件分岐を削除し、どのような場合であっても「MOVE 'Success' TO RTN-CDE」（旧ソースコードの６行目）を実行するように変更したものが、図４の新ソースコードである。この際、ＩＦ文により２文字分ネストされていた旧ソースコード６行目は、２文字分字上げされる。
【００２７】
まず、当該新旧ソースコードに対し、従来の差分抽出ツールを用いて差分抽出を行った結果例を図５に示す。５０１はソースコードの行数を表し、５０２が旧ソースコード、５０３が新ソースコードである。５０４には、新旧ソースコードの各行を対比した結果、どのような変更が行われたかを示している。５０４を参照すると、旧ソースコードの２行目〜７行目に対し何らかの変更が行われ、新ソースコードの２行目になったことがわかる。しかしながら、図６に示す理想的な差分抽出結果例のように、旧ソースコードの２行目〜５行目、および７行目が削除され、６行目が字上げされたことが示されることが望ましい。
【００２８】
次に、一実施形態に係るソースコードの差分抽出および解析処理のうち、第１ステップ（図２のステップ２０１）となる新旧ソースコードの構文解析および抽象構文木の生成について説明する。
【００２９】
第１ステップでは、図３および図４に示す新旧ソースコードの各々をインプットとし、構文解析を行い、新旧ソースコード各々の抽象構文木データをアウトプットとして生成する。当該構文解析は、構文解析データ（図示せず。具体的には、ソースコード中の定型語、例えば、ＩＦ文の“ＩＦ”や“ＥＬＳＥ”などの予約語と、特定のルールを有するデータである。特定のルールとは、例えば、ＩＦ文は“ＩＦ”から始まり、“ＩＦ”の後には“ＴＨＥＮ”が続き、場合によって“ＥＬＳＥ”が続く、など予約語におけるルールである。）に基づいて行われる。より具体的には、ソースコードの各行に対し、構文解析データを用いて、各行が何らかの予約語を含む構文なのか、単なるコメントか、などの解析を行い、各行と行間の関係を抽象構文木というデータ構造に変換する。この際、単なるコメントは排除され、ソースコードの実行に関係する予約語および非予約語が変換される。
【００３０】
図７は、本発明の一実施形態に係る旧ソースコードの抽象構文木を示す図であり、図８は、本発明の一実施形態に係る新ソースコードの抽象構文木を示す図である。当該抽象構文木は、１つのルート（図７および８では「  /  」で示す。）を基点として、各予約語をノードとし、各予約語に対応する非予約語（例えばＩＦ文の条件部分。図７および８にでは、破線ブロックで示す。）を各々の葉として持つ木構造である。また、各ノードは行番号を持ち、各予約語のノードはネストする度にノードを深くして示される（換言すると、ノードの深さを以って、ネストレベルを表現している）。ここで、非予約語のノードを破線で示しているのは、抽象構文木上で非予約語は予約語の付随的な情報であることを意味するためである。したがって、非予約語のノードは枝分かれして示され、付随する予約語と同一のネストレベルに属していることを示している。
【００３１】
図７および８に新旧ソースコードの抽象構文木を示したが、これらはあくまでもデータ構造のイメージを示すもので、実際にソースコードから変換（生成）されるデータは、図９および１０に示されるものである。図９は、本発明の一実施形態に係る旧ソースコードの抽象構文木データを示す図であり、図１０は、本発明の一実施形態に係る新ソースコードの抽象構文木データを示す図である。抽象構文木データ９０１および１００１は予約語毎のレコードであり、ユニークな整数値である「ＩＤ」と、従属する予約語のレコードのＩＤを示す「親ＩＤ」と、従属する親ＩＤが同一の場合の他レコードとの関係（順序）を示す「兄弟間の順序」と、「予約語」、「行番号」、予約語に付随する非予約語を示す「非予約語のリスト」とからなる。ここで、抽象構文木データ上、「兄弟間の順序」を持たずに、単に「ＩＤ」を連番にして「ＩＤ」が若いレコードの方が兄弟間の順序が先である、または「行番号」が若い方が先の順序である、などと判断することもできる。また、「非予約語のリスト」は、予約語に対して付随する非予約語が複数存在する場合は、例えば、カンマなどのデリミタを用いて１つのデータ項目として持つことになるが、非予約語毎に１レコードとすることもできる。この場合、予約語と非予約語がユニークキーになり、さらに非予約語の順序を示すデータを持つことになることは、当業者であれば理解できよう。
【００３２】
続いて、一実施形態に係るソースコードの差分抽出および解析処理のうち、第２ステップ（図２のステップ２０２）となる新旧ソースコードのネスト情報の解析およびネスト・構文要素ＴＳＶの生成について説明する。
【００３３】
第２ステップでは、第１ステップで生成した新旧ソースコードの抽象構文木データ９０１および１００１の各々をインプットとし、ネスト情報の解析を行い、新旧ソースコード各々のネスト・構文要素ＴＳＶをアウトプットとして生成する。当該ネスト情報の解析は、各予約語についてルートからの深さをカウントする。
【００３４】
図１１は、本発明の一実施形態に係る旧ソースコードのネスト・構文要素ＴＳＶを示す図であり、図１２は、本発明の一実施形態に係る新ソースコードのネスト・構文要素ＴＳＶを示す図である。ネスト・構文要素ＴＳＶ１１０１および１２０１は予約語毎のレコードであり、予約語毎に算出したネスト数を示す「ネスト数」と、「予約語」と、予約語に付随する１番目の非予約語を示す「非予約語１」と、予約語に付随する２番目の非予約語を示す「非予約語２」と、「行番号」からなる。ここで、「ネスト数」は、上述の通り、ルートからの深さをカウントすることにより算出されるが、図１１および１２の例では、ネストした数を示すために、カウント数から１減算した数値を示している。また、図１１および１２の例では、「非予約語１」および「非予約語２」の２つの非予約語を示しているが、３番目以降の非予約語が必要な場合は、「非予約語３」以降のデータ項目を持つことを理解されたい。また、「非予約語１」および「非予約語２」は、上述した抽象構文木データ９０１および１００１の例のように、デリミタを用いて１つのデータ項目として持つこともできる。さらに図１１における予約語「ＴＨＥＮ」および「ＥＬＳＥ」のレコードに見られるように、「非予約語１」には、例えば、対応する予約語「ＩＦ」のレコードの「非予約語１」の値を持つこともできる。なお、ネスト・構文要素ＴＳＶ（Ｔａｂ  Ｓｅｐａｒａｔｅｄ  Ｖａｌｕｅｓ／タブ区切り）は、ＴＳＶとしているが、必ずしもタブ区切り形式である必要はない。
【００３５】
続いて、一実施形態に係るソースコードの差分抽出および解析処理のうち、第３ステップ（図２のステップ２０３）となる新旧ソースコードの差分抽出および差分抽出結果データの生成について説明する。
【００３６】
第３ステップでは、第２ステップで生成した新旧ソースコードのネスト・構文要素ＴＳＶ１１０１および１２０１の各々をインプットとし、差分抽出を行い、差分抽出結果データをアウトプットとして生成する。当該差分抽出は、従来技術と同等のものであり、新旧ソースコードのネスト・構文要素ＴＳＶの各レコードを「行番号」順に比較することにより、変更されたレコード（すなわち、新旧ソースコードにおける変更行）を特定する。
【００３７】
図１３は、本発明の一実施形態に係る差分抽出結果を示す図である。図１３において、差分抽出結果データ１３０１の１行目（１３０２）の「2,6c2」は、「旧ソースコードの２〜６行目を、新ソースコードの２行目に変更した。」ことを示す。なお、「c」は、変更を意味する「change」の頭文字であるが、別の識別子を用いてもよい。また、「c」の他に、追加を意味する「add」の頭文字の「a」、削除を意味する「delete」の頭文字の「d」を用いて、行の追加や削除を示すことができる。例えば、「（旧ソースコードの０行目の位置に）新ソースコードの１〜３行目を追加した。」ことを示すために「0a1,3」、または「旧ソースコードの２〜５行目を削除した（削除部分は、新ソースコードでは、１行目となる）。」ことを示すために「2,5d1」などと示すことができる。また、ソースコードの２〜５行目を意味する「2,5」は、「2-5」などと表記することもできる。
【００３８】
次に、図１３における差分抽出結果データ１３０１の２〜６行目（１３０３）は、左矢印を意味する「<」識別子を持つ旧内容部分であり、８行目（１３０５）は、右矢印を意味する「>」識別子を持つ新内容部分である。すなわち、「<」および「>」識別子は、「旧ソースコード→新ソースコード」への変更を意味するものであるが、別の表現を用いることもできる。また、７行目（１３０４）の「---」は新旧ソースコードの区切りを意味するものであるが、同様に別の表記を用いることもできる。なお、「<」および「>」識別子の隣の数値は、各レコードのネスト数を表す。
【００３９】
さらに変更、追加、削除がある場合は、１３０６に示すように追加して示すことができる。また、差分抽出結果データ１３０１を、図５に示すように新旧ソースコードの行を対応付けて生成することもできる。いずれにせよ、図１３における差分抽出は、従来技術と同等のものであるため、行変更の場合は、旧ソースコードのある行に対して何らかの変更が行われ、新ソースコードのある行に変更された、ことしか示さない。そのため、次ステップにて、本ステップで生成した差分抽出結果データ１３０１をさらに解析する。
【００４０】
続いて、一実施形態に係るソースコードの差分抽出および解析処理のうち、第４ステップ（図２のステップ２０４）となる差分抽出結果データ１３０１の解析および差分解析結果データ１８０１の生成について説明する。
【００４１】
第４ステップでは、第３ステップで生成した差分抽出結果データ１３０１をインプットとし、さらに解析を行い、後述する差分解析結果データ１８０１をアウトプットとして生成する。差分抽出結果データ１３０１の解析は、差分抽出結果データ１３０１における旧内容部分１３０３および新内容部分１３０５の各行における予約語および非予約語を、後述する一致判別ルール、および条件追加・削除抽出ルールに基づいて、比較し、差分として抽出された各行の変更がどのような変更（行追加・削除、条件の追加・削除、など）なのかを解析する。また、各ネスト数を比較することで、字上げ・字下げによる変更の有無を解析する。
【００４２】
図１４は、本発明の一実施形態に係る差分解析処理フローを示す図である。図１４に係る処理フローが、第４ステップの詳細フローになる。
【００４３】
ステップ１４０１にて、差分抽出結果データ１３０１から１ブロック分のデータ（例えば図１３の１３０６。以下、「差分ブロックデータ」という）を取得する。ここで差分ブロックデータが取得できない場合、すなわちファイルの終端である場合は、ステップ１４０２の「Ｙｅｓ」に進み、処理は終了する。差分ブロックデータが取得できた場合は、ステップ１４０２の「Ｎｏ」に進み、差分ブロックデータに含まれる差分識別子が「変更」（例えば「ｃ」）を示すか判定が行われる（ステップ１４０３）。差分識別子が「変更」以外（例えば、「追加」を示す「ａ」または「削除」を示す「ｄ」）であれば、これ以上の解析は不要であるため、取得した差分ブロックデータをそのまま差分解析結果として出力する（ステップ１４０４）。ステップ１４０４にて差分ブロックデータを出力した後、ステップ１４０１に戻り、次の変更の解析を行うか（ステップ１４０２の「Ｎｏ」ルート）、次の変更が無い場合は処理が終了する（ステップ１４０２の「Ｙｅｓ」ルート）。
【００４４】
ステップ１４０３にて、差分識別子が「変更」を示す場合、差分ブロックデータに含まれる新内容部分から１行取得する（ステップ１４０５）。ここで新内容部分が複数行ある場合は、上から取得し、処理を繰り返す際に次の行を取得する。ステップ１４０５にて、行が取得できない場合、すなわち新内容部分の終端である場合は、ステップ１４０６の「Ｙｅｓ」に進み、ステップ１４０１に戻る。
【００４５】
一方、行が取得でき、新内容部分の終端ではない場合、ステップ１４０６の「Ｎｏ」に進み、差分ブロックデータの旧内容部分から１行取得する（ステップ１４０７）。ここでも、旧内容部分が複数行ある場合は、上から取得し、処理を繰り返す際に次の行を取得する。ステップ１４０７にて、行が取得でき、旧内容部分の終端ではない場合、ステップ１４０８の「Ｎｏ」に進み、一致判別ルールに従って、新旧内容部分の１行がお互いに一致するか否かを比較する（ステップ１４０９）。ステップ１４０９、すなわち一致判別ルールに従った判定処理の詳細については、図１５の説明として後述する。
【００４６】
ステップ１４０９にて、取得した新旧内容部分の各１行が変更について対応する行として一致しないと判定された場合、新旧内容部分の１行を旧内容部分の次の行と比較するため、ステップ１４１０の「Ｎｏ」に進み、ステップ１４０７に戻る。一方、対応する行として一致すると判定された場合、ステップ１４１０の「Ｙｅｓ」に進み、条件追加・削除抽出ルールに従って差分解析結果を出力する（ステップ１４１１）。ステップ１４１１、すなわち条件追加・削除抽出ルールに従った解析処理の詳細については、図１６の説明として後述する。
【００４７】
次にステップ１４１１にて出力した差分解析結果が「変更候補に追加」か否か判定する（ステップ１４１２）。「変更候補に追加」というのは、後述するが、変更の可能性が高いが、変更であることを未だ確定できないものを一時的に変更候補（リスト）に追加し、新内容部分の１行と旧内容部分の次の行との比較をさらに行うことが必要であることを意味する。そのため、ステップ１４１２にて、出力した差分解析結果が「変更候補に追加」であると判定された場合、「Ｙｅｓ」に進み、変更候補リストに変更候補を追加し（ステップ１４１７）、ステップ１４０７に戻る。ここで、変更候補リスト（図示せず）は、コンピュータ１００上のメモリ１０３に展開される一時的なデータ領域であり、例えばリスト構造で、変更候補であると判定された、取得した新内容部分の１行を格納する。
【００４８】
一方、ステップ１４１２にて、出力した差分解析結果が「変更候補に追加」ではないと判定された場合、「Ｎｏ」に進み、字上げ・字下げ抽出ルールに従って、差分解析結果を出力する（ステップ１４１３）。ステップ１４１３、すなわち字上げ・字下げ抽出ルールに従った解析処理の詳細については、図１７の説明として後述する。
【００４９】
次に、旧内容部分１３０２に、差分解析結果として出力していない行が存在するか否かを判定する（ステップ１４１４）。差分解析結果として出力していない行が存在しない場合は、ステップ１４１６に進み、未出力行が存在する場合は、当該未出力行を削除行と判断して差分解析結果を出力する（ステップ１４１５）。続いて、ステップ１４１６にて、変更候補リストを空にして（初期化して）、ステップ１４０５に戻り、新内容部分の次の行の解析を行う。
【００５０】
一方、ステップ１４０７にて、旧内容部分から行が取得できず、旧内容部分の終端である場合、ステップ１４０８の「Ｙｅｓ」に進み、変更候補リストが空か否かの判定を行う（ステップ１４１８）。ステップ１４１８にて、変更候補リストが空でない場合、「Ｎｏ」に進み、変更候補リストの１つ目（例えば、ステップ１４１７にて格納された、新内容部分の１行）を「変更」と判断して差分解析結果を出力し（ステップ１４１９）、ステップ１４１６に進む。ステップ１４１９において、変更候補リストの１つ目を「変更」と判断するのは、最も先に格納されたものが最も変更行である可能性の高いものとみなすためである。また、ステップ１４１９をはじめとする差分解析処理フローのいくつかのステップにおいて出力される差分解析結果は、図１８の説明にて後述するが、例えば、「変更」と判断された新旧内容部分の行および行番号、ならびにどのような変更かを示す差分識別子である。ここで差分識別子とは、例えば、差分抽出結果データ１３０１の識別子のように、変更を意味する「change」の頭文字である「c」、追加を意味する「add」の頭文字の「a」、削除を意味する「delete」の頭文字の「d」、条件文の条件の追加を意味する「condition add」の頭文字の「ca」、および条件文の条件の削除を意味する「condition delete」の頭文字の「cd」などである。ステップ１４１９では「変更」と判断されたたため、「ｃ」を出力する。但し、別の識別子を用いてもよい。結果として、ステップ１４１９にて出力される差分解析結果とは、例えば、図１３に示される差分抽出結果データ１３０１と同形式で出力することができる。別の実施形態では、図６および７に示されるように、新旧内容部分を横並びにし、変更行を対比できるように出力することもできる。
【００５１】
一方、変更候補リストが空の場合、「Ｙｅｓ」に進み、取得した新内容部分の１行を「追加」と判断して差分解析結果を出力し（ステップ１４２０）、ステップ１４０５に戻り、新内容部分の次の行の解析を行う。ステップ１４２０において出力される差分解析結果は、ステップ１４１９にて上述したものと同様である。
【００５２】
以上の処理を、差分抽出結果データ１３０１のファイルの終端まで行い、後述する差分解析結果データ１８０１を得る。以上、差分解析処理の詳細について説明したが、ステップ１４１３に示す字上げ・字下げに係る差分解析など、処理の一部は、必ずしも図１４に示す差分解析処理フローの中で実施する必要は無く、別処理として分離して実行することができることを当業者であれば理解できよう。
【００５３】
次に、ステップ１４０９、すなわち一致判別ルールに従った判定処理の詳細について説明する。図１５は、本発明の一実施形態に係る一致判別ルールに従った判定処理フローを示す図である。ステップ１５０１にて、取得した新旧内容部分の各１行の予約語が一致するか否かを判定する。ステップ１５０１にて、一致しないと判定された場合、「Ｎｏ」に進み、取得した新旧内容部分の各１行は変更について対応する行として不一致であると判定され（ステップ１５１０）、処理は終了する。
【００５４】
一方、ステップ１５０１にて、一致すると判定された場合、一致する予約語が「ＩＦ」であるか否か判定する（ステップ１５０２）。ステップ１５０２にて、一致する予約語が「ＩＦ」であると判定された場合、「Ｙｅｓ」に進み、当該予約語に対応する非予約語の全てが、取得した新旧内容部分において一致するか否かを判定する（ステップ１５０３）。ステップ１５０３にて、一致すると判定された場合、「Ｙｅｓ」に進み、取得した新旧内容部分の各１行は変更について対応する行として一致すると判定され（ステップ１５０４）、処理は終了する。
【００５５】
一方、ステップ１５０３にて、一致しないと判定された場合、「Ｎｏ」に進み、対応する非予約語の一方が他方の部分集合となるか否かを判定する（ステップ１５０５）。ステップ１５０５にて、部分集合となると判定された場合、「Ｙｅｓ」に進み、取得した新旧内容部分の各１行は変更について対応する行として一致すると判定され（ステップ１５０４）、処理は終了する。ここで、部分集合とは例えば、非予約語について、旧内容部分が「QTY = 0  AND  ID ! = 4」であり、新内容部分が「QTY = 0  AND  ID ! = 4  AND  ID ! = 5」である場合に、旧内容部分は新内容部分の部分集合であるといえる。
【００５６】
一方、ステップ１５０５にて、部分集合とはならないと判定された場合、「Ｎｏ」に進み、取得した新旧内容部分の各１行は変更について対応する行として不一致であると判定され（ステップ１５０６）、処理は終了する。
【００５７】
ステップ１５０２にて、一致する予約語が「ＩＦ」ではないと判定された場合、「Ｎｏ」に進み、当該予約語に対応する非予約語が全て一致するか否かを判定する（ステップ１５０７）。ステップ１５０７にて、一致すると判定された場合、「Ｙｅｓ」に進み、取得した新旧内容部分の各１行は変更について対応する行として一致すると判定され（ステップ１５０８）、処理は終了する。
【００５８】
一方、ステップ１５０７にて、一致しないと判定された場合、「Ｎｏ」に進み、対応する予約語に異なるものが２つ以上あるか否かの判定を行う（ステップ１５０９）。ステップ１５０９にて、異なるものが２つ以上あると判定された場合、「Ｙｅｓ」に進み、取得した新旧内容部分の各１行は変更について対応する行として不一致であると判定され（ステップ１５１０）、処理は終了する。一方、ステップ１５０９にて、異なるものが２つ以上ないと判定された場合、「Ｎｏ」に進み、取得した新旧内容部分の各１行は変更について対応する行として一致すると判定され（ステップ１５０８）、処理は終了する。
【００５９】
次に、図１４のステップ１４１１、すなわち条件追加・削除抽出ルールに従った解析処理の詳細について説明する。図１６は、本発明の一実施形態に係る条件追加・削除抽出ルールに従った解析処理フローを示す図である。ステップ１６０１にて、取得した新旧内容部分の各１行の予約語が「ＩＦ」であるか否か判定する。ステップ１６０１にて、一致する予約語が「ＩＦ」であると判定された場合、「Ｙｅｓ」に進み、当該予約語に対応する非予約語の全てが、取得した新旧内容部分において一致するか否かを判定する（ステップ１６０２）。ステップ１６０２にて、一致すると判定された場合、「Ｙｅｓ」に進み、処理は終了する。
【００６０】
一方、ステップ１６０２にて、一致しないと判定された場合、「Ｎｏ」に進み、対応する非予約語の一方が他方の部分集合となるか否かを判定する（ステップ１６０３）。ステップ１６０３にて、部分集合とはならないと判定された場合、「Ｎｏ」に進み、処理は終了する。
【００６１】
一方、ステップ１６０３にて、部分集合となると判定された場合、「Ｙｅｓ」に進み、取得した旧内容部分の１行が、取得した新内容部分の１行の部分集合であるか否かの判定を行う（ステップ１６０４）。ステップ１６０４にて、部分集合であると判定された場合、「Ｙｅｓ」に進み、取得した新内容部分の１行を「条件の追加」と判断して差分解析結果を出力する（ステップ１６０５）。ステップ１６０５において出力される差分解析結果は、例えば、条件文の条件の追加を意味する「condition add」の頭文字の「ca」である。
【００６２】
一方、ステップ１６０４にて、部分集合でないと判定された場合、「Ｎｏ」に進み、差分解析結果として、取得した新内容部分の１行を「条件の削除」と判断して差分解析結果を出力する（ステップ１６０６）。ステップ１６０６において出力される差分解析結果は、例えば、条件文の条件の削除を意味する「condition delete」の頭文字の「cd」である。
【００６３】
ステップ１６０１にて、一致する予約語が「ＩＦ」でないと判定された場合、「Ｎｏ」に進み、対応する非予約語に異なるものが２つ以上あるか否かを判定する（ステップ１６０７）。ステップ１６０７にて、異なるものが２つ以上あると判定された場合、「Ｙｅｓ」に進み、処理は終了する。一方、異なるものが２つ以上ないと判定された場合、「Ｎｏ」に進み、差分解析結果として、「変更候補に追加」と判定する（ステップ１６０９）。
【００６４】
次に、図１４のステップ１４１３、すなわち字上げ・字下げ抽出ルールに従った解析処理の詳細について説明する。図１７は、本発明の一実施形態に係る字上げ・字下げ抽出ルールに従った解析処理フローを示す図である。ステップ１７０１にて、取得した旧内容部分の１行のネスト数が、取得した新内容部分の１行のネスト数より大きいか否かを判定する。ステップ１７０１にて、旧内容部分の１行のネスト数の方が大きいと判定された場合、「Ｙｅｓ」に進み、取得した新内容部分の１行を「字上げ」と判断して差分解析結果を出力する（ステップ１７０２）。ステップ１７０２において出力される差分解析結果は、図１８の説明にて後述するが、例えば、「字上げ」と判断された新旧内容部分の行および行番号、ならびに何文字分の字上げかを示す字上げ・字下げ識別子である。ここで、字上げ・字下げ識別子とは、例えば、２文字の字上げであれば「+2」、または１文字の字下げであれば「-1」などを出力する。但し、別の識別子を用いてもよい。
【００６５】
一方、ステップ１７０１にて、旧内容部分の１行のネスト数の方が大きくない（等しい場合も含む）と判定された場合、「Ｎｏ」に進み、取得した旧内容部分の１行のネスト数が、取得した新内容部分の１行のネスト数より小さいか否かを判定する（ステップ１７０３）。ステップ１７０３にて、旧内容部分の１行のネスト数の方が小さいと判定された場合、「Ｙｅｓ」に進み、取得した新内容部分の１行を「字下げ」と判断して差分解析結果を出力する（ステップ１７０４）。ステップ１７０４において出力される差分解析結果は、ステップ１７０２にて上述したものと同様である。一方、ステップ１７０３にて、旧内容部分の１行のネスト数の方が小さくない、すなわち新旧内容部分の各１行のネスト数は等しいと判定された場合、ネスト数の変更は発生していないため、何も出力せず、処理は終了する。
【００６６】
以上の処理により、次に示す差分解析結果データ１８０１を得る。図１８は、本発明の一実施形態に係る差分解析結果を示す図である。図１８において、差分抽出結果データ１８０１の１行目（１８０２）の「2,5d」は、「旧ソースコードの２〜５行目を削除した。」ことを示す。「d」は、削除を意味する「delete」の頭文字である識別子であるが、差分解析結果データ１８０１において出力される識別子は、図１４のステップ１４１９にて上述した差分識別子、およびステップ１７０２にて上述した字上げ・字下げである。図１８における差分解析結果データ１８０１は、図１３における差分抽出結果データ１３０１と同様の形式であり、より詳細な変更情報を示すことができる改良データである。そのため、「<」および「>」識別子、１８０７の「---」は、図１３にて上述したものと同様であり、１８０３および１８０６は旧内容部分を、ならびに１８０８は新内容部分を、それぞれ示す。
【００６７】
また、より詳細な変更情報とは、条件文の条件の追加である場合、例えば、「1ca1」（「旧ソースコードの１行目の条件文の条件を追加した。」ことを示す）と、条件文の条件の追加に係る新旧内容部分を出力する。また「旧ソースコードの１行目の条件文の条件を削除し、新ソースコードの４行目として出力した。」場合、「1cd4」と、条件文の条件の追加に係る新旧内容部分を出力する。なお、この場合、新ソースコードに、１〜３行目が追加されたこともわかる。もっとも、この場合、追加された１〜３行目が「0a1,3」として出力されるであろう。
【００６８】
また、さらなる、より詳細な変更情報とは、例えば、１８０５〜１８０８として示される字上げ・字下げの変更情報である。１８０５の「6 -2 2」は、「旧ソースコードの６行目が、２文字分、字下げされ、新ソースコードの２行目として出力した。」ことを示す。新ソースコードの２行目として出力されるのは、１８０２〜１８０３に示されるように、旧ソースコードの２〜５行目が削除されたためである。さらに変更がある場合は、差分解析結果データ１８０１に行を追加して示されることは当業者であれば理解されたい。また、差分解析結果データ１８０１を、図６に示すように新旧ソースコードの行を対応付けて生成することもできる。
【００６９】
続いて、一実施形態に係るソースコードの差分抽出および解析処理のうち、第５ステップ（図２のステップ２０５）となる設計書の生成について説明する。
【００７０】
図１９は、本発明の一実施形態に係る設計書生成処理フローを示す図であり、図２０は、本発明の一実施形態に係る予約語−日本語変換テーブルを示す図であり、図２１は、本発明の一実施形態に係る設計書生成結果を示す図である。図１９に係る処理フローが、第５ステップの詳細フローになる。本フローは、旧ネスト・構文要素ＴＳＶデータ１１０１をベースに、差分解析結果データ１８０１と、予約語−日本語変換テーブル２００１とに基づき、図２１に示すように設計書を生成する。なお、図２１の本文出力部２１０１は、変換した結果の設計書本文、変更区分出力部２１０２には変更内容の詳細を出力する。
【００７１】
ステップ１９０１にて、旧ネスト・構文要素ＴＳＶデータ１１０１から１行取得する。ここで行が取得できる場合、すなわちファイルの終端でない場合は、ステップ１９０２の「Ｎｏ」に進み、取得した旧ネスト・構文要素ＴＳＶデータ１１０１の１行を予約語−日本語変換テーブル２００１に基づき、変換し、設計書データとして出力する（ステップ１９０３）。
【００７２】
ここで、予約語−日本語変換テーブル２００１は、「予約語」と、「非予約語のリスト」と、「設計書への出力内容」とからなる。ここで、「設計書への出力内容」は、実際に設計書本文として、本文出力部２１０１に出力する内容であり、「%」で囲まれた文言は非予約語を示し、取得した旧ネスト・構文要素ＴＳＶデータ１１０１の１行に含まれる非予約語に応じて置換される。例えば、予約語「ＲＥＡＤ」について、差分解析結果データでは「READ Q-FILE.」となっており、「Q-FILE」が非予約語のFILE（ファイル名）を示す。この場合、「設計書への出力内容」に示される「%FILE%を読み込む」の「%FILE%」部分が「Q-FILE」に置換され、図２１に示すように、「Q-FILEを読み込む」と出力される。
【００７３】
また、別の予約語を説明すると、例えば、予約語「ＩＦ」の場合、非予約語（すなわち条件）の数により、「%EXPR1%」、「%EXPR2%」、「%EXPR3%」・・・と置換する非予約語の数が異なり、各非予約語を結ぶ条件（ＡＮＤ、ＯＲ）により、「設計書への出力内容」に示す“かつ”または“または”の文字列が選択され、出力される。
【００７４】
ステップ１９０３の後、ステップ１９０１に戻り、旧ネスト・構文要素ＴＳＶデータ１１０１から行が取得できなくなるまで、ステップ１９０１〜１９０３を繰り返す。これは、旧ネスト・構文要素ＴＳＶデータ１１０１に基づき、予め旧内容部分を設計書データとして出力する考えである。別の実施形態では、予め旧内容部分を出力せずに、設計書データを生成することもできる。
【００７５】
旧ネスト・構文要素ＴＳＶデータ１１０１から行が取得できない場合、すなわちファイルの終端である場合は、ステップ１９０２の「Ｙｅｓ」に進み、差分解析結果データ１８０１から、差分識別子を含む行（例えば１８０２）から区切り行まで取得する。ここで、区切り行とは、例えば、空行１８０４であり、これら取得した複数行を「一差分データ」という。一差分データは、例えば、差分解析結果データ１８０１における１８０２〜１８０４である。また、別の一差分データは、１８０５〜１８０８である。図１８の例では、２つの一差分データが含まれる。
【００７６】
ステップ１９０４にて行が取得できない場合、すなわちファイルの終端である場合は、ステップ１９０５の「Ｙｅｓ」に進み、処理は終了する。行が取得できた場合は、ステップ１９０５の「Ｎｏ」に進み、一差分データに含まれる差分識別子（例えば、１８０２および１８０５）が「追加」を示すか判定する（ステップ１９０６）。差分識別子が「追加」を示すと判定される場合（例えば「0a1,6」）、「Ｙｅｓ」に進み、取得した差分解析結果の新内容部分を予約語−日本語変換テーブルに基づいて変換し出力し（ステップ１９０７）、ステップ１９０４に戻る。この際、図２１に示すように、変更区分出力部２１０２に、例えば「追加」という文字列を出力する。また、より強調するために、図２１に示すように、項番を網掛けする、項番のフォント色を変更するなどによりハイライト表示することもできる。
【００７７】
ステップ１９０６にて、差分識別子が「追加」を示さないと判定される場合、「Ｎｏ」に進み、差分識別子が「変更」を示すか判定する（ステップ１９０８）。差分識別子が「変更」を示すと判定される場合（例えば「8c8」）、「Ｙｅｓ」に進み、取得した差分解析結果の新内容部分を予約語−日本語変換テーブルに基づいて変換し出力し（ステップ１９０７）、さらに設計書に出力した該当行（旧内容部分において変更する行）を削除用の表記に変換し（ステップ１９１１）、ステップ１９０４に戻る。この際、図２１に示すように、本文出力部２１０１には、旧内容を取り消し線により修飾して出力し、そのすぐ下に、新内容を出力する。また、変更区分出力部２１０２には、例えば「変更」という文字列を出力する。さらに、より強調するために、図２１に示すように、旧内容部分と新内容部分を異なる色で網掛けする、フォント色を変更するなどによりハイライト表示することもできる。
【００７８】
ステップ１９０８にて、差分識別子が「変更」を示さないと判定される場合、「Ｎｏ」に進み、差分識別子が「削除」を示すか判定する（ステップ１９１０）。差分識別子が「削除」を示すと判定される場合（例えば「1,10d1」）、「Ｙｅｓ」に進み、設計書に出力した該当行（旧内容部分において削除する行）を削除用の表記に変換し（ステップ１９１１）、ステップ１９０４に戻る。この際、図２１に示すように、本文出力部２１０１には、取り消し線により修飾されて出力される。ここで取り消し線以外の修飾（例えば、薄い文字）により、出力することができることも当業者であれば理解されたい。また、変更区分出力部２１０２には、例えば「削除」という文字列を出力する。また、より強調するために、図２１に示すように、網掛けするなどによりハイライト表示することもできる。
【００７９】
ステップ１９１０にて、差分識別子が「削除」を示さないと判定される場合、「Ｎｏ」に進み、差分識別子が「条件の追加」を示すか判定する（ステップ１９１２）。差分識別子が「条件の追加」を示すと判定される場合（例えば「12ca12」）、「Ｙｅｓ」に進み、取得した差分解析結果の新内容部分を予約語−日本語変換テーブルに基づいて、設計書に出力した該当部分（旧内容部分の条件文において条件を追加する部分）に追加し（ステップ１９１３）、ステップ１９０４に戻る。この際、図２１に示すように、本文出力部２１０１には、追加する部分を、網掛けする、フォント色を変更するなどして出力する。また、変更区分出力部２１０２には、例えば「条件の追加」という文字列を出力する。
【００８０】
ステップ１９１２にて、差分識別子が「条件の追加」を示さないと判定される場合、「Ｎｏ」に進み、差分識別子が「条件の削除」を示すか判定する（ステップ１９１４）。差分識別子が「条件の削除」を示すと判定される場合（例えば「14cd14」）、「Ｙｅｓ」に進み、設計書に出力した該当部分（旧内容部分の条件文において条件を削除する部分）を削除用の表記に変換し（ステップ１９１５）、ステップ１９０４に戻る。この際、図示していないが、本文出力部２１０１には、削除する部分を取り消し線により修飾するなどして出力し、また変更区分出力部２１０２には、例えば「条件の削除」という文字列を出力する。
【００８１】
ステップ１９１４にて、差分識別子が「条件の削除」を示さないと判定される場合、「Ｎｏ」に進み、差分識別子が「字上げ」または「字下げ」を示すか判定する（ステップ１９１６）。差分識別子が「字上げ」または「字下げ」を示すと判定される場合（例えば「16 +1 16」、または「16 -2 16」）、「Ｙｅｓ」に進み、設計書に出力した該当行（旧内容部分において字上げ、または字下げする行）を、差分識別子で示される文字数分、字上げ、または字下げし（ステップ１９１７）、ステップ１９０４に戻る。この際、図２１に示すように、変更区分出力部２１０２に、例えば「２文字字下げ」という文字列を出力する。また、より強調するために、図２１に示すように、項番を網掛けする、項番のフォント色を変更するなどによりハイライト表示することもできる。なお、図２１に示される「１１．」などの項番は、出力した設計書の可読性を向上させるため、ネスト数に応じて、連番を付与したものであるため、必ずしも出力する必要はない、または別の表記で出力することができることを理解されたい。
【００８２】
ステップ１９１６にて、差分識別子が「字上げ」または「字下げ」を示さないと判定される場合、「Ｎｏ」に進み、ステップ１９０４に戻る。もっともこの場合、差分識別子が想定された差分識別子を示さないことになるため、本ルートは、例外ルートであるといえる。そのため、本ルートに例外処理を入れることもできる。
【００８３】
なお、ステップ１９０６〜１９１６において、差分識別子の判定処理について上述したが、この際の判定する順番は一実施例であり、判定の順番を任意に変更して処理することができることは当業者であれば理解されたい。
【符号の説明】
【００８４】
１００    コンピュータ
１０１    処理装置
１０２    システムバス
１０３    メモリ
１０４    入力装置
１０５    出力装置
１０６    通信制御装置
１０７    記憶装置
１１０    差分抽出システム
１１１    構文解析手段
１１２    ネスト情報解析手段
１１３    差分抽出手段
１１４    差分解析手段
１１５    設計書生成手段
１２１    ソースコードデータ記憶部
１２２    抽象構文木データ記憶部
１２３    ネスト・構文要素ＴＳＶデータ記憶部
１２４    差分抽出データ記憶部
１２５    差分解析データ記憶部
１２６    設計書データ記憶部
１２７    構文解析データ記憶部
１２８    構文変換データ記憶部
９０１    旧ソースコードの抽象構文木データ
１００１  新ソースコードの抽象構文木データ
１１０１  旧ソースコードのネスト・構文要素ＴＳＶ
１２０１  新ソースコードのネスト・構文要素ＴＳＶ
１３０１  差分抽出結果データ
１８０１  差分解析結果データ
２００１  予約語−日本語変換テーブル
２１０１  本文出力部
２１０２  変更区分出力部
【図１】
0006022815.tif 000002
【図２】
0006022815.tif 000003
【図３】
0006022815.tif 000004
【図４】
0006022815.tif 000005
【図５】
0006022815.tif 000006
【図６】
0006022815.tif 000007
【図７】
0006022815.tif 000008
【図８】
0006022815.tif 000009
【図９】
0006022815.tif 000010
【図１０】
0006022815.tif 000011
【図１１】
0006022815.tif 000012
【図１２】
0006022815.tif 000013
【図１３】
0006022815.tif 000014
【図１４】
0006022815.tif 000015
【図１５】
0006022815.tif 000016
【図１６】
0006022815.tif 000017
【図１７】
0006022815.tif 000018
【図１８】
0006022815.tif 000019
【図１９】
0006022815.tif 000020
【図２０】
0006022815.tif 000021
【図２１】
0006022815.tif 000022