(57)【要約】【課題】言語要素に関連する箇所を容易に絞り込むことができる。【解決手段】構文解析手段１は、プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する。シンボル定義抽出手段２は、プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出してこの言語要素に一致するシンボル名に対応するシンボル定義を抽出し、シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する。【選択図】図１
2007249264.tif 000002
【特許請求の範囲】
【請求項１】
入力されるプログラムを解析するプログラム解析プログラムにおいて、
コンピュータに、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する構文解析部、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する言語要素抽出部、
として機能させることを特徴とするプログラム解析プログラム。
【請求項２】
前記言語要素抽出部は、前記プログラムを解析することにより得られる構文木の、テンプレート定義内で参照されている関数を表している全てのノードに対し、前記シンボル情報を用いてその引数の数およびデータ型を推測することにより前記実際に参照される可能性のある言語要素を特定することを特徴とする請求項１記載のプログラム解析プログラム。
【請求項３】
前記言語要素抽出部は、さらに、前記プログラムに記載された特殊化が行われている言語要素を抽出し、前記特殊化が行われている言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記特殊化が行われている言語要素の元となった言語要素を抽出し、前記特殊化が行われている言語要素に含まれる言語要素と前記元となった言語要素に含まれる言語要素の対応をとることにより、前記元となった言語要素に含まれる言語要素について実際に参照されている言語要素を特定することを特徴とする請求項１記載のプログラム解析プログラム。
【請求項４】
入力されるプログラムを解析するプログラム解析方法において、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成し、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、
前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する、
ことを特徴とするプログラム解析方法。
【請求項５】
入力されるプログラムを解析するプログラム解析装置において、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する構文解析部と、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する言語要素抽出部と、
を有することを特徴とするプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム解析プログラム、プログラム解析方法およびプログラム解析装置に関し、特に、入力されるプログラムを解析してソースコードの理解、解析を助けるプログラム解析プログラム、プログラム解析方法およびプログラム解析装置に関する。
【背景技術】
【０００２】
プログラムの修正、保守作業において、プログラムの意味を解析することにより、ソースコード中の言語要素（変数や関数、クラス等）について調べ、注目すべき箇所を絞り込むことが行われている。間違いのない修正、保守を行うために、関連する箇所を漏れなく効率的に調査するためのプログラム解析方法が求められている。
【０００３】
ここで、プログラムの解析方法の１つとして、対象となるソースコードを文法に沿って解釈することにより、対象となるソースコードの持つ意味を表す木の形をした構文木というデータ構造を作成する構文解析が知られている。この構文木には変数や関数、クラス等の各言語要素の出現場所や使用の用途が情報として含まれている。この情報を用いることにより、どのような言語要素がどこに出現しているかを調査することができ、対象ソースコード中で注目すべき箇所を発見することができる（例えば、特許文献１、２参照）。
【特許文献１】特開平１１−２２９２８９号公報
【特許文献２】特開２０００−１３２３８７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、Ｃ＋＋、Ｃ＃、Ｊａｖａ（登録商標）等の総称性（generics）を持つプログラミング言語の総称性を表現するテンプレートの定義においては、通常の関数やクラスなどの定義とは違い、従来の構文解析では定義内で参照される言語要素（変数や関数、クラスなど）を特定することができないという問題がある。例えば、総称性を持たないプログラミング言語においては、関数ｆは一義的であるが、総称性を持つプログラミング言語においては、ｆという関数として使われるように思われるものであったとしても、関数として使われる可能性や、クラスとして使われる可能性がある等、多様性が存在する。
【０００５】
このため、従来の手法ではテンプレートに関する言語要素について注目すべき箇所を絞り込むことができないので、漏れのない調査を行うためには、実際には関連の無い箇所も注目しなければならない。その結果、プログラムの理解のための作業量が大きくなっているという問題があった。
【０００６】
本発明はこのような点に鑑みてなされたものであり、言語要素に関連する箇所を容易に絞り込むことができるプログラム解析プログラム、プログラム解析方法およびプログラム解析装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明では上記問題を解決するために、図１に示すような処理をコンピュータに実行させるためのプログラム解析プログラムが提供される。
プログラム解析プログラムを実行するコンピュータは以下の機能を有する。
【０００８】
構文解析手段１は、プログラムの構文解析を行って構文情報とプログラムを表現する構文木とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する。
シンボル定義抽出手段２は、構文木を用いてプログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出してこの言語要素に一致するシンボル名に対応するシンボル定義を抽出し、シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する。
【０００９】
このようなプログラム解析プログラムによれば、構文解析手段１により、プログラムの構文解析が行われて構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とが作成される。そして、シンボル定義抽出手段２により、プログラムに記載されたテンプレートの定義内で参照されている言語要素が抽出されてこの言語要素に一致するシンボル名に対応するシンボル定義が抽出され、シンボル定義で定義または宣言されている言語要素が、推測された言語要素として設定される。
【００１０】
また、上記課題を解決するために、入力されるプログラムを解析するプログラム解析方法において、前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成し、前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する、ことを特徴とするプログラム解析方法が提供される。
【００１１】
このようなプログラム解析方法によれば、プログラムの構文解析が行われて構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とが作成され、プログラムに記載されたテンプレートの定義内で参照されている言語要素が抽出されて言語要素に一致するシンボル名に対応するシンボル定義が抽出され、シンボル定義で定義または宣言されている言語要素が、推測された言語要素として設定される。
【００１２】
また、上記課題を解決するために、入力されるプログラムを解析するプログラム解析装置において、前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する構文解析部と、前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する言語要素抽出部と、を有することを特徴とするプログラム解析装置が提供される。
【００１３】
このようなプログラム解析装置によれば、上記プログラム解析プログラムを実行するコンピュータと同様の処理が実行される。
【発明の効果】
【００１４】
本発明によれば、プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出し、この言語要素に一致するシンボル名に対応するシンボル定義を抽出し、シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定することにより注目すべき箇所を確実に絞り込むことができる。これにより、プログラムを理解するために必要な作業量の低減を図ることができる。
【００１５】
特に、特殊化が行われている言語要素を抽出し、特殊化が行われている言語要素に一致するシンボル名に対応するシンボル定義を抽出し、特殊化が行われている言語要素の元となった言語要素を抽出し、特殊化が行われている言語要素に含まれる言語要素と元となった言語要素に含まれる言語要素の対応をとることにより、元となった言語要素に含まれる言語要素について実際に参照されている言語要素を特定した場合には、注目すべき箇所をより確実に絞り込むことができる。これにより、さらに、プログラムを理解するために必要な作業量の低減を図ることができる。
【発明を実施するための最良の形態】
【００１６】
以下、本発明の実施の形態を、図面を参照して詳細に説明する。
まず、実施の形態に適用される発明の概要について説明し、その後、実施の形態の具体的な内容を説明する。
【００１７】
図１は、実施の形態に適用される発明を示す原理図である。
図１に示すプログラム解析装置は、主として総称性を有するプログラム言語で書かれているソフトウェアの開発における修正、保守等の作業に用いられる装置であり、構文解析手段１とシンボル定義抽出手段２とを備えている。
【００１８】
構文解析手段１は、プログラムの構文解析を行って構文情報とプログラムを表現する構文木と言語要素（変数、関数、クラス等）の名前を表すシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する。
【００１９】
シンボル定義抽出手段２は、構文木を用いてプログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して言語要素に一致するシンボル名に対応するシンボル定義を抽出し、シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する。
【００２０】
このようなプログラム解析プログラムによれば、構文解析手段１により、構文解析が行われて構文情報とプログラムを表現する構文木とシンボル名に対応するシンボル定義を備えるシンボル情報とが作成される。そして、シンボル定義抽出手段２により、プログラムに記載されたテンプレートの定義内で参照されている言語要素が抽出されて言語要素に一致するシンボル名に対応するシンボル定義が抽出され、シンボル定義で定義または宣言されている言語要素が、推測された言語要素として設定される。
【００２１】
以下、本発明の実施の形態を具体的に説明する。
図２は、実施の形態のプログラム管理装置のハードウェア構成例を示す図である。
プログラム管理装置１００は、ＣＰＵ(Central Processing Unit)１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０７を介してＲＡＭ(Random Access Memory)１０２、ハードディスクドライブ（ＨＤＤ:Hard Disk Drive）１０３、グラフィック処理装置１０４、入力インタフェース１０５、および通信インタフェース１０６が接続されている。
【００２２】
ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳ(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。ＨＤＤ１０３には、ＯＳやアプリケーションプログラムが格納される。また、ＨＤＤ１０３内には、プログラムファイルが格納される。
【００２３】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号を、バス１０７を介してＣＰＵ１０１に送信する。
【００２４】
通信インタフェース１０６は、ネットワーク１０に接続されている。通信インタフェース１０６は、ネットワーク１０を介して、他のコンピュータとの間でデータの送受信を行うことができる。
【００２５】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。このようなハードウェア構成のシステムにおいてプログラム管理を行うために、プログラム管理装置１００内には、以下のような機能が設けられる。
【００２６】
図３は、プログラム管理装置の機能を示すブロック図である。
プログラム管理装置１００は、プログラム格納部１１０と、構文解析部１２０と、記憶部１３０と、構文情報ＤＢ（データベース）１４０と、言語要素抽出部１５０と、検索・出力部１６０とを備えている。
【００２７】
プログラム格納部１１０には、プログラム解析を行うプログラム（以下「解析対象プログラム」という）が格納されている。本実施の形態では、解析対象プログラムとしてプログラミング言語Ｃ＋＋で作成されたプログラムが格納されている。
【００２８】
構文解析部１２０は、プログラム格納部１１０から入力される解析対象プログラムの構文を解析して（構文解析して）構文情報を作成し、構文情報ＤＢ１４０に格納する。
また、構文解析部１２０は、この構文解析により大域宣言・定義を表す構文木を要素とするリストＬを作成し、記憶部１３０に出力する。この処理については、従来公知の方法で行うことができるため、詳細な説明を省略する。
【００２９】
また、構文解析部１２０は、言語要素の名前（シンボル名）毎に、その言語要素についての情報（シンボル定義）が関連付けられたシンボル情報を作成し、記憶部１３０に格納する。
【００３０】
次に、構文情報、リストＬおよびシンボル情報について詳しく説明する。
図４は、解析対象プログラムの一例を示す図であり、図５は、図４に示す解析対象プログラムの構文情報の例を示す図である。
【００３１】
まず、構文情報について説明する。
構文情報ＤＢ１４０では構文情報がテーブル化されて格納されている。
構文情報テーブル１４１には、ＩＤ、名前、種類、出現箇所（行，列）、推測された言語要素、特殊化時の言語要素の欄が設けられており、各欄の横方向に並べられた情報同士が互いに関連づけられている。
【００３２】
ＩＤの欄には、解析対象プログラムの各言語要素（変数や関数、クラスなど）に対するＩＤナンバーが格納される。
名前の欄にはＩＤ毎の言語要素名が格納される。
【００３３】
種類の欄には、構文解析の結果明らかになった言語要素には、「変数」、「関数」、「テンプレート関数」等が設定され、構文解析の結果特定できない言語要素には「不明」が設定される。
【００３４】
出現箇所（行，列）の欄には、その名前が出現する箇所の解析対象プログラムでの行番号および列番号が格納される。
推測された言語要素の欄には、推測された言語要素のＩＤが格納される。
【００３５】
特殊化時の言語設定の欄には、特殊化時の言語要素のＩＤが格納される。なお、推測された言語要素および特殊化時の言語要素については後に詳述する。
図５では、例えばプログラム２０の１行目で宣言されている言語要素ｘについて、ＩＤナンバー「１」、名前「ｘ」、種類「変数」、出現箇所「（１，５）」、推測された言語要素と特殊化時の言語要素については情報無しが格納されている。また、プログラム２０の７行目で参照されている言語要素ｆについて、ＩＤナンバー「５」、名前「ｆ」、種類「不明」、出現箇所「（７，１０）」、推測された言語要素「ＩＤナンバー２の言語要素」、「ＩＤナンバー３の言語要素」、特殊化時の言語要素「ＩＤナンバー２の言語要素」という情報が格納されている。
【００３６】
次に、シンボル情報について説明する。
図６は、図４に示す解析対象プログラムのシンボル情報を示す図である。
図６では、プログラム２０のシンボル名である関数ｆにプログラム２０中のシンボル定義ｉｎｔ  ｆ（ｉｎｔ）、ｄｏｕｂｌｅ  ｆ（ｄｏｕｂｌｅ）が関連付けられていることを示している。
【００３７】
次に、リストＬについて説明する。
図７は、図４に示す解析対象プログラムの構文木を示す図である。
図７では、各ノードに番号を付している。以下では、例えばｉｎｔ  ｘ；をノード１という。プログラム２０では、ノード１〜５がリストＬとなる。
【００３８】
再び図３に戻って説明する。
言語要素抽出部１５０は、検索・出力部１６０から後述する検索要求を受信すると、言語要素抽出処理を実行する。具体的には、記憶部１３０からリストＬの構文木を取り出し、取り出した構文木が表す大域宣言・定義がテンプレート定義である場合、テンプレート定義内で参照されている言語要素の推測を行う推測処理を行い、処理の結果得られた言語要素を、構文情報テーブル１４１の推測された言語要素の欄に上書きする。また、言語要素抽出部１５０は、リストＬを取り出し、取り出した構文木が表す大域宣言・定義の中でなんらかの特殊化が行われている場合、テンプレート定義と特殊化時情報との関連付けを行う関連づけ処理を行い、処理の結果得られた言語要素を、構文情報テーブル１４１の特殊化時の言語設定の欄に上書きする。
【００３９】
このように、言語要素抽出部１５０は、テンプレートについて関連する箇所の絞り込みを行い、その結果を構文情報テーブル１４１に上書きして構文情報ＤＢ１４０に格納する。これにより、種類が不明な言語要素についてその言語要素がどこで呼び出されているのかを判断することができる。
【００４０】
検索・出力部１６０は、ＧＵＩ（Graphical User Interface）を備えている。
検索・出力部１６０は、キーボード１２やマウス１３等によるユーザの操作に従い、構文解析部１２０に構文解析指示を送信したり、言語要素抽出部１５０に検索要求を送信したりする。また、検索・出力部１６０は、プログラム格納部１１０および構文情報ＤＢ１４０から必要な情報を取り出し、検索結果をモニタ１１に出力させる。
【００４１】
次に、プログラム管理装置１００の動作について説明する。
図８はプログラム管理装置の動作を示すフローチャートである。
まず、検索・出力部１６０が、ユーザの操作に従い解析対象プログラムの構文解析指示を構文解析部１２０に出力する（ステップＳ５１）。
【００４２】
次に、構文解析部１２０が、プログラム格納部１１０から解析対象プログラムを取得し、構文解析を行う（ステップＳ５２）。そして、推測された言語要素および特殊化時の言語要素の欄が未記入の構文情報テーブル１４１を構文情報ＤＢ１４０に格納する（ステップＳ５３）。また、構文解析部１２０が、構文解析の結果得られたリストＬおよびシンボル情報を、記憶部１３０に格納する（ステップＳ５４）。
【００４３】
次に、検索・出力部１６０が、解析対象プログラムのソースコードをモニタ１１に表示させる（ステップＳ５５）。そして、言語要素抽出部１５０が、言語要素抽出処理を実行し、処理結果を構文情報テーブル１４１に上書きする（ステップＳ５６）。次に、ユーザによって解析対象プログラムの検索対象とする言語要素を選択する要求があると、検索・出力部１６０が、言語要素抽出部１５０に検索要求を送信する（ステップＳ５７）。
【００４４】
次に、検索・出力部１６０が構文情報テーブル１４１を参照し、検索要求に対する検索結果をモニタ１１に表示させる（ステップＳ５８）。以上で、プログラム管理装置１００の動作を終了する。
【００４５】
次に、ステップＳ５７の言語要素抽出処理について詳しく説明する。
図９は、言語要素抽出処理を表すフローチャートである。
まず、作成されたリストＬから言語要素を示すノードＮを１つ取り出す（ステップＳ１１）。
【００４６】
次に、取り出したノードＮに属する構文木が表す大域宣言・定義がテンプレート定義であるか否かを判断する（ステップＳ１２）。大域宣言・定義がテンプレート定義である場合（ステップＳ１２のＹｅｓ）、推測処理を行って、ノードＮに属する構文木を再帰的にスキャンすることにより、ノードＮに属する構文木中の全ての関数を表しているノードに対し、その引数の数やデータ型を推測する（ステップＳ１３）。その後、ステップＳ１６に移行する。一方、大域宣言・定義がテンプレート定義ではない場合（ステップＳ１２のＮｏ）、大域宣言・定義の中でなんらかの特殊化が行われているか否かを判断する（ステップＳ１４）。なんらかの特殊化が行われている場合（ステップＳ１４のＹｅｓ）、関連づけ処理を行って、ノードＮに属する構文木を再帰的にスキャンすることにより、構文木中の全ての特殊化して作られた関数やクラスを表しているノードに対し、テンプレート定義と特殊化時情報との関連付けを行う（ステップＳ１５）。
【００４７】
特殊化が行われていない場合（ステップＳ１４のＮｏ）、ステップＳ１６に移行する。
次に、リストＬの全ての要素について解析を行ったか否かを判断する（ステップＳ１６）。リストＬの全ての要素について解析を行っていない場合（ステップＳ１６のＮｏ）、ステップＳ１１に移行して動作を継続する。リストＬの全ての要素について解析を行った場合（ステップＳ１６のＹｅｓ）、絞り込み処理を終了する。
【００４８】
次に、ステップＳ１３の推測処理について説明する。
図１０は、推測処理を示すフローチャートである。
まず、現在注目しているノードＮが、関数を表すノードであるか否かを判定する（ステップＳ２１）。ノードＮが関数を表すノードではない場合（ステップＳ２１のＮｏ）、ノードＮに対する処理は終了する。
【００４９】
ノードＮが関数を表すノードであった場合（ステップＳ２１のＹｅｓ）、その関数名を取得する。そして、シンボル情報から、関数名と同じ名前を持つ関数を表すノードＮｉ（Ｎｉ＝Ｎ１、Ｎ２、・・・、Ｎｍ）を要素とするリストＬ２を作成する（ステップＳ２２）。
【００５０】
次に、リストＬ２内の全てのノードについてノードＮとの比較を行ったか否かを判断する（ステップＳ２３）。全てのノードについてノードＮとの比較を行っていない場合（ステップＳ２３のＮｏ）、リストＬ２から比較を行っていないノードＮｉを取り出す（ステップＳ２４）。そして、ノードＮとノードＮｉとが一致するか否か、すなわち両者の引数の数が同じであり、かつ、各引数のデータ型が同じかまたは一方が他方を特殊化できるか否かを比較する（ステップＳ２５）。ノードＮとノードＮｉとが一致する場合（例えば、リストから取り出した言語要素Ｎｉがｉｎｔ型の引数を１つ取る関数であり、ノードＮがテンプレート引数ＴＡＲＧ型の引数を一つ取る関数である場合等）（ステップＳ２５のＹｅｓ）、構文情報テーブル１４１の中のノードＮが表す関数が登録されているＩＤの、推測された言語要素の欄に対しノードＮが表す関数が、ノードＮｉが表す関数として使われているという情報を記載する（ステップＳ２６）。ノードＮとノードＮｉとが一致しない場合（ステップＳ２５のＮｏ）、ステップＳ２３に移行して処理を継続する。
【００５１】
一方、ステップＳ２３で全てのノードＮｉについてノードＮとの比較を行った場合（ステップＳ２３のＹｅｓ）、処理を終了する。
次に、ステップＳ１５の関連付け処理について説明する。
【００５２】
図１１は、関連付け処理を示すフローチャートである。
まず、現在注目しているノードＮが、特殊化された言語要素を表すノードか否か、すなわちテンプレートを特殊化して作られた関数やクラスであるか否か（例えば、テンプレート関数ｆ＜Ｔ＞をｉｎｔで特殊化して作られた関数ｆ＜ｉｎｔ＞やクラス等か否か）を判定する（ステップＳ３１）。ノードＮが特殊化された言語要素を表すノードでなければ（ステップＳ３１のＮｏ）、ノードＮに対する処理を終了する。
【００５３】
ノードＮが特殊化された言語要素を表すノードである場合は（ステップＳ３１のＹｅｓ）、特殊化された言語要素を表現する構文木ＴＩを取得する（ステップＳ３２）。次に、ノードの元となったテンプレート定義を、シンボル情報を用いて発見し、そのテンプレート定義を表現する構文木ＴＤを取得する（ステップＳ３３）。
【００５４】
次に、構文木ＴＩの構造と、構文木ＴＤの構造とを比較することにより、ノードＮＤが言語要素を表すノードか否かを判断する。具体的には構文木ＴＤに含まれるノードＮＤＫ（ＮＤＫ＝ＮＤ１、ＮＤ２、・・・、ＮＤＮ）のうちのＭ番目のノードＮＤＭと、構文木ＴＩ中の、ノードＮＤＭに対応するノードＮＩＫ（ＮＩＫ＝ＮＩ１、ＮＩ２、・・・、ＮＩＮ）のＭ番目のノードＮＩＭとをそれぞれ比較する。例えば、ノードＮＤ２とノードＮＩ２とをそれぞれ比較する。そして、ノードＮＤＭとノードＮＩＭとを比較してノードＮＤＭが言語要素を表すノードであるか否かを判断する（ステップＳ３４）。ノードＮＤＭが言語要素を表すノードではない場合（ステップＳ３４のＮｏ）、ステップＳ３６に移行する。
【００５５】
ノードＮＤＭが言語要素を表すノードである場合（ステップＳ３４のＹｅｓ）、ノードＮＤＭが表す関数が登録されているＩＤの、構文情報テーブル１４１の言語要素の欄に対し、特殊化時にはノードＮＩＭが表している関数やクラスとして使われているという情報を記載する（ステップＳ３５）。
【００５６】
次に、全てのノードＮＤＫについて比較を行ったか否かを判断する（ステップＳ３６）。全てのノードＮＤＫについて比較を行っていない場合（ステップＳ３６のＮｏ）、新たなノードＮＤＫ（例えば、ノードＮＤＫのうちの（Ｍ＋１）番目のノードＮＤＭ＋１とノードＮＩＫの（Ｍ＋１）番目のノードＮＩＭ＋１）を選択し（ステップＳ３７）、ステップＳ３４に移行して新たなノードＮＩＫ、ノードＮＤＫについて同様の処理を行う。一方、全てのノードＮＤＫについて比較を行った場合（ステップＳ３７のＹｅｓ）、関連づけ処理を終了する。
【００５７】
次に、プログラム管理装置１００の動作を、プログラム２０が入力プログラムとして与えられた際に図５に示す構文解析結果を得るまでの流れを例にとって説明する。
まず、構文解析部１２０がプログラム２０に対して構文解析を行い、構文情報テーブル１４１のうち、推測された言語要素の言語要素および特殊化時の言語要素以外の情報を取得する。そして図７に示す、大域宣言・定義を示す構文木を要素とするリストＬを作成する。
【００５８】
さらに、構文解析部１２０は、図６に示すシンボル情報を作成する。
構文解析の結果得られた構文木に対し、推測処理および関連づけ処理を行う。
図４に示すプログラムにおいて、ノード１（プログラム２０の１行目の変数ｘの宣言）については、テンプレート定義ではなく、またなにかしらの特殊化も行われていないので、解析は行われない。
【００５９】
ノード２（プログラム２０の２行目の関数ｆの宣言）については、テンプレート定義ではなく、またなにかしらの特殊化も行われていないので、解析は行われない。
ノード３（プログラム２０の３行目の関数ｆの宣言）については、テンプレート定義ではなく、またなにかしらの特殊化も行われていないので、解析は行われない。
【００６０】
ノード４（プログラム２０の４〜８行目のテンプレート関数ｇの定義）については、テンプレート定義であるので、推測処理を行う。
テンプレート関数ｇの内容を表す構文木は、ノード１１〜１６で構成されていて、これについて解析を行う。すると、この中から関数を表すノードとして名前がｆである１引数の関数ノード１５が発見される。その後、シンボル情報から関数ｆと同じ名前を持つシンボル名を検索し、そのシンボル名に対応するシンボル定義で定義されている言語要素に等しいノードを、構文木の中から検索する。
【００６１】
その結果、ノード１５はノード７、８が表す関数ｆが用いられる可能性があると推測される。
ノード７、８が表す関数ｆは、構文情報テーブル１４１では、それぞれＩＤナンバー「２」、「３」に登録されている。そこで、ノード１５が表す関数ｆが登録されているＩＤナンバー「５」のカラムに対して、推測された言語要素として「２，３」を上書きする。
【００６２】
次に、ノード５（プログラム２０の９〜１２行目の関数ｈの定義）については、内部で特殊化が行われているため、関連づけ処理を行う。
関数ｈを表す構文木は、ノード７、１７〜２４で構成されている。この中から特殊化して作られた言語要素を表すノードとしてノード２４が発見される。
【００６３】
ノード２４が表す関数ｇ＜ｉｎｔ＞をルートとする構文木はノード７、２５〜２９で構成されている。よって、ノードＮＩは、ノード７、２５〜２９となる。また、関数ｇ＜ｉｎｔ＞の元となったテンプレート関数ｇ＜Ｔ＞をルートとする構文木はノード１１〜１６で構成されている。よってノードＮＤは、ノード１１〜１６となる。
【００６４】
図１２は、ノードＮＩとノードＮＤとを比較する図である。
図１２（ａ）に示すように、ノード１１〜１６の中で、言語要素を表すノードとしてノード１５が発見される。また、図１２（ｂ）に示すように、ノード１５に対応する、特殊化されたノードはノード７が発見される。よってノード７が表す言語要素をノード１５の特殊化時の言語要素とし、その情報を構文情報テーブル１４１に格納する。ここで、ノード７が表す関数ｆは構文情報テーブル１４１では、ＩＤナンバー「２」に登録されている。そこで、ノード１５が表す関数ｆが登録されているＩＤナンバー「５」のカラムに対して、特殊化時の言語要素として「２」を上書きする。これにより、図５に示す構文解析結果を得る。
【００６５】
以下、具体的実施例として、プログラミング言語Ｃ＋＋での入力例と、生成される構文情報テーブルとそれを用いた検索の結果について説明する。
図１３、１４は、他のプログラムを示す図であり、図１５は、図１３に示すプログラムの構文情報テーブルを示す図であり、図１６は、図１４に示すプログラムの構文情報テーブルを示す図である。
【００６６】
構文解析部１２０が図１３に示すプログラム２１を解析した結果、ＩＤナンバー「５」の種類が「不明」であることがわかる。言語要素抽出部１５０により、構文情報テーブル１４２の推測された言語要素としてＩＤナンバー１の言語要素とＩＤナンバー２の言語要素とが設定され、特殊化時の言語要素としてＩＤナンバー１の言語要素が設定される。よって、プログラム２１で実際に用いられている言語要素として１行目の関数ｆが用いられていることが分かる。
【００６７】
また、構文解析部１２０が図１４に示すプログラム２２を解析した結果、ＩＤナンバー「５」の種類が「不明」であることが分かる。言語要素抽出部１５０により、構文情報テーブル１４３のＩＤナンバー「５」の種類が「不明」であることが分かる。言語要素抽出部１５０により、推測された言語要素としてＩＤナンバー２の言語要素と組み込み演算子とが設定され、特殊化時の言語要素として組み込み演算子が設定される。よって、プログラム２２で実際に用いられているのは組み込み演算子であることが分かる。
【００６８】
次に、構文情報テーブルの他の例を示す。
図１７は、構文情報テーブルの他の例を示す図である。
図１７に示す構文情報テーブル１４４では、各言語要素の区別・検索に、名前、種類、使われ方、仮想関数かどうか、テンプレートかどうか、型、引数の数、引数の型、テンプレート引数の数、テンプレート引数の値、スコープ、推測された言語要素、特殊化時の言語要素、ファイル名、行番号、カラム番号が設定されている。これにより、例えば、検索時に名前がｆで種類が関数でスコープがクラスＣであるという３つの条件を満たすものは何か等、種々の情報を用いてより細かな検索をかけることができ、また、より確実に、推測された言語要素、特殊化時の言語要素を抽出することができる。
【００６９】
次に、検索・出力部１６０の備えるＧＵＩについて説明する。
図１８は、検索対象とする言語要素を選択する際の画面を示す図である。
画面４０には、検索対象となるソースコードの一覧表示部４１と、一覧表示部４１で選択されたソースコードを表示するエディタ４２と、検索した結果見つかったものについて、名前、ファイル名、フォルダ名、行番号を表示するタスク表示部４３とが表示されている。図１８では、検索対象としてエディタ４２に表示されているソースコードの１行目のＣ＿Ｃ１という言語要素が選択されている。
【００７０】
図１９は、ポップアップメニューから検索の動作を選択している状況を表す図である。図１８に示したようにエディタ４２上で言語要素を選択した後、ユーザのマウス１３のクリック動作等によりポップアップメニュー４４が表示され、その中からＳｅａｒｃｈを選ぶことで、選択した言語要素について言語要素抽出処理が行われる。
【００７１】
図２０は、検索結果を表示している状況を表す図である。
タスク表示部４３には検索した結果、見つかったものについて、名前、ファイル名、フォルダ名、行番号が表示されている。また、検索結果を選択すると、ソースコードの該当部分４２１がエディタ４２に表示される。また、検索対象をエディタ４２から選択するのではなく、モニタ１１に検索条件を入力して検索を行うための表示画面を表示させることにより検索を行うよう構成されていてもよい。
【００７２】
図２１は、検索条件を入力して検索を行うための表示画面を表す図である。
図２１に示す例では、ユーザが表示部４５に検索したい言語要素の名前や型等の入力を行って、検索ボタンを押下すると、プログラム管理装置１００が、入力された条件に合致するものを検索し、モニタ１１が検索結果の表示を行う。
【００７３】
以上述べたように、プログラム管理装置１００によれば、言語要素抽出部１５０が、構文解析部１２０の構文解析の結果得られた構文木に対し推測処理を実行することにより、検索対象プログラムに記載されたテンプレート定義内で出現する言語要素に対して推測処理を行うことによって、関連する推測された言語要素を確実に抽出することができ、注目すべき箇所を確実に漏れなく絞り込むことができる。
【００７４】
また、テンプレート定義と特殊化時情報との関連づけ処理を行うことにより特殊化時の言語要素を抽出することによって、特殊化時の言語要素をより確実に抽出することができる。これにより、注目すべき箇所をより確実に漏れなく絞り込むことができる。
【００７５】
このため、プログラム管理装置１００のユーザは、例えばプログラム２０の２行目のｉｎｔ型の定義が７行目で参照されていることを容易かつ確実に調べることができるため、２行目のｉｎｔ型の定義を参照元または参照先の言語要素に影響を及ぼさないように変更することができる。このように、ユーザがソースコードを理解、修正するための作業量の低減を図ることができる。
【００７６】
以上本発明の好適な実施の形態について詳述したが、本発明は、その特定の実施の形態に限定されるものではない。
なお、本実施の形態では、解析対象プログラムとしてプログラミング言語Ｃ＋＋で作成されたプログラムを例にとって説明したが、本発明は、総称性を持つ他の言語についても適用することができる。
【００７７】
また、上記の処理機能は、コンピュータによって（コンピュータに所定のプログラム管理プログラムを実行させることにより）実現することができる。その場合、プログラム管理装置１００が有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等が挙げられる。磁気記録装置としては、例えば、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープ等が挙げられる。光ディスクとしては、例えば、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ（Random Access Memory）、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）等が挙げられる。光磁気記録媒体としては、例えば、ＭＯ（Magneto-Optical disk）等が挙げられる。
【００７８】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【００７９】
プログラム解析プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送される毎に、逐次、受け取ったプログラムに従った処理を実行することもできる。
【００８０】
（付記１）  入力されるプログラムを解析するプログラム解析プログラムにおいて、
コンピュータに、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する構文解析部、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する言語要素抽出部、
として機能させることを特徴とするプログラム解析プログラム。
【００８１】
（付記２）  前記言語要素抽出部は、前記プログラムを解析することにより得られる構文木の、テンプレート定義内で参照されている関数を表している全てのノードに対し、前記シンボル情報を用いてその引数の数およびデータ型を推測することにより前記実際に参照される可能性のある言語要素を特定することを特徴とする付記１記載のプログラム解析プログラム。
【００８２】
（付記３）  前記言語要素抽出部は、さらに、前記プログラムに記載された特殊化が行われている言語要素を抽出し、前記特殊化が行われている言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記特殊化が行われている言語要素の元となった言語要素を抽出し、前記特殊化が行われている言語要素に含まれる言語要素と前記元となった言語要素に含まれる言語要素の対応をとることにより、前記元となった言語要素に含まれる言語要素について実際に参照されている言語要素を特定することを特徴とする付記１記載のプログラム解析プログラム。
【００８３】
（付記４）  前記言語要素抽出部は、前記プログラムを解析することにより得られる構文木の、前記特殊化が行われている言語要素を主ノードとする構文木の各ノードと、前記シンボル情報を参照して得られる前記特殊化の元となった構文木とを比較することにより前記実際に参照される可能性のある言語要素を特定することを特徴とする付記３記載のプログラム解析プログラム。
【００８４】
（付記５）  前記言語要素抽出部は、前記プログラムを解析することにより得られる構文木の、特殊化して作られた関数またはクラスを表している全てのノードに対し、前記ノードの元となったテンプレートの定義を前記シンボル情報を用いて発見し、前記発見された言語要素を主ノードとする前記構文木と前記特殊化された関数またはクラスを主ノードとする前記構文木との関連づけを行うことにより前記実際に参照される可能性のある言語要素を特定することを特徴とする付記３記載のプログラム解析プログラム。
【００８５】
（付記６）  入力されるプログラムを解析するプログラム解析方法において、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成し、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、
前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する、
ことを特徴とするプログラム解析方法。
【００８６】
（付記７）  入力されるプログラムを解析するプログラム解析装置において、
前記プログラムの構文解析を行って構文情報とシンボル名に対応するシンボル定義を備えるシンボル情報とを作成する構文解析部と、
前記プログラムに記載されたテンプレートの定義内で参照されている言語要素を抽出して前記言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記シンボル定義で定義または宣言されている言語要素を、推測された言語要素として設定する言語要素抽出部と、
を有することを特徴とするプログラム解析装置。
【００８７】
（付記８）  前記言語要素抽出部は、さらに、前記プログラムに記載された特殊化が行われている言語要素を抽出し、前記特殊化が行われている言語要素に一致する前記シンボル名に対応する前記シンボル定義を抽出し、前記特殊化が行われている言語要素に一致する前記シンボル名に対応する前記シンボル定義で定義または宣言されている言語要素を、特殊化時の言語要素として設定することを特徴とする付記７記載のプログラム解析装置。
【００８８】
（付記９）  前記プログラムに記載された任意の言語要素が選択されると、前記選択された言語要素を、前記推測された言語要素または前記特殊化が行われている言語要素として用いている部位を表示する表示部をさらに有することを特徴とする付記８記載のプログラム解析装置。
【図面の簡単な説明】
【００８９】
【図１】実施の形態に適用される発明を示す原理図である。
【図２】実施の形態のプログラム管理装置のハードウェア構成例を示す図である。
【図３】プログラム管理装置の機能を示すブロック図である。
【図４】解析対象プログラムの一例を示す図である。
【図５】図４に示す解析対象プログラムの構文情報の例を示す図である。
【図６】図４に示す解析対象プログラムのシンボル情報を示す図である。
【図７】図４に示す解析対象プログラムの構文木を示す図である。
【図８】プログラム管理装置の動作を示すフローチャートである。
【図９】言語要素抽出処理を表すフローチャートである。
【図１０】推測処理を示すフローチャートである。
【図１１】関連付け処理を示すフローチャートである。
【図１２】ノードＮＩとノードＮＤとを比較する図である。
【図１３】他のプログラムを示す図である。
【図１４】他のプログラムを示す図である。
【図１５】図１３に示すプログラムの構文情報テーブルを示す図である。
【図１６】図１４に示すプログラムの構文情報テーブルを示す図である。
【図１７】構文情報テーブルの他の例を示す図である。
【図１８】検索対象とする言語要素を選択する際の画面を示す図である。
【図１９】ポップアップメニューから検索の動作を選択している状況を表す図である。
【図２０】検索結果を表示している状況を表す図である。
【図２１】検索条件を入力して検索を行うための表示画面を表す図である。
【符号の説明】
【００９０】
１  構文解析手段
２  シンボル定義抽出手段
１００  プログラム管理装置
１１０  プログラム格納部
１２０  構文解析部
１３０  記憶部
１４０  構文情報ＤＢ（データベース）
１４１、１４２、１４３、１４４  構文情報テーブル
１５０  言語要素抽出部
１６０  検索・出力部
【図１】
2007249264.tif 000003
【図２】
2007249264.tif 000004
【図３】
2007249264.tif 000005
【図４】
2007249264.tif 000006
【図５】
2007249264.tif 000007
【図６】
2007249264.tif 000008
【図７】
2007249264.tif 000009
【図８】
2007249264.tif 000010
【図９】
2007249264.tif 000011
【図１０】
2007249264.tif 000012
【図１１】
2007249264.tif 000013
【図１２】
2007249264.tif 000014
【図１３】
2007249264.tif 000015
【図１４】
2007249264.tif 000016
【図１５】
2007249264.tif 000017
【図１６】
2007249264.tif 000018
【図１７】
2007249264.tif 000019
【図１８】
2007249264.tif 000020
【図１９】
2007249264.tif 000021
【図２０】
2007249264.tif 000022
【図２１】
2007249264.tif 000023