(57)【要約】【課題】  プログラムのレビューを容易にする。【解決手段】  例えばJavaのBigDecimalクラスのmethodを用いて記述されたソースから仕様書を生成する方法であって、算術演算を規定する算術演算文に含まれる算術演算methodについて、予め定められた演算ルールに従った優先度を特定する工程と、算術演算文において複数の算術演算methodが含まれており且つ優先度の高い演算methodのinstanceとして優先度の低い算術演算methodが規定されていると判断した場合、優先度の低い算術演算methodと当該優先度の低い算術演算methodのinstance及び引数とを所定のルールに従って算術演算記号を用いた第1の部分算式に変換し、当該第1の部分算式に対して優先的な演算を行うことを表す()を付し、優先度の高い演算methodと当該優先度の高い演算methodの引数とを所定のルールに従って算術演算記号を用いた第2の部分算式に変換して第1の部分算式と連結する工程とを含む。【選択図】図１
2006139357.tif 000002
【特許請求の範囲】
【請求項１】
算術演算をメソッド形式で記述したソースプログラムから仕様書データを生成する方法であって、
前記ソースプログラムに含まれ且つ算術演算を規定する算術演算文に含まれる算術演算メソッドについて、予め定められた演算ルールに従った優先度を特定し、算術演算メソッドと優先度とを記憶装置に登録する登録ステップと、
前記算術演算文において複数の算術演算メソッドが含まれており且つ優先度の高い演算メソッドのインスタンスとして優先度の低い算術演算メソッドが規定されていると前記記憶装置に格納されているデータに基づき判断した場合には、前記優先度の低い算術演算メソッドと当該優先度の低い算術演算メソッドのインスタンス及び引数とを所定のルールに従って算術演算記号を用いた第１の部分算式に変換し、当該第１の部分算式に対して優先的な演算を行うことを表すカッコを付し、前記優先度の高い演算メソッドと当該優先度の高い演算メソッドの引数とを前記所定のルールに従って算術演算記号を用いた第２の部分算式に変換して前記第１の部分算式と連結する処理を実施することにより仕様書データを生成し、仕様書データ格納部に格納する生成ステップと、
を含み、コンピュータに実行される仕様書データ生成方法。
【請求項２】
前記登録ステップにおいて、
算術演算メソッドについて前記優先度と当該算術演算メソッドのインスタンスに関するデータと当該算術演算メソッドの引数に関するデータとを保持するデータブロックを生成し、前記記憶装置に格納する
ことを特徴とする請求項１記載の仕様書データ生成方法。
【請求項３】
前記生成ステップが、
算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在するか確認するステップと、
算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在する場合には、当該カッコを除去するステップと、
を含む請求項１記載の仕様書データ生成方法。
【請求項４】
請求項１乃至３のいずれか１つ記載の仕様書データ生成方法をコンピュータに実行させるためのプログラム。
【請求項５】
算術演算をメソッド形式で記述したソースプログラムから仕様書データを生成する装置であって、
前記ソースプログラムに含まれ且つ算術演算を規定する算術演算文に含まれる算術演算メソッドについて、予め定められた演算ルールに従った優先度を特定し、算術演算メソッドと優先度とを記憶装置に登録する登録手段と、
前記算術演算文において複数の算術演算メソッドが含まれており且つ優先度の高い演算メソッドのインスタンスとして優先度の低い算術演算メソッドが規定されていると前記記憶装置に格納されているデータに基づき判断した場合には、前記優先度の低い算術演算メソッドと当該優先度の低い算術演算メソッドのインスタンス及び引数とを所定のルールに従って算術演算記号を用いた第１の部分算式に変換し、当該第１の部分算式に対して優先的な演算を行うことを表すカッコを付し、前記優先度の高い演算メソッドと当該優先度の高い演算メソッドの引数とを前記所定のルールに従って算術演算記号を用いた第２の部分算式に変換して前記第１の部分算式と連結する処理を実施することにより仕様書データを生成し、仕様書データ格納部に格納する生成手段と、
を有する仕様書データ生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの仕様書の自動生成技術に関する。
【背景技術】
【０００２】
例えばＪａｖａ（Sun Microsystems社の商標）により書かれたプログラムのレビューは、ＣＯＢＯＬ等のプログラムに比べると困難な場合が多い。これは、Ｊａｖａに対するレビュアのスキルの問題もあるが、ＣＯＢＯＬでは数式や構文で表されるものが、メソッドの呼び出しになるため見づらくなっているという点もある。例えばＣＯＢＯＬでは、WK_OUTOUBI ＞ XHIAWYEIDT と書かれるものが、wk_x16.getWK_OUTOUBI().isGreaterThan(xhiarxhi.getXHIAWYEIDT()) となるため、可読性が損なわれている。また、オブジェクト生成、ＥＪＢ（Enterprize Java Beans）初期化などレビューとは無関係の処理が多く記述されているため、これもレビューの効率化の妨げになっている。
【０００３】
なお、仕様書の自動生成については例えば特開平６−１４９５５１号公報に開示されている。すなわち、入力されたプログラムの構文を解析し、構文構造とデータ属性を得ると共に、そのデータ・フローを解析してデータ・フロー情報を得る。また、プログラム中の一時変数の変数名を検出し、それらの一時変数と包含関係にあるデータを検出する。ついで、上記一時変数の参照箇所からデータの包含関係によって関連する変数の設定箇所までのデータ・フローをたどり、一時変数の用途（計算の中間結果保持、型変換、分割、合成等）を判別し、消去可能な一時変数を消去する。一時変数が消去された中間表現は自然言語記述に置き換えられ、仕様書を得るものである。但し、上で述べたようなオブジェクト指向言語の問題などについては考慮されていない。
【特許文献１】特開平６−１４９５５１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
従来技術では、Ｊａｖａなどのプログラム言語で書かれたプログラムのレビューが困難であるという問題については何ら解決策が示されていない。
【０００５】
従って、本発明の目的は、Ｊａｖａなどのプログラム言語で書かれたプログラムのレビューを容易にするための仕様書自動生成技術を提供することである。
【課題を解決するための手段】
【０００６】
本発明に係る方法は、算術演算をメソッド形式で記述したソースプログラム（例えばＪａｖａのBigDecimalクラスのメソッドを用いて記述されたソースプログラム）から仕様書データを生成する方法であって、ソースプログラムに含まれ且つ算術演算を規定する算術演算文に含まれる算術演算メソッドについて、予め定められた演算ルールに従った優先度を特定し、算術演算メソッドと優先度とを記憶装置に登録する登録ステップと、算術演算文において複数の算術演算メソッドが含まれており且つ優先度の高い演算メソッドのインスタンスとして優先度の低い算術演算メソッドが規定されていると記憶装置に格納されているデータに基づき判断した場合には、優先度の低い算術演算メソッドと当該優先度の低い算術演算メソッドのインスタンス及び引数とを所定のルールに従って算術演算記号を用いた第１の部分算式に変換し、当該第１の部分算式に対して優先的な演算を行うことを表すカッコを付し、優先度の高い演算メソッドと当該優先度の高い演算メソッドの引数とを所定のルールに従って算術演算記号を用いた第２の部分算式に変換して第１の部分算式と連結する処理を実施することにより仕様書データを生成し、仕様書データ格納部に格納する生成ステップとを含む。
【０００７】
例えば金融等における数式に使われる例えばＪａｖａのBigDecimalクラスでは、全ての演算がメソッド呼び出しとなり、そのままでは非常にレビューしにくい記述となっている。そして、BigDecimalクラスのメソッドを使用して記述した算術演算文について単純な変換を行うのでは演算子（＋や×）の優先順位は保持されなくなるので、正しい処理が行われているかレビューすることは困難である。従って上で述べた処理を実施することにより、算術演算文の正しい内容をレビュアに分かりやすい形式で提示することができるようになる。
【０００８】
また、上で述べた登録ステップにおいて、算術演算メソッドについて優先度と当該算術演算メソッドのインスタンスに関するデータと当該算術演算メソッドの引数に関するデータとを保持するデータブロックを生成し、記憶装置に格納するようにしてもよい。インスタンス及び引数が算術演算メソッドを用いて記述されている場合もあり、その場合には当該インスタンス及び引数についてもデータブロックが構成され、元の算術演算メソッドについてのデータブロックから参照することができるようになっている場合もある。また、引数及びインスタンスが算術演算メソッドを用いて記述されていない場合であっても後に処理のためにデータブロックが生成される場合もある。
【０００９】
さらに、上で述べた生成ステップが、変数名と当該変数名の意味を表す語句とが対応付けられて登録されている第１の辞書を参照し、第１の部分算式及び第２の部分算式に含まれる変数を対応する語句に置換するステップを含むようにしてもよい。よりレビュアが仕様書を読み易くなる。
【００１０】
また、ソースプログラムを解析して、処理文と当該処理文に関連する条件とを特定し、対応付けて仕様書データ格納部に格納するステップをさらに含むようにしてもよい。その場合、上で述べた登録ステップが、算術演算文である処理文及び条件について実施されるようにしてもよい。
【００１１】
さらに、上で述べた生成ステップが、算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在するか確認するステップと、算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在する場合には、当該カッコを除去するステップとを含むようにしてもよい。このような処理を実施することにより、より正確な算式を表現できるようになる。
【００１２】
また、上で述べた生成ステップが、変数の値の意味を表す語句が登録されている第２の辞書を参照し、特定の変数の特定の値に対応する語句を抽出し、特定の変数の特定の値に対応して仕様書データ格納部に格納するステップを含むようにしてもよい。例えば、ABCという変数が１になった場合という条件が規定されている場合、「１」という意味が何であるかよく分からない場合に、レビューが困難になることがあるためである。
【００１３】
さらに、上で述べた引数に関するデータが、引数が式であるか否かを表すデータを含むようにしてもよい。その際、上で述べた生成ステップが、データブロックを参照して、算術演算メソッドの引数が式であるか判断するステップと、引数が式であると判断された場合には、当該式を所定のルールに従って算術演算記号を用いた第３の部分算式に変換し、当該第３の部分算式に対してカッコを付すステップとを含むようにしてもよい。引数も式である場合には演算子の優先度を考慮する必要がある場合もあるためである。
【００１４】
本発明に係る仕様書データ生成方法をコンピュータに実行させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等の記憶媒体又は記憶装置に格納される。また、ネットワークを介してディジタル信号にて頒布される場合もある。なお、処理途中のデータについては、コンピュータのメモリ等の記憶装置に一時保管される。
【発明の効果】
【００１５】
本発明によれば、Ｊａｖａなどのプログラム言語で書かれたプログラムのレビューを容易にすることができるようになる。
【発明を実施するための最良の形態】
【００１６】
図１に本発明の一実施の形態に係る仕様書データ生成装置の機能ブロック図を示す。仕様書データ生成装置１０は、仕様書を生成する対象となるソースプログラムを格納するソースプログラム格納部１と、ソースプログラムのパースなどを実施する構文解析部２と、構文解析部２の処理結果を格納する構文解析結果格納部３と、構文解析結果格納部３に格納されたデータを表形式のデータに変換する表変換部４と、変数と変数の意味を表す語句との対応関係が登録された語句辞書８と、変数と変数の値とその意味を表す語句との対応関係が登録されたコード辞書９と、表変換部４などの処理結果を格納する表データ格納部５と、表データ格納部５に格納されたデータを用いて以下で詳細に述べる算術演算式の変換処理を実施する式変換部６と、式変換部６における中間データであるデータブロック群を格納するデータブロック格納部７とを有する。語句辞書８及びコード辞書９とは、表変換部４と式変換部６において用いられる。
【００１７】
次に、図１に示した仕様書データ生成装置１０の処理フローを図２乃至図１９を用いて説明する。まず、構文解析部２は、ソースプログラム格納部１から処理対象となるソースプログラムを読み出し、パース処理を含む周知の構文解析処理を実施し、処理結果を構文解析結果格納部３に格納する（ステップＳ１）。次に、表変換部４は、構文解析結果格納部３に格納されたデータを用い、語句辞書８及びコード辞書９を参照して表変換処理を実施する（ステップＳ３）。この表変換処理については、後に詳しく述べる。表変換の処理結果は、表データ格納部５に格納される。そして、式変換部６は、表データ格納部５に格納されたデータを用い、語句辞書８及びコード辞書９を参照して式変換処理を実施する（ステップＳ５）。この式変換処理についても、後に詳しく述べる。式変換処理の結果は表データ格納部５に格納する。
【００１８】
次に、図３乃至図６を用いて表変換処理について説明する。まず、表変換部４は、構文解析結果格納部３を参照して、未処理の１行を読み出す（ステップＳ１１）。そして、読み出された行が条件文であるか判断する（ステップＳ１３）。ここではｉｆ文などであるかを確認する。もし、条件文であると判断された場合には、条件文抽出処理を実施する（ステップＳ１５）。抽出された条件文のデータは、一旦メインメモリ等の記憶装置に格納される。一方、条件文であると判断されなかった場合には読み出された行は何らかの処理文を含み、又読み出された行が条件文である場合には当該条件文に関連する処理文が存在するので、当該処理文の抽出処理を実施する（ステップＳ１７）。抽出された処理文のデータは、一旦メインメモリ等の記憶装置に格納される。そして、ステップＳ１５及びステップＳ１７で抽出された条件文及び処理文に関連してコメント文が存在する場合には、当該コメント文の抽出処理を実施する（ステップＳ１９）。抽出されたコメント文のデータは、一旦メインメモリ等の記憶装置に格納される。また、抽出された条件文、処理文及びコメント文の行番号の抽出処理を実施する（ステップＳ２１）。抽出された行番号は、一旦メインメモリ等の記憶装置に格納される。
【００１９】
そして、表変換処理部４は、例えばメインメモリに格納された抽出データにより表を構成して、表データ格納部５に格納する（ステップＳ２３）。そして、全ての文を処理したか判断し（ステップＳ２５）、未処理の文が存在すればステップＳ１１に戻る。そして、全ての文について処理した場合には、元の処理に戻る。
【００２０】
例えば以下のようなＪａｖａのソースプログラム（一部のみ）を処理する場合について説明する。
３  if (in_param.getRETURNCODE() == 0) {
４            out_param.setNISSU(in_param.getNISSU());
５        } 
この例の場合条件文は、”in_param.getRETURNCODE()==0”であり、処理文は”out_param.setNISSU(in_param.getNISSU())”である。なお、左端の数字は行番号であるが、実際のプログラムには含まれておらず、ここでは参照のために示している。このような場合には、例えばステップＳ２３の段階で、図４（ａ）に示すようなデータが保持される。図４（ａ）の例では、項番、行番号（処理の行番号及び条件の行番号）、処理、条件１（条件が複数関係する場合は条件２、条件３と続く）及び備考（コメント文用）の列が用意され、処理文と、関連する条件文と、それぞれの行番号が登録されている。
【００２１】
なお、ステップＳ２３において、本実施の形態の最後に述べる変換ルールに従って図４（ａ）をさらに変換して、図４（ｂ）に示すようなデータを格納するようにしても良い。すなわち、”out_param.setNISSU(in_param.getNISSU())”を”out_param.NISSU=in_param.NISSU”に、”in_param.getRETURNCODE()==0”を”in_param.RETURNCODE=0”に変換する。さらに、語句辞書８及びコード辞書９を参照して、変数の語句変換を行ってもよい。以下で説明する式変換処理は、主にBigDecimalクラスのメソッドの処理になるので、ステップＳ２３において明らかにBigDecimalクラスのメソッドが関係無いと判断された処理文及び条件文について、簡単な変換処理を実施するものである。例えば図４（ｃ）に示すように、語句辞書８を用いて変数を当該変数の意味を表す語句に変換するものである。語句辞書８には、例えば図５に示すようなデータが保持されている。すなわち変数名とその意味を示す語句データである。従って、”in_param”が「入力領域」に、”RETURNCODE”が「復帰値」に、”out_param”が「出力領域」に、”NISSU”が「日数」にそれぞれ変換される。なお、コード辞書９についても用いられる場合もある。コード辞書９は、例えば図６に示すようなデータを保持している。すなわち、変数名と当該変数の値とその意味を表すデータとを含む。従って、該当する変数名及びその値との組み合わせが特定されると、その意味を表すデータも表に登録する。
【００２２】
次に、式変換処理について図７を用いて説明する。まず、式変換部６は、表における未処理セル（処理及び条件の行についての未処理セル）を１つ特定する（ステップＳ３１）。そして、当該セルに含まれる文について、BigDecimalクラスのメソッドが規定されているか判断する（ステップＳ３３）。もし、BigDecimalクラスのメソッドが規定されていると判断された場合には、セルに含まれる文について演算解析処理を実施する（ステップＳ３５）。この処理については後に説明するが、セルに含まれる文についてのデータブロック群を生成し、データブロック格納部７に格納する。そして、データブロック格納部７に格納されたデータを用いて変換処理を実施する（ステップＳ３７）。この処理については後に説明するが、通常の演算子を用いた算術演算式をセルに格納する。なお、この際に、語句辞書８及びコード辞書９を用いた置換処理もあわせて実施する。一方、ステップＳ３３でBigDecimalクラスのメソッドが規定されていないと判断された場合には、本実施の形態の最後に述べる変換ルールに従って通常の文字列変換処理を実施し、生成されたデータをセルに格納する（ステップＳ４５）。
【００２３】
そして、ステップＳ３７又はＳ４５の後に、セル内の算術演算式に不要カッコが存在するか確認する処理を実施する（ステップＳ３９）。もし、セル内の算術演算式に不要カッコが存在すると判断された場合には、当該不要カッコ除去処理を実施する。例えば、カッコ内が変数又は定数のみである場合にはそのカッコは不要であるから除去する（ステップＳ４１）。例えば、”c.multiply(a).add(b)”という式（又は部分式）がセルに含まれている場合、変換処理により”ｃ＊（ａ）＋（ｂ）”というように変換してしまう場合もある。そうした場合には、（ａ）の（）と（ｂ）の（）は不要であるから、削除する。また、（（ａ＋ｂ））＊ｃといった部分式が得られた場合も、（（ａ＋ｂ））の外側の（）については不要であるからこれを除去する。除去後のデータを表のセルに保存する。このように、（１）変数又は定数のみを囲っているカッコ、（２）カッコ以外の文字列を囲っていないカッコについては不要であり削除する。もし、不要なカッコが存在しないと判断された場合及びステップＳ４１の後に、表において全てのセルについて処理したか判断する（ステップＳ４３）。もし未処理のセルが存在している場合にはステップＳ３１に戻る。一方、未処理のセルがない場合には元の処理に戻る。
【００２４】
次に、演算解析処理（図７：ステップＳ３５）について図８乃至図１３を用いて説明する。まず、式変換部６は、処理対象の式部分（図７のステップＳ３５において呼び出される場合には式全体であるが、本演算解析処理は再帰的に呼び出されるのでその場合には処理対象の式部分となる）におけるBigDecimalクラスのメソッドについてデータブロックを生成する（ステップＳ５０）。データブロック格納部７に領域を確保する。データブロックは、例えば図９に示すようなデータ領域である。すなわち、メソッド名（又は式）の領域と、インスタンスデータの領域と、引数データの領域と、優先順位の領域と、引数が式か否かを表すフラグの領域とを含む。メソッド名の領域には、呼び出されたメソッドの名前などが格納され、インスタンスデータの領域には、インスタンスがメソッドでない場合にはインスタンスのデータ名が格納され、インスタンスがメソッドである場合には当該インスタンスのメソッドについてのデータブロックへのポインタ（又は当該データブロックそのもの）が格納され、引数データの領域には、引数が式でない場合にはデータ名が格納され、引数が式である場合には当該引数についてのデータブロックへのポインタ（又は当該データブロックそのもの）が格納され、優先順位の領域には、BigDecimalクラスのメソッドについて対応する演算子の優先順位が格納され、引数が式か否かを表すフラグについては当該メソッドの引数が式であれば例えば「１」がそうでなければ「０」が格納される。なお、本例では、図７のステップＳ３５以外で本演算解析処理が呼び出された場合には、当該データブロックの先頭アドレスを、呼出元の処理に応じてインスタンスデータの領域又は引数の領域に登録するものとする。
【００２５】
また、メソッド呼び出しは、インスタンス部、メソッド名及び引数の３つの部分から構成される。例えば data1.add(data2) というメソッド呼び出しの場合、インスタンス部はdata1であり、メソッド名はaddであり、引数はdata2である。さらにメソッド呼び出しが連続する場合、例えばdata1.add(data2).multiply(data4) というメソッド呼び出しの場合、メソッドmultipyについてのインスタンスはdata1.add(data2)であり、引数はdata4であり、メソッドaddについてのインスタンスはdata1であり、引数はdata2である。
【００２６】
そして、処理対象の式部分がBigDecimalクラスのメソッド呼び出しであるか判断する（ステップＳ５１）。図７のステップＳ３３でBigDecimalクラスのメソッド呼び出しであるか確認されているので、図７のステップＳ３５において呼び出される場合には重複するが、本演算処理は再帰的に呼び出される処理であるため、本ステップが必要となる。
【００２７】
もし、BigDecimalクラスのメソッド呼び出しであると判断された場合には、インスタンス解析処理を実施する（ステップＳ５３）。この処理については後に説明するが、インスタンス解析処理においても本演算解析処理は呼び出される。次に、処理対象の部分式のメソッド名を取得し、当該メソッドのためのデータブロックのメソッド名の領域に設定する（ステップＳ５５）。また、当該メソッドのメソッド優先度を取得し、優先順位の領域に設定する（ステップＳ５７）。メソッドの優先順位は、図１０に示すようなものである。すなわち、pow＞multiply又はdivide＞add又はsubtratとなるように優先順位が予め定められている。これは通常の演算における優先順位を表している。さらに、引数解析処理を実施する（ステップＳ５９）。この処理については後に説明するが、引数解析処理においても本演算解析処理は呼び出される。そして元の処理に戻る。
【００２８】
一方、ステップＳ５１において、処理対象の式部分においてBigDecimalクラスのメソッドが呼び出されていない場合には、BigDecimalクラス以外のクラスが呼び出されているか確認する（ステップＳ６１）。もし、メソッド呼び出しがあれば、インスタンス解析処理を実施し（ステップＳ６３）、当該メソッドのメソッド名を取得し、当該メソッドのためのデータブロックのメソッド名の領域に設定する（ステップＳ６５）。さらに、当該メソッドのための引数解析処理を実施する（ステップＳ６７）。ステップＳ６３はステップＳ５３と同じ処理であり、ステップＳ６７はステップＳ５９と同じ処理である。そして元の処理に戻る。
【００２９】
また、ステップＳ６１でメソッド呼び出しではないと判断された場合には、本実施の形態の最後に述べるような通常の文字列変換処理を実施し、処理対象の式部分のデータブロックのメソッド名の部分に、文字列を登録する（ステップＳ６９）。そして元の処理に戻る。
【００３０】
次に図１１を用いてインスタンス解析処理について説明する。式変換部６は、処理対象のインスタンスにメソッド呼び出しが含まれるか判断する（ステップＳ７１）。もし、処理対象のインスタンスにメソッド呼び出しが含まれない場合には、インスタンス名を取得し、処理対象の部分式のデータブロックにおけるインスタンスデータの領域に設定する（ステップＳ７３）。そして元の処理に戻る。一方、メソッド呼び出しが含まれると判断された場合には、当該メソッドについて図８の演算解析処理を実施する（ステップＳ７５）。そして元の処理に戻る。このようにして、インスタンスにメソッド呼び出しが存在する場合には、データブロックの連鎖が形成されてゆく。
【００３１】
次に図１２を用いて引数解析処理を説明する。式変換部６は、処理対象の引数が式であるか判断する（ステップＳ８１）。本判断結果は、データブロックにおいて、引数が式か否かを表すフラグとしてセットされる。もし、処理対象の引数が式ではない場合には、引数名を取得し、処理対象の部分式のデータブロックにおける引数データの領域に設定する（ステップＳ８３）。そして元の処理に戻る。一方、引数が式であると判断された場合には、当該引数について図８の演算解析処理を実施する（ステップＳ８５）。そして元の処理に戻る。このようにして、引数が式である場合には、データブロックの連鎖が形成されてゆく。
【００３２】
ここで演算解析処理について具体例を用いて説明する。
data1.add(data2.method1()).subtract(data3.dat4).multiply(data5)
という算術演算式が処理対象となっている場合を考える。
【００３３】
まず、ステップＳ５０でメソッドmultiply用のデータブロックが生成される。例えば図１３に示すようにデータブロック１３０１が生成される。そして、ステップＳ５１でメソッドmultiplyがBigDecimalクラスのメソッド呼び出しであることが確認されるので、ステップＳ５３でインスタンス解析処理を実施する。インスタンス解析処理では、ステップＳ７１でインスタンスがメソッド呼び出しであるか確認され、メソッドsubtractが存在するため、ステップＳ７５においてメソッドsubtractについての演算解析処理を実施することになる。
【００３４】
そうすると、ステップＳ５０においてメソッドsubtractについてのデータブロック１３０２（図１３）が生成される。なお、データブロック１３０１のインスタンスデータの領域には、データブロック１３０２へのポインタが設定される。メソッドsubtractはBigDecimalクラスのメソッド呼び出しであることが確認されるので、ステップＳ５３でインスタンス解析処理を実施する。インスタンス解析処理では、ステップＳ７１でインスタンスがメソッド呼び出しであるか確認され、メソッドaddが存在するため、ステップＳ７５においてメソッドaddについての演算解析処理を実施することになる。
【００３５】
そうすると、ステップＳ５０においてメソッドaddについてのデータブロック１３０３（図１３）が生成される。なお、データブロック１３０２のインスタンスデータの領域には、データブロック１３０３へのポインタが設定される。メソッドaddはBigDecimalクラスのメソッド呼び出しであることが確認されるので、ステップＳ５３でインスタンス解析処理を実施する。インスタンス解析処理では、ステップＳ７１でインスタンスがメソッド呼び出しではないと判断されるので、ステップＳ７３でインスタンス名”data1”を取得し、データブロック１３０３のインスタンスデータの領域に格納する。次に、ステップＳ５５においてメソッド名addを取得して、データブロック１３０３のメソッド名の領域に格納する。また、ステップＳ５７においてメソッドaddに対応するメソッド優先度を取得して、データブロック１３０３の優先順位の領域に優先度「３」（図１０参照）を設定する。その後ステップＳ５９で引数解析処理を実施する。引数解析処理では、ステップＳ８１でメソッドaddの引数が式であるか判断され、ここではadd2.method1()というメソッドを用いた式であると判断して、ステップＳ８５で当該引数についての演算解析処理を実施する。なお、ここでデータブロック１３０３の引数が式か否かを表すフラグを１にセットする。
【００３６】
そうすると、ステップＳ５０においてメソッドmethod1についてのデータブロック１３０４（図１３）が生成される。なお、データブロック１３０３の引数データの領域には、データブロック１３０４へのポインタが設定される。ステップＳ５１でメソッドmethod1はBigDecimalクラスのメソッド呼び出しではないと判断されるので、ステップＳ６１に移行し、さらにメソッド呼び出しであるか判断される。メソッドmethod1はメソッド呼び出しであるから、ステップＳ６３でインスタンス解析処理を実施する。インスタンス解析処理では、ステップＳ７１でインスタンスがメソッド呼び出しであるか確認され、”data2”であるからメソッド呼び出しではないと判断され、ステップＳ７３においてインスタンス名”data2”が取得され、データブロック１３０４のインスタンスデータの領域に設定される。次に、ステップＳ６５においてメソッド名method1が取得され、データブロック１３０４のメソッド名の領域に設定される。さらに、ステップＳ６７において引数解析処理を実施する。引数解析処理では、ステップＳ８１でメソッドmethod1の引数が式であるか判断され、ここでは空であるから、ステップＳ８３で何も設定せずにメソッドmethod1についての引数解析処理を終了する。なお、ここではデータブロック１３０４の引数が式か否かを表すフラグを０にセットする。
【００３７】
ここでメソッドaddの引数解析処理が完了したことになり、メソッドsubtractのインスタンス解析処理も完了したことになる。すなわち、メソッドsubtractについてのステップＳ５３まで完了したことになる。そうすると、ステップＳ５５においてメソッドsubtractのメソッド名が取得され、データブロック１３０２のメソッド名の領域に設定される。さらに、ステップＳ５７においてメソッドsubtractに対応するメソッド優先度を取得して、データブロック１３０２の優先順位の領域に優先度「３」（図１０参照）を設定する。その後ステップＳ５９でメソッドsubtractの引数解析処理を実施する。引数解析処理では、ステップＳ８１でメソッドsubtractの引数が式であるか判断され、ここではdata3+data4であるから式であると判断して、ステップＳ８５で当該引数についての演算解析処理を実施する。なお、ここでデータブロック１３０２の引数が式か否かを表すフラグを１にセットする。
【００３８】
そうすると、ステップＳ５０において引数data3+data4についてのデータブロック１３０５が生成される。なお、データブロック１３０２の引数データの領域には、データブロック１３０５へのポインタが設定される。ステップＳ５１で引数data3+data4はBigDecimalクラスのメソッド呼び出しではないと判断され、さらにステップＳ６１でメソッドでもないと判断される。従ってステップＳ６９で引数についての文字列変換処理が実施され、”data3+data4”がデータブロック１３０５のメソッド名の領域に設定される。
【００３９】
これでメソッドsubtractの引数解析処理が完了することになり、メソッドmultiplyのインスタンス解析処理も完了したことになる。すなわち、メソッドmultiplyについてのステップＳ５３まで完了したことになる。そうすると、ステップＳ５５においてメソッドmultiplyのメソッド名が取得され、データブロック１３０１のメソッド名の領域に設定される。さらに、ステップＳ５７においてメソッドmultiplyに対応するメソッド優先度を取得して、データブロック１３０１の優先順位の領域に優先度「２」（図１０参照）を設定する。その後ステップＳ５９でメソッドmultiplyの引数解析処理を実施する。引数解析処理では、ステップＳ８１でメソッドmultiplyの引数が式であるか判断され、ここではdata5であるから式ではないと判断して、ステップＳ８３において当該引数をデータブロック１３０１の引数データの領域に設定する。なお、ここでデータブロック１３０１の引数が式か否かを表すフラグを０にセットする。
【００４０】
以上のような処理実施することにより、図１３に示すようなデータブロックが連鎖するデータ構造が生成されるようになる。データブロックの連鎖は、表データ格納部５の表のセルに対応付けられている。
【００４１】
なお、図８乃至図１３を用いて説明した処理は、表のセルの１つのメソッド、又は１つのセルに複数の項が存在する場合には１つの項についての処理であり、１つのセルについて複数回上で述べたような処理を実施しなければならない場合もある。
【００４２】
次に、図１４乃至図１７を用いて変換処理（図７：ステップＳ３７）を説明する。まず、式変換部６は、データブロック格納部７における未処理先頭データブロックを特定する（ステップＳ９１）。そして、当該先頭データブロックから連鎖するデータブロック群についての部分式変換処理を実施する（ステップＳ９３）。この処理については後に述べる。そして、全てのデータブロックについて処理したか判断する（ステップＳ９５）。もし、未処理のデータブロックが存在する場合にはステップＳ９１に戻り、全てのデータブロックについての処理が完了していれば、元の処理に戻る。
【００４３】
図１５を用いて部分式変換処理を説明する。まず、式変換部６は、データブロックの処理対象の領域のデータ（メソッド名の領域又は引数データの領域のデータ）を読み出す（ステップＳ１０１）。そして、読み出したメソッド名などが、BigDecimalクラスのメソッドであるか判断する（ステップＳ１０３）。もし、BigDecimalクラスのメソッドであると判断された場合には、当該メソッドのインスタンスにおけるメソッドの優先順位が自メソッドの優先順位より低いか判断する（ステップＳ１０５）。例えば図１３に示すようなデータブロック群の基となる算術演算式では、左から見るとメソッドsubtractの次にメソッドmultiplyが示されているが、実際の演算はメソッドmultiplyの引数とメソッドsubtractによる演算を含むメソッドmultiplyのインスタンス全体との掛け算を表している。従って、通常の算術演算式に直すのであれば、演算子の優先順位に従って、インスタンス全体をカッコでくくらなければならない。但し、掛け算より優先度が高くない引き算又は足し算、すなわちmultiplyの代わりにsubtractやaddであればカッコは不要となる。そこで、先頭のデータブロック１３０１の優先順位の領域の値と、インスタンスデータの領域により参照されるデータブロック１３０２の優先順位の領域の値とを比較する。
【００４４】
もし、当該メソッドのインスタンスにおけるメソッドの優先順位が自メソッドの優先順位より低い場合には、開きカッコを展開し、登録する（ステップＳ１０７）。例えば表データ格納部５における処理対象セルに、「（」と格納する。そしてステップＳ１０９に移行する。一方、当該メソッドのインスタンスにおけるメソッドの優先順位が自メソッドの優先順位以上である場合には、第２インスタンス変換処理を実施する（ステップＳ１０９）。第２インスタンス変換処理については後に説明する。そして、開きカッコを展開したか判断する（ステップＳ１１１）。ステップＳ１０７を通過した場合には開きカッコを展開したことになるので、閉じカッコを展開し、登録する（ステップＳ１１３）。例えば表データ格納部５における処理対象セルに「）」と格納する。開きカッコを展開していないと判断した場合又はステップＳ１１３の後に、処理対象のメソッド名の演算子変換を実施し、登録する（ステップＳ１１５）。multiplyであれば”＊”に、addであれば”＋”に、subtractであれば”−”に、divideであれば”／”に、powであれば”＊＊”に変換して、表データ格納部５における処理対象セルに登録する。その後、第２引数変換処理を実施する（ステップＳ１１７）。この第２引数変換処理については後に説明する。そして元の処理に戻る。
【００４５】
一方、ステップＳ１０３において、読み出したメソッド名などがBigDecimalクラスのメソッドではないと判断された場合には、処理しているデータブロックは通常のメソッド又は通常の式が格納されていると考えられるので、当該データブロックの展開（例えば通常の式であればそのまま。通常のメソッドであればインスタンスデータの領域に格納されているデータを読み出し、instance.methodといった形式に展開する）を行い（ステップＳ１１９）、例えば語句辞書８及びコード辞書９を用いた語句変換処理を実施し、登録する（ステップＳ１２１）。語句辞書８及びコード辞書９に登録が無ければ、そのまま表データ格納部５の処理対象セルに登録する。インスタンスがin_paramでメソッド名がNISSUであり、語句辞書８に図５のような登録がなされていれば、「入力領域．日数」と変換され、表データ格納部５の処理対象セルに登録される。そして元の処理に戻る。
【００４６】
次にステップＳ１０９の第２インスタンス変換処理を図１６を用いて説明する。まず、式変換部６は、処理対象メソッドのインスタンスがメソッド呼び出しになっているか判断する（ステップＳ１２５）。すなわち、本処理に係るデータブロックのインスタンスデータの領域に参照すべきデータブロックのポインタが登録されているか確認する。もし、処理対象メソッドのインスタンスがメソッド呼び出しになっている場合には、ポインタから呼び出し先のデータブロックを特定し（ステップＳ１２９）、図１５の部分式変換処理を実施する（ステップＳ１３１）。そして元の処理に戻る。一方、処理対象メソッドのインスタンスがメソッド呼び出しではない場合には、処理に係るデータブロックのインスタンスデータの領域に格納されているインスタンス名を展開し、表データ格納部５の処理対象セルに登録する（ステップＳ１２７）。ここで、例えば語句辞書８を参照してインスタンス名を表す文字列をその意味を表す語句に変換し、コード辞書９を参照して変数の値についてその意味を表す語句に変換し、表データ格納部５の処理対象セルに登録する。なお、語句辞書８及びコード辞書９に登録されていない場合にはそのまま登録する。そして元の処理に戻る。このように、インスタンスにメソッドが規定されていると、データブロックが連鎖するので、その連鎖をたどって処理を行う。
【００４７】
次に、ステップＳ１１７の第２引数変換処理を図１７を用いて説明する。まず、式変換部６は、処理対象の引数が式であるか確認する（ステップＳ１３５）。これはデータブロックの引数が式か否かを表すフラグにて簡単に判断できる。式であれば、開きカッコを展開し、表データ格納部５の処理対象セルに登録する（ステップＳ１３７）。そして、引数に係るデータブロックを、メソッドのデータブロックの引数データの領域を参照して特定する（ステップＳ１３９）。
【００４８】
そして、ステップＳ１３５で引数が式ではないと判断された場合又はステップＳ１３９の後に、引数についての部分式変換処理を実施する（ステップＳ１４１）。具体的には、ステップＳ１３５のＹｅｓルート経由である場合にはステップＳ１３９において特定されたデータブロックについて、ステップＳ１３５のＮｏルート経由である場合には元のメソッドのデータブロックについて処理を行う。そして、開きカッコを展開したか判断する（ステップＳ１４３）。すなわち、ステップＳ１３７を経由したか判断する。そして開きカッコを展開している場合には、対応する閉じカッコを展開し、表データ格納部５の処理対象セルに登録する（ステップＳ１４５）。そして、元の処理に戻る。一方、開きカッコを展開していない場合には元の処理に戻る。
【００４９】
このような処理を行うことにより図１３に示したようなデータブロックが処理されて、レビュアが読みやすい通常の算術演算式が得られ、さらに変数の意味を表す語句などに変換されて、表形式でレビュアに提示されるようになる。
【００５０】
図１４乃至図１７の処理について、図１３に示したようなデータブロックを処理する場合を具体的に説明する。最初に、ステップＳ１０１において、データブロック１３０１のメソッド名の領域に登録されたメソッド名multiplyを読み出し、ステップＳ１０３においてBigDecimalクラスのメソッドであるか確認する。メソッドmultiplyはBigDecimalクラスのメソッドであるから、ステップＳ１０５において、当該メソッドmultiplyのデータブロック１３０１の優先順位の領域に登録された優先順位と、データブロック１３０１のインスタンスデータの領域に設定されたポインタからたどることにより得られるデータブロック１３０２の優先順位の領域に登録された優先順位とを比較し、当該メソッドmultiplyのインスタンスのメソッドの優先順位が自メソッドmultiplyの優先順位より低いか判断する。ここでは、メソッドmultiplyのインスタンスのメソッドsubtractの優先順位が「３」であり、自メソッドmultiplyの優先順位は「２」であるから、条件を満たしていることになる。従って、ステップＳ１０７において開きカッコを展開する。この段階で「（」となる。次に、ステップＳ１０９において第２インスタンス変換処理を実施する。第２インスタンス変換処理においては、ステップＳ１２５においてメソッドmultiplyのインスタンスがメソッド呼び出しであるか判断する。データブロック１３０１のインスタンスデータの領域に設定されたポインタからたどることにより得られるデータブロック１３０２におけるメソッド名の領域にメソッド名subtractが登録されているので、メソッド呼び出しであると判断され、ステップＳ１２９で呼び出し先のデータブロック１３０２を特定し、ステップＳ１３１で部分式変換処理を実施する。
【００５１】
そうすると、ステップＳ１０１において、データブロック１３０２のメソッド名の領域に登録されたメソッド名subtractを読み出し、ステップＳ１０３においてBigDecimalクラスのメソッドであるか確認する。メソッドsubtractはBigDecimalクラスのメソッドであるから、ステップＳ１０５において、当該メソッドsubtractのデータブロック１３０２の優先順位の領域に登録された優先順位と、データブロック１３０２のインスタンスデータの領域に設定されたポインタからたどることにより得られるデータブロック１３０３の優先順位の領域に登録された優先順位とを比較し、当該メソッドsubtractのインスタンスのメソッドの優先順位が自メソッドsubtractの優先順位より低いか判断する。ここでは、メソッドsubtractのインスタンスのメソッドaddの優先順位が「３」であり、自メソッドsubtractの優先順位は「３」であるから、条件を満たしていないことになる。従って、ステップＳ１０９において第２インスタンス変換処理を実施する。第２インスタンス変換処理においては、ステップＳ１２５においてメソッドsubtractのインスタンスがメソッド呼び出しであるか判断する。データブロック１３０２のインスタンスデータの領域に設定されたポインタからたどることにより得られるデータブロック１３０３におけるメソッド名の領域にメソッド名addが登録されているので、メソッド呼び出しであると判断され、ステップＳ１２９で呼び出し先のデータブロック１３０３を特定し、ステップＳ１３１で部分式変換処理を実施する。
【００５２】
次に、ステップＳ１０１において、データブロック１３０３のメソッド名の領域に登録されたメソッド名addを読み出し、ステップＳ１０３においてBigDecimalクラスのメソッドであるか確認する。メソッドaddはBigDecimalクラスのメソッドであるから、ステップＳ１０５において、当該メソッドaddのデータブロック１３０３の優先順位の領域に登録された優先順位と、データブロック１３０３のインスタンスデータの領域に設定されたインスタンスの優先順位とを比較することになるが、データ１３０３のインスタンスデータの領域にはインスタンス”data1”が登録されているので優先順位は設定されていない。従って、条件を満たしていないことになる。そこで、ステップＳ１０９において第２インスタンス変換処理を実施する。第２インスタンス変換処理においては、ステップＳ１２５においてメソッドaddのインスタンスがメソッド呼び出しであるか判断する。上でも述べたようにデータブロック１３０３のインスタンスデータの領域には”data1”が登録されているので、メソッド呼び出しではないと判断される。そして、データブロック１３０３のインスタンスデータの領域からインスタンス名”data1”が読み出され、展開される。この段階で「（data1」となる。そしてメソッドaddについての第２インスタンス変換処理が完了したので、ステップＳ１１１でメソッドaddについての処理において開きカッコを展開したか判断する。ここでは開きカッコは展開していないので、メソッド名addに対応する演算子を展開する。この段階で「（data1+」となる。その後、ステップＳ１１７において第２引数変換処理を実施する。
【００５３】
第２引数変換処理においては、データブロック１３０３の引数が式か否かを表すフラグから引数が式であるか判断する。ここでは式であることを表す「１」が登録されているので、ステップＳ１３７で開きカッコの展開を行う。この段階で「（data1+(」となる。次に、ステップＳ１３９においてデータブロック１３０３の引数データの領域のポインタから引数についてのデータブロック１３０４を特定し、ステップＳ１４１で部分式変換処理を実施する。
【００５４】
部分式変換処理においては、ステップＳ１０１でデータブロック１３０４のメソッド名の領域からメソッド名等”method1”を読み出す。ステップＳ１０３において”method1”はBigDecimalクラスのメソッドではないと判断され、ステップＳ１１９においてデータブロック１３０４の展開を行う。この段階で「（data1+(data2.method1」となる。これでデータブロック１３０４における部分式変換処理が完了する。そして、データブロック１３０３の引数についての第２引数変換処理に戻り、ステップＳ１４３において開きカッコを展開したか判断する。ステップＳ１３７で開きカッコを展開したので、ステップＳ１４５で閉じカッコを展開する。この段階で「（data1+(data2.method1)」となる。これでデータブロック１３０３の引数についての第２引数変換処理が完了し、データブロック１３０３についての部分式変換処理も完了する。そうすると、データブロック１３０２のインスタンスについての第２インスタンス変換処理が完了したことになり、データブロック１３０２の部分式変換処理に戻る。
【００５５】
そうするとステップＳ１１１において開きカッコを展開したか判断するが、データブロック１３０２については開きカッコを展開していないのでステップＳ１１５に移行する。ステップＳ１１５ではメソッド名subtractに対応する演算子を展開する。この段階で「（data1+(data2.method1)-」となる。そしてステップＳ１１７において第２引数変換処理を実施する。
【００５６】
第２引数変換処理においては、ステップＳ１３５で引数が式であるかデータブロック１３０２の引数が式か否かを表すフラグで判断する。データブロック１３０２ではフラグが「１」となっているので引数は式であり、開きカッコを展開する。この段階で「（data1+(data2.method1)-(」となる。また、ステップＳ１３９で引数に係るデータブロックを、データブロック１３０２の引数データの領域に登録されたポインタから特定する。ここではデータブロック１３０５が特定される。そしてステップＳ１４１で、引数”data3+data4”について部分式変換処理を実施する。
【００５７】
部分式変換処理においては、ステップＳ１０１でデータブロック１３０５のメソッド名の領域からメソッド名等”data3+data4”を読み出し、ステップＳ１０３で”data3+data4”がBigDecimalクラスのメソッドであるか判断する。”data3+data4”はBigDecimalクラスのメソッドではないので、ステップＳ１１９でデータブロックの展開を行う。そうすると、「（data1+(data2.method1)-(data3+data4」となる。これでデータブロック１３０５についての部分式変換処理は終了し、データブロック１３０２についての第２引数変換処理に戻り、ステップＳ１４３において開きカッコを展開したか判断する。ステップＳ１３７を経由しているので開きカッコを展開しており、ステップＳ１４５において閉じカッコを展開する。この段階で「（data1+(data2.method1)-(data3+data4)」となる。これでデータブロック１３０２の第２引数変換処理が完了し、同時にデータブロック１３０２の部分式変換処理も完了したことになる。さらに、データブロック１３０１についての第２インスタンス変換処理も完了したことになる。
【００５８】
そこで、データブロック１３０１の部分式変換処理に戻り、ステップＳ１１１において開きカッコを展開したか判断する。ステップＳ１０７を通過しているので開きカッコを展開しており、ステップＳ１１３で閉じカッコを展開する。さらに、メソッド名を対応する演算子に変換する。この段階で「（data1+(data2.method1)-(data3+data4)*」となる。そして、ステップＳ１１７においてデータブロック１３０１についての第２引数変換処理を実施する。
【００５９】
第２引数変換処理では、ステップＳ１３５において引数が式であるかを、データブロック１３０１の引数が式か否かを表すフラグで判断する。データブロック１３０１ではフラグが「０」となっているので引数は式ではない。よって、ステップＳ１４１において、データブロック１３０１の引数データの領域に登録されている”data5”について部分式変換処理を実施する。
【００６０】
部分式変換処理では、ステップＳ１０１においてデータブロック１３０１の引数データの領域に登録されたデータ”data5”を読み出し、ステップＳ１０３でBigDecimalクラスのメソッドであるか判断する。”data5”はメソッドでないので、ステップＳ１１９でデータブロック１３０１の引数データをそのまま展開する。この段階で「（data1+(data2.method1)-(data3+data4)*data5」となる。
【００６１】
このようにすれば、レビュアでも容易にレビューすることができるデータに変換される。なお、上の例では、data1、data2、method1、data3、data4、data5については語句辞書８を用いた変換を行っていないが、語句辞書８に登録されていれば変換を実施する。また、data2.method1についてはカッコが余分に付されているので、不要カッコ除去処理において除去する。
【００６２】
例えば、以下のようなソースプログラムが存在する場合には、表データ格納部５に格納されるデータは図１８に示すようになる。
【００６３】
［ソースプログラム例］
class sample {
void calc(denpyo in_param){
if (in_param.getRETURNCODE() == 0) {
out_param.setNISSU(in_param.getNISSU());
} else {
if (in_param.getRETURNCODE() == 1) {
out_param.setGANKIN(BigDecimal.valueOf(out_param.getGANKIN().get()+(1+200)).divide(BigDecimal.valueOf(out_param.getRITANI().get()),0,BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(out_param.getRITANI().get())));
if (out_param.getHASUKUBUN().equals("2")) {
out_param.setRISOKU(BigDecimal.valueOf(out_param.getWK_GANKIN().get()).multiply(BigDecimal.valueOf(out_param.getNISSU().get())).multiply(BigDecimal.valueOf(out_param.getRATE().get())).divide(BigDecimal.valueOf(365).multiply(BizMath.pow(BigDecimal.valueOf(10),7,10)),10,BigDecimal.ROUND_DOWN).add(new BigDecimal("0.999")));
} else {
out_param.setWK_RISOKUA(BigDecimal.valueOf(out_param.getWK_GANKIN().get()).multiply(BigDecimal.valueOf(out_param.getNISSU().get())).multiply(BigDecimal.valueOf(out_param.getRATE().get())).divide(BigDecimal.valueOf(365).multiply(BizMath.pow(BigDecimal.valueOf(10),7,1)),1,BigDecimal.ROUND_DOWN));
}
} else {
out_param.setERRORNO(2);
return;
}
}
out_param.setERRORNO(0);
}
}
【００６４】
図１８の上部に示した、プロジェクト名、ワークスペース、ファイル名は、仕様書データ生成装置１０の環境等から抽出されるデータであり、ここでは本実施の形態の主要部分ではないので説明を省略する。メソッド名は、ソースプログラムの２行目のデータに対応する。３行目以降については図１８の表にまとめられている。第１行目は図４（ｃ）と同じであり、基本的な格納データは同じである。但し、条件は複数段階で設定されているので、条件１、条件２、条件３といったように分けられている。なお、条件３以上の条件が設定されている場合には列数は増える。また、項番３の条件３において「端数処理区分．切り上げ」が登録されているが、これはコード辞書９によるデータであり、出力領域．端数処理区分の変数値「２」を意味する。
【００６５】
次に、上で説明を省略した文字列変換の変換ルールについて説明する。
【００６６】
（１）基本変換パターン
図１９に基本変換パターンを示す。
【００６７】
（２）BigDecimal型への変換メソッドの展開
BigDecimalの算術演算のために、データクラス変数及び作業変数をBigDecimal型に変換する必要があるが、仕様書データ中では不要であるから以下のように変換する。
BigDecimal.valueOf(データ項目のgetter)＝＞データ項目
より具体的には以下のようになる。
BigDecimal.valueOf(wk_x16.getWK_ZOUHENGK().get())＝＞wk_x16.WK_ZOUHENGK
【００６８】
（３）BigDecimalクラスのメソッドdivide
上ではメソッドsubtract、add、及びmultiplyについては例示したが、メソッドdivideについては以下のように変換される。
BigDecimal.valueOf(データ項目１).divide(BigDecimal.valueOf(データ項目２), 小数点桁数, ROUNDED指定)＝＞データ項目１／データ項目２
より具体的には以下のようになる。
BigDecimal.valueOf(wk_x16.getWK_ZOUHENGK().get()).divide(BigDecimal.valueOf(kwlarkgv.getKGVKWCYUJBZK().get(), 10, BigDecimal.ROUND_DOWN)＝＞wk_x16.WK_ZOUHENGK／kwlarkgv.KGVKWCYUJBZK
【００６９】
（４）BizMathクラスのメソッドpow
以下のような変換が行われる。
BizMath.pow(被乗数，指数）＝＞被乗数＊＊指数
BizMath.pow(BigDecimal.valueOf(被乗数), 指数, 小数部基準桁数)＝＞被乗数＊＊指数
より具体的には以下のようになる。
BizMath.pow(BigDecimal.valueOf(wk_x16.getWK_ZOUHENGK().get(), 3, 5)＝＞wk_x16.WK_ZOUHENGK**3
【００７０】
（５）Mathクラスのメソッドpow
以下のような変換が行われる。
Math.pow(double型の被乗数，double型の指数）＝＞被乗数＊＊指数
より具体的には以下のようになる。
Math.pow((double)(wk_x16.getWK_ZOUHENGK().get(), 3.5)＝＞wk_x16.WK_ZOUHENGK**3.5
【００７１】
（６）特殊処理対象のメソッド
以下のような変換が行われる。
setScale(小数点桁数, BigDecimal.ROUND_DOWN)(setterメソッドの末尾に存在しないこと）＝＞削除
より具体的には、以下のようになる。
x.setCC(BigDecimal.valueOf(x.getCC().get()).multiply(BigDecimal.valueOf(x.getBB().get())).setScale(10, BigDecimal.ROUND_DOWN).divide(BigDecimal.valueOf(x.getAA().get()), 8, BigDecimal.ROUND_DOWN))＝＞ CC = CC * BB / AA 
【００７２】
また、以下のような変換も行われる。
setterメソッド(演算結果.setScale(小数点桁数, BigDecimal.ROUND_HALF_UP))＝＞「ROUNDED」を変換後の実行分の末尾に付加
より具体的には、以下のようになる。
x.setCC(BigDecimal.valueOf(x.getCC().get()).divide(BigDecimal.valueOf(x.getAA().get()), 8, BigDecimal.ROUND_DOWN).setScale(8, BigDecimal.ROUND_HALF_UP))＝＞ CC = CC / AA ROUNDED
【００７３】
（７）その他
例えば以下のように”set”を”＝”に置換する。
wk_xl6.setWK_RISOKUG(wk_xl6.getWK_RISOKUG().checkDigit(BigDecimal.valueOf(wk_xl6.getWK_KEKKA1().get()).multiply(BigDecimal.valueOf(wk_xl6.getWK_KEKKA2().get())).multiply(BigDecimal.valueOf(wk_xl6.getWK_TSUKISU().get())).divide(BizMath.pow(BigDecimal.valueOf(10),7,0),0,BigDecimal.ROUND_DOWN)))＝＞wk_xl6.WK_RISOKUG = wk_xl6.WK_RISOKUG.checkDigit( wk_xl6.WK_KEKKA1 * wk_xl6.WK_KEKKA2 * wk_xl6.WK_TSUKISU / ( 10 ** 7 ) )
【００７４】
以上本発明の実施の形態を説明したが、本発明はこれに限定されるものではない。すなわち、実際のプログラムにおいて図１の機能ブロックがプログラムモジュールに対応しない場合もある。また、上で述べた処理フローについても同じ結果を得ることができるため並列に実行することができたり、順番を入れ替えたりすることができるステップも存在する。
【００７５】
また、仕様書データ生成装置１０はコンピュータ装置であって、図２０に示すように、メモリ２５０１（記憶装置）とＣＰＵ２５０３（処理装置）とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施の形態における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。必要に応じてＣＰＵ２５０３は、表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、必要な動作を行わせる。また、処理途中のデータについては、メモリ２５０１に格納され、必要があればＨＤＤ２５０５に格納される。本発明の実施の形態では、上で述べた処理を実施するためのアプリケーション・プログラムはリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００７６】
（付記１）
算術演算をメソッド形式で記述したソースプログラムから仕様書データを生成する方法であって、
前記ソースプログラムに含まれ且つ算術演算を規定する算術演算文に含まれる算術演算メソッドについて、予め定められた演算ルールに従った優先度を特定し、算術演算メソッドと優先度とを記憶装置に登録する登録ステップと、
前記算術演算文において複数の算術演算メソッドが含まれており且つ優先度の高い演算メソッドのインスタンスとして優先度の低い算術演算メソッドが規定されていると前記記憶装置に格納されているデータに基づき判断した場合には、前記優先度の低い算術演算メソッドと当該優先度の低い算術演算メソッドのインスタンス及び引数とを所定のルールに従って算術演算記号を用いた第１の部分算式に変換し、当該第１の部分算式に対して優先的な演算を行うことを表すカッコを付し、前記優先度の高い演算メソッドと当該優先度の高い演算メソッドの引数とを前記所定のルールに従って算術演算記号を用いた第２の部分算式に変換して前記第１の部分算式と連結する処理を実施することにより仕様書データを生成し、仕様書データ格納部に格納する生成ステップと、
を含み、コンピュータに実行される仕様書データ生成方法。
【００７７】
（付記２）
前記登録ステップにおいて、
算術演算メソッドについて前記優先度と当該算術演算メソッドのインスタンスに関するデータと当該算術演算メソッドの引数に関するデータとを保持するデータブロックを生成し、前記記憶装置に格納する
ことを特徴とする付記１記載の仕様書データ生成方法。
【００７８】
（付記３）
前記生成ステップが、
変数名と当該変数名の意味を表す語句とが対応付けられて登録されている第１の辞書を参照し、前記第１の部分算式及び前記第２の部分算式に含まれる変数を対応する語句に置換するステップ
を含む付記１記載の仕様書データ生成方法。
【００７９】
（付記４）
前記ソースプログラムを解析して、処理文と当該処理文に関連する条件とを特定し、対応付けて仕様書データ格納部に格納するステップ、
をさらに含み、
前記登録ステップが、前記算術演算文である処理文及び条件について実施される
ことを特徴とする付記１記載の仕様書データ生成方法。
【００８０】
（付記５）
前記生成ステップが、
算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在するか確認するステップと、
算式において１項のみを囲うカッコ又はカッコで囲まれる文字のみを囲うカッコが存在する場合には、当該カッコを除去するステップと、
を含む付記１記載の仕様書データ生成方法。
【００８１】
（付記６）
前記生成ステップが、
変数の値の意味を表す語句が登録されている第２の辞書を参照し、特定の変数の特定の値に対応する語句を抽出し、前記特定の変数の特定の値に対応して前記仕様書データ格納部に格納するステップ
を含む付記１記載の仕様書データ生成方法。
【００８２】
（付記７）
前記引数に関するデータが、引数が式であるか否かを表すデータを含み、
前記生成ステップが、
前記データブロックを参照して、算術演算メソッドの引数が式であるか判断するステップと、
前記引数が式であると判断された場合には、当該式を前記所定のルールに従って算術演算記号を用いた第３の部分算式に変換し、当該第３の部分算式に対してカッコを付すステップと、
を含む付記２記載の仕様書データ生成方法。
【００８３】
（付記８）
付記１乃至７のいずれか１つ記載の仕様書データ生成方法をコンピュータに実行させるためのプログラム。
【００８４】
（付記９）
算術演算をメソッド形式で記述したソースプログラムから仕様書データを生成する装置であって、
前記ソースプログラムに含まれ且つ算術演算を規定する算術演算文に含まれる算術演算メソッドについて、予め定められた演算ルールに従った優先度を特定し、算術演算メソッドと優先度とを記憶装置に登録する登録手段と、
前記算術演算文において複数の算術演算メソッドが含まれており且つ優先度の高い演算メソッドのインスタンスとして優先度の低い算術演算メソッドが規定されていると前記記憶装置に格納されているデータに基づき判断した場合には、前記優先度の低い算術演算メソッドと当該優先度の低い算術演算メソッドのインスタンス及び引数とを所定のルールに従って算術演算記号を用いた第１の部分算式に変換し、当該第１の部分算式に対して優先的な演算を行うことを表すカッコを付し、前記優先度の高い演算メソッドと当該優先度の高い演算メソッドの引数とを前記所定のルールに従って算術演算記号を用いた第２の部分算式に変換して前記第１の部分算式と連結する処理を実施することにより仕様書データを生成し、仕様書データ格納部に格納する生成手段と、
を有する仕様書データ生成装置。
【図面の簡単な説明】
【００８５】
【図１】本発明の実施の形態に係る機能ブロック図である。
【図２】本発明の実施の形態に係るメイン処理の処理フローを示す図である。
【図３】表変換処理の処理フローを示す図である。
【図４】（ａ）乃至（ｃ）は、変換例を示す図である。
【図５】語句辞書に格納されるデータの一例を示す図である。
【図６】コード辞書に格納されるデータの一例を示す図である。
【図７】式変換処理の処理フローを示す図である。
【図８】演算解析処理の処理フローを示す図である。
【図９】データブロックの構造を説明するための図である。
【図１０】算術演算メソッドの優先順位を示す図である。
【図１１】インスタンス解析処理の処理フローを示す図である。
【図１２】引数解析処理の処理フローを示す図である。
【図１３】データブロックの連鎖の具体例を示す図である。
【図１４】変換処理の処理フローを示す図である。
【図１５】部分式変換処理の処理フローを示す図である。
【図１６】第２インスタンス変換処理の処理フローを示す図である。
【図１７】第２引数変換処理の処理フローを示す図である。
【図１８】仕様書データの一例を示す図である。
【図１９】基本変換ルールのテーブルを示す図である。
【図２０】コンピュータシステムの機能ブロック図である。
【符号の説明】
【００８６】
１  ソースプログラム格納部    ２  構文解析部
３  構文解析結果格納部    ４  表変換部
５  表データ格納部    ６  式変換部
７  データブロック格納部    ８  語句辞書    ９  コード辞書
１０  仕様書データ生成装置
【図１】
2006139357.tif 000003
【図２】
2006139357.tif 000004
【図３】
2006139357.tif 000005
【図４】
2006139357.tif 000006
【図５】
2006139357.tif 000007
【図６】
2006139357.tif 000008
【図７】
2006139357.tif 000009
【図８】
2006139357.tif 000010
【図９】
2006139357.tif 000011
【図１０】
2006139357.tif 000012
【図１１】
2006139357.tif 000013
【図１２】
2006139357.tif 000014
【図１３】
2006139357.tif 000015
【図１４】
2006139357.tif 000016
【図１５】
2006139357.tif 000017
【図１６】
2006139357.tif 000018
【図１７】
2006139357.tif 000019
【図１８】
2006139357.tif 000020
【図１９】
2006139357.tif 000021
【図２０】
2006139357.tif 000022