(57)【特許請求の範囲】
【請求項１】
プログラム中のある実行文中で複数の変数が用いられている場合に，それらの変数の関係をその実行文の種類またはオペランドの種類によって分析するプログラム解析装置であって，
変数のサイズ，型，および値の取り得る範囲に関する制約条件が同じ変数を，同じドメインの候補としてプログラム中から抽出する手段と，
前記同じドメインの候補として抽出した変数内部のレイアウト位置を，各変数の部分参照位置，サイズ，型，および転記と比較の文法規則を用いて分析する手段と，
プログラム中で複数の異なるドメインにわたって使用される変数である多ドメイン変数を抽出し，多ドメイン変数として抽出した結果を表示し，表示した多ドメイン変数の中でユーザが多ドメイン変数として扱いたくないものをユーザに指示させ，ユーザから指示された変数以外の変数だけを最終的な多ドメイン変数としての抽出結果とする手段と，
前記変数内部のレイアウト位置を分析した結果と前記多ドメイン変数としての抽出結果とを用い，それぞれの変数が同じドメインを表現するかどうかによってグループ分けを行い，また，前記多ドメイン変数として抽出した変数が複数の変数の転送関係に関与している場合には，その多ドメイン変数と転送関係にある変数を含む異なるドメインごとに，当該多ドメイン変数を割り振り，それぞれ割り振り先のドメインの変数と同じドメインに属する変数として分類するドメイン分析手段とを備え，
プログラム中の変数または変数内部要素を，同じドメインを表現するかどうかによって分類した情報を出力する
ことを特徴とするプログラム解析装置。
【請求項２】
請求項１記載のプログラム解析装置において，
前記ドメイン分析手段は，ドメイン分析結果を出力する際に，前記多ドメイン変数と転送関係にある変数を含む異なるドメインごとに割り振った多ドメイン変数に対して所定のマークを付けて出力する
ことを特徴とするプログラム解析装置。
【請求項３】
プログラム中のある実行文中で複数の変数が用いられている場合に，それらの変数の関係をその実行文の種類またはオペランドの種類によって分析するプログラム解析装置を実現するためのプログラムを格納した計算機読み取り可能なプログラム記憶媒体であって，
変数のサイズ，型，および値の取り得る範囲に関する制約条件が同じ変数を，同じドメインの候補としてプログラム中から抽出する処理と，
前記同じドメインの候補として抽出した変数内部のレイアウト位置を，各変数の部分参照位置，サイズ，型，および転記と比較の文法規則を用いて分析する処理と，
プログラム中で複数の異なるドメインのもとで使用される変数である多ドメイン変数を抽出し，多ドメイン変数として抽出した結果を表示し，表示した多ドメイン変数の中でユーザが多ドメイン変数として扱いたくないものをユーザに指示させ，ユーザから指示された変数以外の変数だけを最終的な多ドメイン変数としての抽出結果とする処理と，
前記変数内部のレイアウト位置を分析した結果と前記多ドメイン変数としての抽出結果とを用い，それぞれの変数が同じドメインを表現するかどうかによってグループ分けを行い，また，前記多ドメイン変数として抽出した変数が複数の変数の転送関係に関与している場合には，その多ドメイン変数と転送関係にある変数を含む異なるドメインごとに，当該多ドメイン変数を割り振り，それぞれ割り振り先のドメインの変数と同じドメインに属する変数として分類するドメイン分析処理と，
プログラム中の変数または変数内部要素を，同じドメインを表現するかどうかによって分類した情報を出力する処理とを，
計算機に実行させるためのプログラムを格納したことを特徴とするプログラム解析装置のプログラム記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，あるアプリケーション内のプログラムで使われている変数および変数内部要素間の関連に着目し，ドメインを表す変数または変数内部要素をグループ化するプログラム解析装置およびそのプログラム記憶媒体に関する。
【０００２】
ここで，ドメインとは，同じ対象を表現するものである。例えば変数「受注日付」と「納品日付」とが，どちらも年，月，日で表現される場合，「受注日付」と「納品日付」とは「年月日」を表現する変数であり，このような変数によって表現される対象をドメインという。
【０００３】
また，ドメイン定義とは，上記のようなドメインの「表現される対象」を，制約条件（値域）で定義付けたものをいう。例えば，ドメイン「年月日」は，さらに細かく分けるとドメイン「年」，「月」，「日」で構成されており，「日」は「１以上３１以下の整数」というドメイン定義で表現される。
【０００４】
これらの情報を既存のプログラムから自動的に抽出することができれば，プログラムの理解に極めて有用であり，デバッグ，保守，改良等に役立つ。
【０００５】
【従来の技術】
プログラムの処理を詳細に理解するためには，変数の宣言時の情報や変数が保持する値を，具体的に追うことが必要不可欠となる。従来のプログラム解析では，変数名や型，大きさ等，変数宣言時の静的な情報のみが，変数毎にプログラム単位で解析されるだけであり，プログラムの保守や改良を行うための貢献は少なかった。
【０００６】
図１２は，従来技術を説明するための図である。
従来のプログラム解析では，データ個々の宣言文からデータ型およびデータの大きさを分析するにとどまっており，具体的には，例えば，図１２（Ａ）に示すＣＯＢＯＬプログラムのデータ宣言部のデータ個々の宣言文から，データ型解析結果として，図１２（Ｂ）に示すような各データの型と大きさについての情報を得るだけであった。
【０００７】
図１２（Ｂ）に示すような従来のデータ型解析結果から，例えば「受注月」，「受注日」，「納品月」，「納品日」は，データ型と大きさが同じであることがわかる。しかし，これらが各々どのような制約条件（値域）を持つかというようなことはわからない。
【０００８】
例えば「受注日」と「納品日」とは，データのとる値の範囲が「１以上３１以下」という共通の制約条件を持つ。これらのデータは，「日：範囲（１以上３１以下）」という同一ドメインのデータである。一方，「受注日」と「受注月」とは，データ型と大きさは同じであるが，制約条件は，それぞれ「１以上３１以下の整数」，「１以上１２以下の整数」と異なるため，ドメインが異なる。
【０００９】
従来技術では，このようなドメインの観点から変数をグループ分けできなかった。また，変数個々の制約条件を抽出できず，さらには，ドメインを特徴づける制約条件の抽出を行うことができなかった。
【００１０】
【発明が解決しようとする課題】
上記問題点の解決を図るため，先に本発明者等は，プログラム中の変数に対して与えられた制約条件を自動抽出すること，ドメインの観点から変数をグループ分けすること，制約条件の抽出結果と変数の分類結果とからドメイン定義情報を得ることにより，プログラムの解読に有用な情報を得る手段を提供することを目的とし，さらに，プログラム単位で得られたドメインの分類情報から，複数のプログラムにわたるドメイン間の関係情報を解析し，それをわかりやすく表示する手段を提供することにより，プログラムの理解を一層容易にする手段を提供することを目的として，特願平８−９９７４５号に示される「プログラム解析装置およびプログラム解析表示装置」（以下，関連発明という）を提案している。
【００１１】
本発明は，先の関連発明をさらに改良・発展させ，変数同士がある特殊な転送関係等にある場合においても，それらの変数について高い精度で同一ドメイン，別ドメインの分類を可能にすることを目的としている。
【００１２】
特に，本発明は，変数データの部分転送や比較，あるいは長さが異なる変数間の転送や比較があった場合に，その変数内部の具体的にどの位置が同一ドメインであるかを抽出できるようにし，さらに多ドメインにわたって再利用されながら使われる変数に対して転送関係にある複数の変数について，ユーザの指示により同一ドメインおよび別ドメインの双方の分類を可能とすることを目的とする。
【００１３】
また，本発明は，帳票レコードのような多ドメインにわたって再利用されながら使われる変数に対して転送関係にある複数の変数同士が，そのことのみで同一ドメインとして判断されることにより，連鎖的に同一ドメインの範囲が拡大するのを防ぐことを目的とする。
【００１４】
また，第２の発明は，上記発明においてさらに，ドメイン抽出結果を人間が見たときに，多ドメインにわたって再利用されながら使われる変数を含むドメイン群について，同一ドメインとしても別ドメインとしても認識できるようにすることを目的とする。
【００１６】
【課題を解決するための手段】
図１は，本発明に係るプログラム解析装置の構成例を示す図であり，１はプログラム解析装置，１１は解析対象プログラム情報，１２は多ドメイン変数抽出手段，１３は多ドメイン変数情報表（テーブル），１４は変数部分参照解析手段，１５は変数長解析手段，１６は変数型解析手段，１７は文法規則表（テーブル），１８は変数内部レイアウト解析手段，１９はドメイン分析手段，２０は変数分類表（テーブル）を表す。
【００１７】
解析対象プログラム情報１１は，解析対象となるアプリケーション内の全プログラムに関する情報であり，プログラムの構文を解析して得られた構文情報等を持つ。構文情報は，一般のコンパイラ等で用いられている技術を利用して得ることができる。
【００１８】
本発明の課題は，変数部分参照解析手段１４，変数長解析手段１５，変数型解析手段１６，文法規則表（テーブル）１７，変数内部レイアウト解析手段１８，ドメイン分析手段１９によって解決される。
【００１９】
変数部分参照解析手段１４は，構文情報を用いて，ある実行文（転記文）を解析し，変数がどのように部分参照されているかの情報を得る。変数長解析手段１５は，プログラムのデータ宣言部を解析し，各変数の長さ（桁長，バイト長，小数点位置など）を求める。変数型解析手段１６は，プログラムのデータ宣言部を解析して変数の型を求める。
【００２０】
なお，変数部分参照解析手段１４，変数長解析手段１５，変数型解析手段１６は既存技術によって実現できる。
文法規則表１７は，変数の型等に応じて，転記式，比較式における転記または比較を，例えば左詰めで行うか右詰めで行うかなど，どのように行うかという規則情報を収めるものである。
【００２１】
変数内部レイアウト解析手段１８は，変数部分参照解析手段１４，変数長解析手段１５，変数型解析手段１６のそれぞれから得た情報と文法規則表１７とを利用して，実行文が変数内部のどの位置に作用を与えたかを解析する。
【００２２】
ドメイン分析手段１９は，変数内部レイアウト解析手段１８の解析結果を利用して，同一ドメイン関係にある変数や変数内部要素をグループ化し，その分類した情報を変数分類表２０に出力する。
【００２３】
これにより，変数データの部分転送や比較，あるいは長さが異なる変数間の転送や比較があった場合にも，その変数内部の具体的にどの位置が同一ドメインであるかを抽出して，精度の高い分類を実現することができる。
【００２４】
また，本発明の課題は，多ドメイン変数抽出手段１２，多ドメイン変数情報表１３，およびドメイン分析手段１９によって解決される。
多ドメイン変数抽出手段１２は，解析対象プログラム情報１１の中の構文情報を利用して，帳票レコードのような多ドメインにわたって再利用されながら用いられる変数を抽出する。多ドメイン変数情報表１３は，多ドメイン変数抽出手段１２が抽出した多ドメイン変数情報を収める。
【００２５】
また，多ドメイン変数抽出手段１２は，多ドメイン変数情報表１３に保存した変数をユーザに表示し，その中で不必要な変数を指定させ，その変数を多ドメイン変数情報表１３から削除する手段を持つ。
【００２６】
ドメイン分析手段１９は，変数の値が同じドメインを表現するかどうかによってグループ分けを行う際に，多ドメイン変数情報表１３に収められた多ドメイン変数情報を利用することにより，多ドメイン変数が複数の変数の転送関係に関与している場合には，その転送関係だけに基づいてそれらの変数を同一ドメインと判断しないようにドメイン分析を行う。
【００２７】
また，ドメイン分析手段１９は，多ドメイン変数抽出手段１２が抽出した変数を，その変数と転送関係にある変数を含む異なるドメインごとに割り振り，ドメイン分析結果を出力する際に，多ドメイン変数について，所定のマークを付けて出力する。
【００２８】
これにより，広いドメインとしての分類および詳細な精度の高いドメインの分類が可能になる。また，多ドメイン変数とそれぞれ転送関係にある複数の変数について，同一ドメインおよび別ドメインの双方の分類が可能になる。
【００２９】
以上の各処理手段を計算機によって実現するためのプログラムは，計算機が読み取り可能な可搬媒体メモリ，半導体メモリ，ハードディスクなどの適当な記憶媒体に格納することができる。
【００３０】
【発明の実施の形態】
本発明の具体的な実施の形態を説明するに先立ち，本発明に関連する「プログラム解析装置およびプログラム解析表示装置」（特願平８−９９７４５号）の関連発明を説明し，続いてこの関連発明に対して本願発明が改良を加えた点を説明する。なお，以下では，ＣＯＢＯＬプログラムの解析例について説明するが，本発明は必ずしもＣＯＢＯＬプログラムに限られるわけではない。
【００３１】
図１３および図１４は，関連発明（特願平８−９９７４５号）に係るプログラム解析装置およびプログラム解析表示装置の構成例を示す図である。
図１３において，８はプログラム解析装置，８１はプログラムの構文を解析して得られる構文情報とプログラムの実行順序に従った文のつながりを示す制御フロー情報とを含む解析対象プログラム情報，８２はエラー処理手続き名やエラー処理の行番号などのエラー処理判定支援情報を表す。
【００３２】
また，８３は制約条件抽出手段，８３１は解析対象プログラム情報８１およびエラー処理判定支援情報８２をもとにプログラムのエラー処理部分を認識し，エラー処理を行う条件を抽出するエラー判定条件抽出手段，８３２はエラー判定条件抽出手段８３１の出力を分析して条件式を制約条件に変換することにより，特定の変数の制約条件を得る条件式／制約条件変換手段，８４は抽出された制約条件を記憶する制約条件表（テーブル）を表す。
【００３３】
また，８５は解析対象プログラム情報８１をもとに，プログラムのある実行文中で複数の変数が用いられている場合に，それらの変数の関係をその実行文の種類またはオペランドの種類によって分析し，変数の値が同じドメインを表現するかどうかによってグループに分け，プログラム中の変数を同じドメインを表現するかどうかによって分類した情報を出力する変数分類手段，８６は変数の分類情報を記憶する変数分類表（テーブル），８７は制約条件抽出手段８３から得た変数の制約条件を記憶する制約条件表８４と，変数分類手段８５から得た複数の変数が共通に表現するドメインに関する分類情報を記憶する変数分類表８６とから，同じ対象を表現するドメインに関する定義情報を抽出し，ドメイン定義情報８８として出力するドメイン定義抽出手段，８８はドメイン定義情報，９はプログラム解析表示装置を表す。
【００３４】
プログラム解析装置８は，制約条件抽出手段８３により，プログラムのエラー処理部分を認識し，エラー処理を行う条件を抽出し，エラー判定条件式を分析して特定の変数の制約条件を得て，条件式から制約条件への変換を行い，また，変数分類手段８５により，プログラムのある実行文中で複数の変数が用いられている場合に，それらの変数の関係をその実行文の種類またはオペランドの種類によって分析し，変数の値が同じドメインを表現するかどうかによってグループに分け，変数分類手段８５から得た複数の変数が共通に表現するドメインに関する分類情報と制約条件抽出手段８３から得た変数の制約条件とから，同じ対象を表現するドメインに関する定義情報を抽出してプログラムの解析結果としてドメイン定義情報８８を出力する。
【００３５】
図１３に示すプログラム解析装置８によってドメイン定義情報８８を自動抽出することにより，同様な対象を表す変数群を容易に把握できるようになる。
図１４は，プログラム解析表示装置９の構成例を示す図であり，図１３と同符号のものは図１３に示すものに対応する。図１４において，９１は各プログラム毎のドメインに分類された変数情報８８’（またはドメイン定義情報８８）と，ジョブ制御言語９４とを入力し，複数のプログラムから得られたプログラム毎のドメイン間の関係を解析し，解析した結果をドメイン関係情報９７として出力するドメイン解析手段，９２は解析結果を表示する表示処理手段，９３はドメインの要素または要素の一部としての変数または変数群がユーザによって指定された場合に，ドメイン解析手段９１が解析したドメイン関係情報９７に基づいて，同一関係にあるドメインに含まれる指定された変数または変数群に対応するすべての変数または変数群を出力するドメイン要素の関係出力手段，９４はユーザが書いたプログラムや予め用意されたユーティリティプログラム等を，どのような手順で実行するかを記述したジョブ制御言語（ＪＣＬ），９５はプログラム間の呼び出し関係を示すＣＡＬＬ情報，９６はユーザが入力し指定したユーザ入力情報，９７は複数のプログラムから得たドメインを分類した結果のドメイン間の関係を示すドメイン関係情報，９８はディスプレイを表す。
【００３６】
プログラム解析表示装置９は，プログラム解析装置８が解析対象プログラム情報８１から各プログラム毎に得たドメインについて，ドメイン解析手段９１，表示処理手段９２，ドメイン要素の関係出力手段９３によって，ドメイン間の関係を解析して表示する。
【００３７】
そこで，図１４に示すプログラム解析表示装置９を用いることにより，ドメイン間の関係を解析し解析結果を表示すれば，複数のプログラムに跨がるドメイン間の関係を把握し，変数の解析をより効率的に行うことができるようになる。
【００３８】
また，この際にドメイン間の関係および変数の代入関係をグラフ表示によって図示することにより，変数の持つ情報を視覚的に容易に得ることができ，より高度なプログラム理解の支援を実現することが可能になる。
【００３９】
図１５は，プログラム解析装置８により得られた分析結果を説明する図である。
例えば，図１５（Ａ）に示すようなＣＯＢＯＬ言語で記述されたプログラムを，図１３に示すプログラム解析装置８により解析すると，図１５（Ｂ）に示すようなドメイン情報が変数分類表８６として得られる。すなわち，変数Ａを変数Ｂに転記する文により，変数Ａと変数Ｂとが同一ドメイン変数として認識され，また変数Ｘと変数Ｙとの比較文から変数Ｘと変数Ｙとが同一ドメイン変数として認識される。さらに，変数Ｂを変数Ｃに転記する文および変数Ｂを変数Ｄに転記する文から変数Ａ，Ｂ，Ｃ，Ｄがすべて同一ドメインであることが認識される。また，変数Ｘと変数Ｚとの比較文から変数Ｘと変数Ｚとが同一ドメイン変数であると認識され，これから変数Ｘ，Ｙ，Ｚがすべて同一ドメインであることが認識される。
【００４０】
このように，前記の関連発明では，プログラム内の実行文の種類とその中のオペランドの種類から，同一ドメインを表すと思われる変数を抽出してドメインを作成し，さらに，共通の変数を要素とするドメインは同じものとし，特定のアプリケーション内の全実行文から得られたドメインの総和を求めて，そのアプリケーション内における変数分類表を作成することを可能にしている。
【００４１】
この関連発明のプログラム解析装置によれば，同一ドメイン関係が広い範囲で求められる。しかし，変数の部分参照のように，特殊な変数の転記関係があるような場合には，厳密な意味での正しいドメイン関係が得られない場合がある。
【００４２】
図１６は，長さが異なる変数間の右詰めの転記の場合の関連発明によるドメイン分析例を示す図である。
図１６に示すように，外部十進２桁（２バイト）の変数Ａから外部十進４桁（４バイト）の変数Ｂへの転記の場合，変数Ａの内容が変数Ｂの一部へ右詰めで転記される。この場合，厳密には変数Ａと変数Ｂの内部要素とが同一ドメインであるが，先の関連発明によれば，変数Ａと変数Ｂとの転記関係により，変数Ａと変数Ｂの全体が同一ドメイン関係にあると判断される。この判断自体は誤りではないが，もっと精度の高い分類が望まれる。
【００４３】
図１７は，集団項目変数を含む左詰めの転記の場合の関連発明によるドメイン分析例を示す図である。
図１７に示すように，それぞれ２バイトの変数Ａ１，変数Ａ２，変数Ａ３からなる６桁（６バイト）からなる集団項目変数Ａから，日本語１桁（２バイト）の変数Ｂへの転記の場合，変数Ａから変数Ｂへの左詰めの転記が行われることになる。したがって，厳密には変数Ａにおける先頭の変数Ａ１と変数Ｂとが同一ドメインであるが，先の関連発明によれば，変数Ａと変数Ｂとの転記関係により，変数Ａと変数Ｂとが同一ドメイン関係にあると判断される。
【００４４】
図１８は，部分参照付き転記からの関連発明によるドメイン分析例を示す図である。
部分参照付き転記とは，変数の一部分を指定して，その内容を転記先の変数に転記することをいう。図１８に示すように，変数Ａと変数Ｂとがともに１００桁（１００バイト）の英数字であるが，変数Ａの５０桁目から長さ２０桁のデータを変数Ｂへ転記する実行文があった場合，先の関連発明では，変数Ａと変数Ｂとが同一ドメイン関係と判断される。しかし，厳密には，図１８において斜線を施したデータ部分が同一ドメインである。
【００４５】
図１９は，先の関連発明において転送関係にない変数が同一ドメインとなる例を示している。図１９（Ｂ）に示すプログラムを解析した場合，変数Ａと変数Ｂとの転記関係により，変数Ａと変数Ｂとが同一ドメインとされ，さらに変数Ｂから変数Ｃへの部分参照付き転記により，変数Ａ，Ｂ，Ｃが同一ドメインとされ，変数Ｃと変数Ｄとの転記関係により，変数Ａ，Ｂ，Ｃ，Ｄがすべて同一ドメインとされる。しかし，実際には図１９に示すように，必ずしも変数Ａと変数Ｃ，Ｄとは，同一ドメインとは限らない。
【００４６】
以上のように，変数データの部分転送や一部分の比較，あるいは長さの異なる変数間での転送／比較があった場合に，先の関連発明では，その変数内部のどの部分（位置）が同一ドメインであるかを具体的に抽出することができない。このため，図１９に示すように，アプリケーション内の複数の実行文についてドメイン解析を行った場合に，全く転送関係のない変数同士が同一ドメインとされてしまうことがあり得る。このような分析結果の同一ドメイン変数に対して，厳密な意味での同一かどうかは，出力結果から最終的に人間が判断しなければならず，解析者に負担を与えることになる。
【００４７】
本発明は，後に詳述するように，特に図１に示す変数内部レイアウト解析手段１８およびドメイン分析手段１９の処理により，図１６〜図１９に示すようなケースにおいても，厳密な意味での同一ドメインを求めることができるようにするものである。
【００４８】
図２０は，関連発明において異なるドメイン変数が同一ドメインとして得られ，ノイズが広がる例を示している。
図２０（Ｂ）に示すプログラムにおいて，ＪＵＣＨＵ−ＦＩＬＥとＺＡＩＫＯ−ＦＩＬＥは，異なるドメインの変数であり，ＲＥＣは，ファイル書き出し用に使われる帳票（バッファ・レコード）である。図２０（Ａ）に示すように，多ドメインにわたって用いられる帳票ＲＥＣへの転記があるために，ＪＵＣＨＵ−ＦＩＬＥとＺＡＩＫＯ−ＦＩＬＥとは同一ドメイン変数となってしまう。さらに，ＪＵＣＨＵ−ＦＩＬＥ，ＺＡＩＫＯ−ＦＩＬＥのそれぞれにつながる変数が一式同一ドメイン変数となってしまう。しかし，ＪＵＣＨＵ−ＦＩＬＥとＺＡＩＫＯ−ＦＩＬＥが別ドメインである場合であっても，別ドメインとして抽出することはできず，このような変数のつながり（ノイズの拡大）を防ぐことはできなかった。
【００４９】
また，本発明は，後に詳述するように，特に図１に示す多ドメイン変数抽出手段１２およびドメイン分析手段１９の処理により，図２０に示すようなケースにおいても，同一ドメイン，別ドメインの分類を可能とし，ドメインに関するノイズの拡大を防ぐことができるようにするものである。
【００５０】
以下，本発明の実施の形態を図を用いて説明する。
図２は，本発明の実施の形態における処理フローチャートと処理されるデータ構造の例を示す。なお，図２において，［］は１ドメインを表す。
【００５１】
ステップＳ１では，ステップＳ２以降の処理をプログラム内の全実行文に対して繰り返し，全実行文について処理したならば解析を終了する。
ステップＳ２では，プログラムから実行文Ｓを取る。
【００５２】
ステップＳ３では，前述した先の関連発明による技術を利用し，実行文Ｓで使われている変数のうち，同じ対象を表している変数を求める。実行文Ｓが「ＭＯＶＥ  Ａ  ＴＯ  Ｂ．」の場合，転記関係から変数Ａ，Ｂは同一ドメイン変数とされ，実行文Ｓが「ＭＯＶＥ  Ｃ（５０：４０）  ＴＯ  Ｄ．  」の場合，転記関係から変数Ｃ，Ｄは同一ドメイン変数とされる。
【００５３】
ステップＳ４では，変数内部レイアウト解析手段１８は，変数部分参照解析手段１４，変数長解析手段１５，変数型解析手段１６による解析結果を利用し，それらの変数内部においてドメインを表す具体的なレイアウトを，変数の部分参照位置，サイズ，型および転記や比較等の文法規則を使って得る。
【００５４】
例えば，型情報として「Ａ，Ｂは外部十進数」，「Ｃ，Ｄは英数字項目」，桁情報として「Ａ：６桁，Ｂ：４桁」，「Ｃ：１００桁，Ｄ：２０桁」，文法規則として「ＡからＢへの転記は右詰め」，「ＣからＤへの転記は左詰め」，部分参照情報として「Ｃの５０桁目から長さ４０桁部分が参照された」という情報を得る。
【００５５】
図３は，文法規則表（テーブル）の構成例を示す図である。図３（Ａ）はＣＯＢＯＬにおける転記規則テーブルの例を示し，図３（Ｂ）は，ＣＯＢＯＬにおける比較規則テーブルの例を示す。図３において，１は左詰め転記／比較，２は右詰め転記／比較，３は小数点位置合わせ転記／比較，×は転記／比較不可を示す。
【００５６】
例えば，Ａ（外部十進）からＢ（外部十進）への転記は転記規則テーブルから右詰めであることが得られ，Ｃ（英数字項目）からＤ（英数字項目）への転記は左詰めであることが得られる。
【００５７】
なお，部分参照付きの規則は，他の転記／比較規則に優先される。
ステップＳ５では，ステップＳ３で得た同一ドメイン変数に，ステップＳ４で得た内部レイアウト情報を付加し，それらのまとまりを新規ドメインとする。これにより，新規の同一ドメイン情報として［Ａ（３，４），Ｂ］，［Ｃ（５０，２０），Ｄ］を得る。Ａ（ｘ，ｙ）は，変数Ａのｘ桁目から長さｙの部分を表し，（）のないものは変数全体を表す。
【００５８】
ステップＳ６では，図２０で説明した帳票ＲＥＣのような多ドメイン変数が，ステップＳ３〜Ｓ５で求めたドメイン中にあれば，その変数にマーク（＊）を付ける。ここで，例えば変数Ｄが多ドメイン変数であれば，同一ドメインの情報中のＤに＊を付け，同一ドメイン情報の［Ｃ（５０，２０），Ｄ］を，［Ｃ（５０，２０），Ｄ＊］とする。
【００５９】
ステップＳ７では，ドメイン分析手段１９は，ドメインのリストを持つ変数分類表Ｔに新しいドメインを追加して変数分類表Ｔ’とする。このとき，１つでも同じ変数または変数要素を持ち，変数内部の位置まで一致するドメインが既に変数分類表Ｔに存在すれば，そのドメインとマージする。ただし，その変数または変数要素に多ドメイン変数であることを示すマーク＊が付いている場合にはマージしない。
【００６０】
例えば，既に求められている変数分類表Ｔが『［Ｂ，Ｘ，Ｙ］，［Ｐ，Ｄ＊］』であるとき，［Ａ（３，４），Ｂ］とのマージによって，変数分類表Ｔ’は，『［Ａ（３，４），Ｂ，Ｘ，Ｙ］，［Ｐ，Ｄ＊］』となり，さらに［Ｃ（５０，２０），Ｄ＊］の同一ドメイン情報から，変数分類表Ｔ’は，『［Ａ（３，４），Ｂ，Ｘ，Ｙ］，［Ｐ，Ｄ＊］，［Ｃ（５０，２０），Ｄ＊］』となる。
【００６１】
図４は，変数内部レイアウト解析手段１８の処理フローチャートと処理されるデータ構造の例を示す図である。
以下の処理は，ある変数の同一ドメイン関係を作る転記式（比較式）について行う。代入元（右辺），代入先（左辺）の変数をそれぞれＡ，Ｂとする。
【００６２】
ステップＳ１１では，データ宣言部より変数Ａ，Ｂの型を求める。変数Ａ＝ＩＤの型は外部十進，変数Ｂ＝ＹＭＤの型は英数字と求まる。
ステップＳ１２では，データ宣言部より，Ａ，Ｂの長さ，および小数点位置が宣言されているものについては，小数長さ，整数長さを求める。ここで，変数Ａの長さをａｌ，小数長さをａｉｌ（小数なし＝０），整数長さをａｄｌ（小数なし＝ａｌ）とし，変数Ｂの長さをｂｌ，小数長さをｂｉｌ（小数なし＝０），整数長さをｂｄｌ（小数なし＝ｂｌ）とすると，「ａｌ＝１０，ａｉｌ＝０，ａｄｌ＝１０，ｂｌ＝６，ｂｉｌ＝０，ｂｄｌ＝６」が求まる。
【００６３】
ステップＳ１３では，転記式／比較式を解析し，Ａ，Ｂの部分参照の有無とその位置を求める。ここで，変数Ａの部分参照開始位置をａｒｆ（部分参照なし＝１），変数Ａの部分参照長さをａｒｌ（部分参照なし＝ａｌ），変数Ｂの部分参照開始位置をｂｒｆ（部分参照なし＝１），変数Ｂの部分参照長さをｂｒｌ（部分参照なし＝ｂｌ）とすると，「ａｒｆ＝３，ａｒｌ＝４，ｂｒｆ＝１，ｂｒｌ＝６」が求まる。
【００６４】
ステップＳ１４では，Ａ，Ｂの型と文法規則表１７の転記／比較規則より，種別＠を得る。この例では，図３に示す文法規則によって，外部十進部分参照付きから英数字への転記は左詰めであることが求まる。
【００６５】
ステップＳ１５では，Ａ，Ｂが転記／比較可能な組み合わせかどうかを判断する。Ａ，Ｂが転記／比較が可能な組み合わせであれば，ステップＳ１６の処理へ進み，Ａ，Ｂが転記／比較が可能な組み合わせでなければ，処理を終了する。
【００６６】
ステップＳ１６では，転記／比較の種別＠が左詰めであるかどうかを判断し，種別＠＝左詰めであればステップＳ１７の処理へ進み，種別＠＝左詰めでなければステップＳ２０の処理へ進む。
【００６７】
ステップＳ１７では，ａｒｌ＜＝ｂｒｌであるかどうかを判断し，ａｒｌ＜＝ｂｒｌであればステップＳ１８の処理へ進み，ａｒｌ＞ｂｒｌであればステップＳ１９の処理へ進む。
【００６８】
ステップＳ１８では，レイアウト情報を算出する。レイアウト情報を「変数（先頭位置，長さ）」と表すと，左詰めで代入先が大きいことから，レイアウト情報は，Ａ（ａｒｆ，ａｒｌ），Ｂ（ｂｒｆ，ａｒｌ）となる。したがって，この例では，ＩＤ（３，４），ＹＭＤ（１，４）が求まる。
【００６９】
ステップＳ１９では，左詰めで代入元が大きい場合のレイアウト情報を算出する。レイアウト情報は「Ａ（ａｒｆ，ｂｒｌ），Ｂ（ｂｒｆ，ｂｒｌ）」となる。
【００７０】
ステップＳ２０では，種別＠＝右詰めの場合に，図５に示す処理１を行い，種別＠＝小数点位置合わせの場合に，図６に示す処理２を行う。
図５は，処理１の処理フローチャートの例である。
【００７１】
ステップＳ２０で，種別＠＝右詰めと判断された場合に，ステップＳ２１以降の処理を行う。
ステップＳ２１では，ａｒｌ＜＝ｂｒｌかどうかを判断する。ａｒｌ＜＝ｂｒｌである場合にはステップＳ２２の処理へ進み，ａｒｌ＞ｂｒｌである場合にはステップＳ２３の処理へ進む。
【００７２】
ステップＳ２２では，右詰めで代入先が大きい場合のレイアウト情報を算出する。レイアウト情報は「Ａ（ａｒｆ，ａｒｌ），Ｂ（ｂｒｆ＋ｂｒｌ−ａｒｌ，ａｒｌ）」となる。
【００７３】
ステップＳ２３では，右詰めで代入元が大きい場合のレイアウト情報を算出する。レイアウト情報は「Ａ（ａｒｆ＋ａｒｌ−ｂｒｌ，ｂｒｌ），Ｂ（ｂｒｆ，ｂｒｌ）」となる。
【００７４】
図６は，処理２の処理フローチャートの例である。
ステップＳ２０で，種別＠＝小数点位置合わせと判断された場合に，ステップＳ３１以降の処理を行う。
【００７５】
ステップＳ３１では，ａｄ＜ｂｄかどうかを判断する。ａｄ＜ｂｄである場合にはステップＳ３２の処理へ進み，ａｄ＜ｂｄでない場合にはステップＳ３５の処理へ進む。
【００７６】
ステップＳ３２では，ａｉ＜ｂｉかどうかを判断する。ａｉ＜ｂｉである場合にはステップＳ３３の処理へ進み，ａｉ＜ｂｉでない場合にはステップＳ３４の処理へ進む。
【００７７】
ステップＳ３３では，レイアウト情報を算出する。レイアウト情報は「Ａ，Ｂ（１＋ｂｄ−ａｄ，ａｄ＋ａｉ）」となる。
ステップＳ３４では，レイアウト情報を算出する。レイアウト情報は「Ａ（１，ａｄ＋ｂｉ），Ｂ（１＋ｂｄ−ａｄ，ａｄ＋ｂｉ）」となる。
【００７８】
ステップＳ３５では，ａｉ＜ｂｉかどうかを判断する。ａｉ＜ｂｉでない場合にはステップＳ３６の処理へ進み，ａｉ＜ｂｉである場合にはステップＳ３７の処理へ進む。
【００７９】
ステップＳ３６では，レイアウト情報を算出する。レイアウト情報は「Ａ（１＋ａｄ−ｂｄ，ｂｄ＋ｂｉ），Ｂ」となる。
ステップＳ３７では，レイアウト情報を算出する。レイアウト情報は「Ａ（１＋ａｄ−ｂｄ，ｂｄ＋ａｉ），Ｂ（１，ｂｄ＋ａｉ）」となる。
【００８０】
図７は，図１に示す多ドメイン変数抽出手段１２の処理フローチャートとデータ構造の例を示す図である。
ステップＳ４１では，ステップＳ４２以降の処理をプログラム内の全実行文に対して繰り返し，全実行文について処理したならば終了する。
【００８１】
ステップＳ４２では，プログラム内から実行文Ａを取る。
ステップＳ４３では，実行文Ａが多ドメイン変数を利用している文かどうかを判断する。実行文Ａが多ドメイン変数かどうかは，プログラム言語によって決まる。実行文Ａが多ドメイン変数でない場合，ステップＳ４２による次の実行文Ａの処理に移る。
【００８２】
ステップＳ４４では，多ドメインを表している変数＊を抽出し，多ドメイン変数情報表（多ドメイン変数テーブルＴ）に保存する。この例では，Ｒ１，Ｒ２，Ｒ３，Ｒ４，…の変数が，多ドメイン変数として抽出されている。
【００８３】
ステップＳ４５では，ユーザが多ドメイン変数テーブルＴを見て，同一ドメインとして扱いたい変数，すなわち通常の変数として扱いたい変数は外部インタフェースを利用して外し，その結果を多ドメイン変数テーブルＴ’とする。例えば，ユーザが変数Ｒ４を多ドメイン変数として扱いたくない旨を，キーボードやマウスなどの入力装置を用いて指示すると，変数Ｒ４を多ドメイン変数テーブルＴから外す。変数Ｒ４は，他の変数と転記／比較関係があると，同一ドメインとして扱われることになる。
【００８４】
ステップＳ４５では，ドメイン分析手段１９により，ドメイン分析処理を行う。多ドメイン変数情報１３，解析対象プログラム情報１１，変数内部レイアウト解析手段１８の解析結果を利用して，プログラム中の変数または変数内部要素が同じドメインを表現するかどうかを分析し，それによって分類した情報を変数分類表２０に出力する。
【００８５】
図８〜図１０は，本発明によるドメイン抽出の例を説明するためのＣＯＢＯＬによる入力プログラムの例を示す図であり，図１１は，この入力プログラムに対する先の関連発明によるドメイン抽出結果と，本発明によるドメイン抽出結果の例を比較する図である。
【００８６】
例えば図８〜図１０に示すようなＣＯＢＯＬプログラムを，図１３に示す先の関連発明（特願平８−９９７４５号）のプログラム解析装置８により解析し，変数をドメインに分類すると，各ドメインの抽出結果は図１１（Ａ）のようになる。同じ図８〜図１０に示すＣＯＢＯＬプログラムを，本発明に係る図１に示すプログラム解析装置１によって解析すると，各ドメインの抽出結果は図１１（Ｂ）のようになる。
【００８７】
先の関連発明よれば，受注エントリ，受注マスタ，在庫マスタレコードは，それぞれ印刷エリアとの間で転記関係があるので，同じドメインに分類されているが，本発明によれば，受注エントリ，受注マスタ，在庫マスタレコードは，異なるドメインに分類される。
【００８８】
特に，本発明では，多ドメイン変数である「印刷エリア」に多ドメイン変数であることを示すマーク「＊」を付けて出力する。これにより，受注エントリ，受注マスタ，在庫マスタレコードが，印刷エリアに対して共通の転記関係があることがわかる。
【００８９】
また，先の関連発明よれば，オーダ番号Ｅ，オーダ番号ＥＭ，数値エリア，納入予定年月日ＥＭ，納入予定年月日Ｅ，受注年月日ＥＭ，受注年月日Ｅが，数値エリアの利用により，同じドメインに分類されているが，本発明によれば，数値エリアについての部分転送が考慮されるため，「オーダ番号Ｅ，オーダ番号ＥＭ，数値エリア（３，１０）」と「納入予定年月日ＥＭ，納入予定年月日Ｅ，受注年月日ＥＭ，受注年月日Ｅ，数値エリア（１３，８）」とが別ドメインになっている。
【００９０】
また，本発明によれば，受注数量ＥＭおよび受注量Ｅと同一ドメインになるのが，未引当在庫数量ＳＭおよび引当済在庫数量ＳＭの一部であることが，ドメイン抽出結果からわかる。
【００９１】
以上のように，先の関連発明に比較して，本発明による処理によれば変数内部要素についても精度よくドメインを分類することが可能になる。
【００９２】
【発明の効果】
変数をドメインで自動的に分類することは，特定の意味を持つ変数を参照したり，修正する場合に不可欠であり，プログラムのメンテナンス作業を助けるものである。本発明によれば，高い精度でドメインを分類することが可能になる。したがって，先の関連発明で用いているような変数の制約条件抽出技術と組み合わせることにより，精度の高いドメイン定義情報の抽出も可能となる。
【００９３】
特に，本発明によれば，変数データの部分転送や比較，あるいは集団項目の転送で生ずる長さや位置の異なる変数間の転送においても同一ドメイン分析ができる。
【００９５】
また，本発明によれば，いわばバッファとして用いられるような変数と転送関係にある変数群について，マークが付加された変数の介在により同一ドメインとして把握することも，またそれぞれ異なるドメインとして把握することも可能になる。
【００９６】
また，本発明によれば，多ドメイン変数として扱わないほうがいい変数について，事前に取り除くことができ，広いドメインの分類が可能になる。
【図面の簡単な説明】
【図１】本発明の構成例を示す図である。
【図２】本発明の実施の形態における処理フローチャートとデータ構造の例を示す図である。
【図３】文法規則表（テーブル）の例を示す図である。
【図４】変数内部レイアウト解析手段の処理フローチャートとデータ構造の例を示す図である。
【図５】処理１の処理フローチャートの例である。
【図６】処理２の処理フローチャートの例である。
【図７】多ドメイン変数抽出手段の処理フローチャートとデータ構造の例を示す図である。
【図８】入力プログラムの例（１）を示す図である。
【図９】入力プログラムの例（２）を示す図である。
【図１０】入力プログラムの例（３）を示す図である。
【図１１】関連発明によるドメイン抽出結果と本発明によるドメイン抽出結果の例を比較する図である。
【図１２】従来技術の説明図である。
【図１３】関連発明に係るプログラム解析装置の構成例を示す図である。
【図１４】関連発明に係るプログラム解析表示装置の構成例を示す図である。
【図１５】関連発明による分析結果の例を示す図である。
【図１６】長さが異なる変数間の右詰めの転記の場合の関連発明によるドメイン分析例を示す図である。
【図１７】集団項目変数を含む左詰めの転記の場合の関連発明によるドメイン分析例を示す図である。
【図１８】部分参照付き転記からの関連発明によるドメイン分析例を示す図である。
【図１９】関連発明において転送関係にない変数が同一ドメインとなる例を示す図である。
【図２０】関連発明において異なるドメイン変数が同一ドメインとして得られ，ノイズが広がる例を示す図である。
【符号の説明】
１    プログラム解析装置
１１    解析対象プログラム情報
１２    多ドメイン変数抽出手段
１３    多ドメイン変数情報表（テーブル）
１４    変数部分参照解析手段
１５    変数長解析手段
１６    変数型解析手段
１７    文法規則表（テーブル）
１８    変数内部レイアウト解析手段
１９    ドメイン分析手段
２０    変数分類表（テーブル）
【図１】
0003631602.tif 000002
【図２】
0003631602.tif 000003
【図３】
0003631602.tif 000004
【図４】
0003631602.tif 000005
【図５】
0003631602.tif 000006
【図６】
0003631602.tif 000007
【図７】
0003631602.tif 000008
【図８】
0003631602.tif 000009
【図９】
0003631602.tif 000010
【図１０】
0003631602.tif 000011
【図１１】
0003631602.tif 000012
【図１２】
0003631602.tif 000013
【図１３】
0003631602.tif 000014
【図１４】
0003631602.tif 000015
【図１５】
0003631602.tif 000016
【図１６】
0003631602.tif 000017
【図１７】
0003631602.tif 000018
【図１８】
0003631602.tif 000019
【図１９】
0003631602.tif 000020
【図２０】
0003631602.tif 000021