(57)【要約】      （修正有）【課題】ネストしたｉｆ文をよりネストの浅いｉｆ文に自動的に編集する。【解決手段】ネスティングしていないｉｆ文のテンプレートを備えるコンピューターに、ソースコード中のネスティングしているｉｆ文の論理構造を、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方はどちらであるかを示す真偽の順と共に、制御構造テーブルに書き出し、前記制御構造テーブルに従い、前記テンプレートを用いることにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成する。【選択図】図３
2006344097.tif 000002
【特許請求の範囲】
【請求項１】
ｉｆ文を編集するプログラムであって、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびｉｆ文の論理構造を格納した制御構造テーブルおよびｉｆ文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
ソースコード中のネスティングしているｉｆ文の論理構造と、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成機能と、
前記制御構造テーブルに格納されたｉｆ文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成するｉｆ文編集機能を実現させることを特徴とするプログラム。
【請求項２】
表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびｉｆ文の論理構造を格納した制御構造テーブルおよびｉｆ文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターのｉｆ文を編集する方法であって、
ソースコード中のネスティングしているｉｆ文の論理構造と、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成手順と、
前記制御構造テーブルに格納されたｉｆ文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成するｉｆ文編集手順を実行させることを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのソースコードに含まれるｉｆ文を編集するプログラムおよびｉｆ文を編集する方法に係り、特にネスティングしたｉｆ文をネスティングを低減させた形に自動編集するプログラムおよび編集する方法に関する。
【背景技術】
【０００２】
一般に、コンピューターを動作させるためのプログラムはＪＡＶＡ（登録商標）言語やＣ言語のような高級言語でソースプログラムを記述し、このソースプログラムをコンパイルして実行形式のコードに変換してコンピューターに実行させる。
ソースコードは条件分岐、繰り返し、連接構造などのロジックを組み合わせることで、所望の動作をするように記述される。
【０００３】
前記の言語などの条件分岐はｉｆ文で記述され、そのｉｆ文は例えば、
ｉｆ（条件文）｛条件が真だったときの処理｝ｅｌｓｅ｛条件が偽だったときの処理｝のように記述される。また、ｉｆ文の中に、さらにｉｆ文を記述することもできる。これをネスティングという。
ソースコードの記述はロジックを読みやすく記述することが、不具合を見つけやすくしたり、プログラムの仕様変更を容易にしたりするために、重要である。
【０００４】
しかし、開発の現場では、ソースコードを読みやすく記述することは、開発期間の制約や、開発者の良識にまかされている事もあって、軽視されていて充分に行われておらず、複雑にネスティングしたｉｆ文が記述される傾向にある。このため、不具合の検出や仕様変更による修正作業を困難にしている。
【０００５】
これに対する対策として、さまざまな特許出願がなされている。例えば、特許文献１にはメモリーリーク対策として、メモリのアロックやフリーについて処理漏れがあるかどうかを検出する方法であって、ソースコードのうちメモリ管理に関するロジックだけを抽出して表示色や輝度を変えて表示する方法が開示されている。
【特許文献１】特開２００２-２８８００４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ＪＡＶＡ（登録商標）言語やＣ言語などの高級言語によって書かれたソースコードにおいては、ｉｆ文のネストが深くなりすぎると読みづらくなり、不具合を見つけにくくなったり、仕様変更による修正作業がしづらくなったりする。
前述の特許文献１において開示されている方法は、メモリ管理に関するものであり、ｉｆ文のネストを浅くすることはできないと言う不具合があった。
【０００７】
本発明の目的は、前述の従来技術による不具合を除去することであり、ｉｆ文のネスティングを当初のｉｆ文よりも低減することができるｉｆ文を編集するプログラムおよびｉｆ文を編集する方法を提供することにある。
【課題を解決するための手段】
【０００８】
前記目的を達成するために請求項１記載の発明は、ｉｆ文を編集するプログラムであって、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびｉｆ文の論理構造を表した制御構造テーブルおよびｉｆ文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
ソースコード中のネスティングしているｉｆ文の論理構造と、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成機能と、
前記制御構造テーブルに従い、前記テンプレートを用いることにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成するｉｆ文編集機能を実現させることを特徴とする。
【０００９】
また、請求項２記載の発明は、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびｉｆ文の論理構造を格納した制御構造テーブルおよびｉｆ文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターのｉｆ文を編集する方法であって、
ソースコード中のネスティングしているｉｆ文の論理構造と、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成手順と、
前記制御構造テーブルに格納されたｉｆ文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成するｉｆ文編集手順を実行させることを特徴とする。
【発明の効果】
【００１０】
本発明によるネスティングを低減したｉｆ文を編集するプログラムおよびネスティングを低減したｉｆ文を編集する方法は、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびｉｆ文の論理構造を格納した制御構造テーブルおよびｉｆ文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
ソースコード中のネスティングしているｉｆ文の論理構造と、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順とを制御構造テーブルに書き出す制御構造テーブル作成機能と、前記制御構造テーブルに格納されたｉｆ文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたｉｆ文を作成するｉｆ文編集機能を実現させるので、編集前のｉｆ文に比べてネストが浅く読みやすいｉｆ文を自動編集できる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明によるネスティングを低減したｉｆ文を編集するプログラムおよびネスティングを低減したｉｆ文を編集する方法の一実施形態を図面を参照して詳細に説明する。
図１は、本発明を実施するシステムの全体構成図である。
図２は、制御構造テーブルの例である。
図３は、本発明のプログラム及び方法のフローチャートである。
図４は、ｉｆ文から制御構造テーブルを作成する方法を模式的に示した図である。
図５は、制御構造テーブルからネスティングを低減したｉｆ文を作成するフローチャートである。
図６は、制御構造テーブルからネスティングを低減したｉｆ文を作成する続きのフローチャートである。
図７は、ｉｆ文のテンプレートを示した図である。
図８は、ネスティングしたｉｆ文のネストを低減する手順を表した図である。
図９は、ネスティングしたｉｆ文のネストを低減する手順を表した続きの図である。
【００１２】
<構成の説明>
本発明のｉｆ文を編集するプログラムおよびｉｆ文を編集する方法を実施するコンピューターシステムの全体構成の例を、図１を用いて説明する。
このｉｆ文を編集するプログラムおよびｉｆ文を編集する方法を実施するコンピューターシステムは、コンピューター本体である制御部３と、この制御部３に接続されるディスプレイなどの表示装置１と、ポインティングデバイスのマウス２と、記憶装置４から構成されている。制御部３にはｉｆ文を編集する編集処理部５が設けられている。記憶装置４は、編集前のソースコードである編集前ソースコード４ａと、編集後のソースコードである編集後ソースコード４ｂと、ネスティングしたｉｆ文の構造をまとめた表である制御構造テーブル４ｃと、ｉｆ文を編集する際に使用するｉｆ文のテンプレートである出力テンプレート４ｄを格納している。
【００１３】
<動作の順序>
前記編集処理部５はネストしたｉｆ文を編集してネストを低減したｉｆ文を作成するものである。この編集処理部５の動作の順序を、図３を用いて説明する。
まず、ソースコードを読み込む読み込み処理を行う［ステップ３０１］。ソースコードの読み込みはマウス等で読み込み範囲を指定しても良い。次に、ｉｆ文内の処理を分割し順次制御構造テーブル４ｃに書き込んでゆく、処理の分割を行う［ステップ３０２］。次に、分割されたｉｆ文の各ブロックの行数を算出する行数の算出を行う［ステップ３０３］。さらに、編集処理における条件文の真偽の順をそのままにするかどうかの判定である真偽の順の判定を行う［ステップ３０４］。最後に、ｉｆ文を編集して出力する出力処理を行う。
【００１４】
<動作の原理>
本発明によるネスティングを有するｉｆ文のネストの低減手順を、図８〜９を用いて例を示しながら説明する。
まず、図８を用いて説明する。
ソースコード７０１においてモジュールｆｕｎｃ（）が図示の如く定義されている。モジュールｆｕｎｃ（）は、［メイン処理］７１０を行うモジュールであるが、［メイン処理］の前に［前処理１］と［前処理２］と［前処理３］を行い、さらに［メイン処理］の後に［後処理１］と［後処理２］と［後処理３］を行う。
【００１５】
このソースコード７０１に更に詳しく見てみると、［前処理１］の直後に［条件式１］が、［前処理２］の直後に［条件式２］が、［前処理３］の直後に［条件式３］が、それぞれ配置されている。それぞれの条件式では、その条件式が真と判定した場合は次の処理に進み、偽と判定した場合には、それぞれ［エラー処理１］、［エラー処理２］、［エラー処理３］を行いモジュールｆｕｎｃ（）の処理を終了する。
【００１６】
また、ソースコード７０１においては、［前処理１］が行われている場合にはモジュールｆｕｎｃ（）が終了する前に［後処理１］を行い、［前処理２］が行われている場合にはモジュールｆｕｎｃ（）が終了する前に［後処理２］を行い、［前処理３］が行われている場合にはモジュールｆｕｎｃ（）が終了する前に［後処理３］を行う。
【００１７】
このように、ソースコード７０１ではｉｆ文が３重にネストしている。また、［前処理１］［前処理２］［前処理３］［後処理１］［後処理２］［後処理３］［メイン処理］はソースコードのステップ数が数行から数十行になることもある。
【００１８】
次に、ソースコード７０１の編集方法について説明する。
先ず、ｉｆ文において、条件式が真のときに行うブロックのステップ数と条件式が偽のときに行うブロックのステップ数を比較して、ステップ数が少ない方が、条件式が真の時に実行されるように、条件式の真偽の変更と条件式が真のときに行うブロックと条件式が偽のときに行うブロックを交換する。
【００１９】
ソースコード７０１の場合、各条件式が真のときに行うブロックの方が、各条件式が偽のときに行うブロックである［エラー処理１］、［エラー処理２］、［エラー処理３］よりも長いため、条件式の真偽の変更と各ブロックの交換を行い、その結果はソースコード７０２となる。このように、条件式が真の場合それを偽にするとは、単なる（［条件式］）を（［条件式］＝＝ｆａｌｓｅ）と変更すればよい。この処理を全てのｉｆ文について適用したものがソースコード７０２である。
【００２０】
ソースコード７０１、ソースコード７０２では、例えば最初のｉｆ文の判定が偽だったときには［エラー処理１］を行い当該のｉｆ文を抜けて［後処理１］を行うようにプログラムされている。ソースコード７０３では（［条件式］＝＝ｆａｌｓｅ）が真だったとき、各［エラー処理］の後にｉｆ文を抜けるためのｒｅｔｕｒｎ；を追加する。
【００２１】
ソースコード７０３では（［条件式］＝＝ｆａｌｓｅ）が真だったときはｅｌｓｅ以降のステートメントを通過しないため、ｅｌｓｅ文を指定しなくても論理的に変わらないので削除する。削除の結果がソースコード７０４である。ｅｌｓｅ文を削除したため括弧"｛"、"｝"のネストが少なくなっている。
【００２２】
続いて図９を用いて、引き続きソースコードの編集方法を説明する。
ソースコード７０４では［後処理１］［後処理２］［後処理３］が何箇所にも記載されていて冗長である。そこで、［後処理１］［後処理２］［後処理３］を連続して行う専用のサブモジュールｐｏｓｔｆｕｎｃ（）を用意し、それを必要箇所で呼ぶように変更すると、ソースコード７０５のように編集が完了したソースコードになる。
【００２３】
ｐｏｓｔｆｕｎｃ（）内部で［後処理１］［後処理２］［後処理３］それぞれを行うかどうかはｂｏｏｌｅａｎ型の引数でｐｏｓｔｆｕｎｃ（）に渡される。渡される引数の数はｐｏｓｔｆｕｎｃ（）内部で行われる処理の数と同じである。ソースコード７０５の例では、処理の数は［後処理１］［後処理２］［後処理３］の３つなので、ｂｏｏｌｅａｎ型の引数は３つになる。
【００２４】
以上説明したように、ネストしたｉｆ文は、条件文が真である場合に実行されるブロックの行数を少なくし、ｅｌｓｅ句を用いないようにし、ｉｆ文の後処理を、サブ関数などを用いるなどしてｉｆ文内の行数を減らすと、ネストが低減され、見やすく論理構造がわかりやすいｉｆ文になる。
【００２５】
<テンプレートの説明>
図１の出力テンプレート４ｄは、制御構造テーブル４ｃからｉｆ文を編集するときに用いられるもので、出力テンプレート４ｄの一部を制御構造テーブル４ｃに格納されている値で置換え、同時に整序することでｉｆ文を編集するためのものである。また同時に、重複して記述される処理をサブ関数にまとめてｉｆ文内に配置することによりネスティングを低減させるためにも、出力テンプレートは利用される。
以下、テンプレートの実施例として図７の出力テンプレートを順に説明する。
［テンプレート６０１］は"▽｛"であり、関数の先頭に用いる。
［テンプレート６０２］は
"☆２０２☆
ｉｆ（☆２０６☆＝＝ｔｒｕｅ）｛
★２０８−２０２★
ｐｏｓｔｆｕｎｃ（◇）
ｒｅｔｕｒｎ
｝"
であり、［真偽の順２１２］がｔｒｕｅの場合に用いる。
【００２６】
［テンプレート６０３］は
"☆２０２☆
ｉｆ（☆２０６☆＝＝ｆａｌｓｅ）｛
★２１０−２０２★
ｐｏｓｔｆｕｎｃ（◇）
ｒｅｔｕｒｎ
｝"
であり、［真偽の順２１２］がｆａｌｓｅの場合に用いる。
【００２７】
［テンプレート６０４］は
"☆２０２☆
ｐｏｓｔｆｕｎｃ（◇）"
であり、［真偽の順２１２］が空欄の場合に用いる。
【００２８】
［テンプレート６０５］は
"｝"であり、関数末尾に用いる。
［テンプレート６０６］は
"ｐｏｓｔｆｕｎｃ（◆）｛"
であり、サブ関数の開始に用いられる。
［テンプレート６０７］は
"ｉｆ（△＝＝ｔｒｕｅ）｛
☆２０４☆
｝"
であり、後処理に用いられる。
［テンプレート６０８］は
"｝"
であり、サブ関数の終了に用いられる。
【００２９】
<プログラムの説明>
ｉｆ文を制御構造テーブル４ｃから編集するプログラムを、図５及び図６を用いて説明する。
先ず、図５を説明する。
［ステップ５０１］制御構造テーブルから前処理の処理順チェインを作成する。
［ステップ５０２］処理順チェインの個数−１だけｆａｌｓｅを繰り返した文字列をｐｏｓｓｔｆｕｎｃ（）引数文字列として作成する。
［ステップ５０３］テンプレート６０１の▽の部分を編集前の関数名に置換えて出力する。
［ステップ５０４］処理順チェインの先頭を現在行にする。
［ステップ５０５］現在行の［真偽の順］がｆａｌｓｅなのか、ｔｒｕｅなのか、空欄なのかの判定を行う。ｆａｌｓｅのときは［ステップ５０６］へ、ｔｒｕｅのときは［ステップ５１３］へ、空欄のときは第６図［ステップ５２０］へ進む。
［ステップ５０６］テンプレート６０３の☆２０２☆を現在行の［前処理２０２］の格納値に置換える。
［ステップ５０７］テンプレート６０３の☆２０６☆を現在行の［条件式２０６］の格納値に置換える。
［ステップ５０８］現在行の［偽の実行先２１０］に対し［#２０１］の値が一致する行を検索し、その［前処理２０２］の格納値に、テンプレート６０３の★２１０−２０２★を置換える。
［ステップ５０９］テンプレート６０３のｐｏｓｔｆｕｎｃ（◇）の◇をｐｏｓｔｆｕｎｃの引数文字列に置換える。
［ステップ５１０］ｐｏｓｔｆｕｎｃの引数文字列の最初のｆａｌｓｅをｔｒｕｅに変更する。
［ステップ５１１］置換え後のテンプレート６０３を出力する。
［ステップ５１２］処理順チェインの次の行を現在行にし、［ステップ５０５］に戻る。
［ステップ５１３］テンプレート６０２の☆２０２☆を現在行の［前処理２０２］の格納値に置換える。
［ステップ５１４］テンプレート６０２の☆２０６☆を現在行の［条件式２０６］の格納値に置換える。
［ステップ５１５］現在行の［真の実行先２０８］に対し［＃２０１］の値が一致する行を検索し、その［前処理２０２］の格納値に、テンプレート６０３の★２０８−２０２★に置換える。
［ステップ５１６］テンプレート６０２のｐｏｓｔｆｕｎｃ（◇）の◇をｐｏｓｔｆｕｎｃの引数文字列に置換える。
［ステップ５１７］ｐｏｓｔｆｕｎｃの引数文字列の最初のｆａｌｓｅをｔｒｕｅに変更する。
［ステップ５１８］置換え後のテンプレートを出力する。
［ステップ５１９］処理順チェインの次の行を現在行にする。
【００３０】
続いて、図６を説明する。
［ステップ５２０］テンプレート６０４の☆２０２☆を現在行の［前処理２０２］の格納値に置換える。
［ステップ５２１］テンプレート６０４のｐｏｓｔｆｕｎｃ（◇）の◇をｐｏｓｔｆｕｎｃの引数文字列に置換える。
［ステップ５２２］置換え後のテンプレート６０４を出力する。
［ステップ５２３］テンプレート６０５を出力する。
［ステップ５２４］テンプレート６０６の◆にｂｏｏｌｅａｎ  ｍ＊（＊＝１，２，３・・・処理順チェインの個数−１）を列挙したものに置換えて出力する。
［ステップ５２５］処理順チェインの末尾を現在行にする。
［ステップ５２６］ｎに処理順チェインの個数−１をセットする。
［ステップ５２７］現在行の［後処理２０４］が空欄か空欄でないかを判定する。空欄の場合は［ステップ５２８］に進む。空欄でない場合には［ステップ５２９］に進む。
［ステップ５２８］処理順チェインで１つ前の行を現在行にする。
［ステップ５２９］テンプレート６０７の△部分をｎ番目の引数名に置換える。
［ステップ５３０］テンプレート６０７の☆２０４☆を現在行の［後処理２０４］の格納値に置換える。
［ステップ５３１］テンプレート２０４を出力する。
［ステップ５３２］ｎから１を引く。
［ステップ５３３］ｎは０か判定する。０であれば［ステップ５３５］に進む。０でなければ［ステップ５３４］に進む。
［ステップ５３４］処理順チェインでの１つ前の行を現在行にし、［ステップ５２７］に戻る。
［ステップ５３５］テンプレート６０８を出力し、処理を終了する。
【００３１】
以上のように、制御構造テーブル４ｃに格納された論理構造に従って、出力テンプレートを書き換えると共に整序することで、ネストの低減されたｉｆ文を編集することができる。
【００３２】
<動作の説明>
<動作の原理>は上記の如くであるが、本発明のプログラム及び方法は編集前のソースコード７０１から編集完了後のソースコード７０５を作り出すものであり、本実施形態によるプログラム及び方法の手順を以下に説明する。
本発明のネスティングを低減したｉｆ文を自動編集するプログラムおよびネスティングしていないｉｆ文を自動編集する方法は次の手順を含む。（１）制御構造テーブル４ｃを作成する。制御構造テーブル４ｃとは、ネストしたｉｆ文の論理構造をテーブルにまとめたものである。（２）制御構造テーブル４ｃからテンプレートを用いてｉｆ文を編集する。
【００３３】
これらの編集作業は編集処理部５によって行われる。以下、動作を図２を用いて順に説明する。
（１）制御構造テーブル４ｃの作成：
制御構造テーブル４ｃの構成を説明する。
制御構造テーブル４ｃは、制御構造テーブル４ｃの行番号に一意に振られた識別番号「＃２０１」と、ｉｆ文を実行する前に行う処理を格納する「前処理２０２」と、前処理の行数を格納する「行数２０３」と、ｉｆ文を実行した後に行う処理を格納する「後処理２０４」と、後処理の行数を格納する「行数２０５」と、ｉｆ文の条件式を格納する「条件式２０６」と、条件文及び｛｝が記述される行数を格納する「行数２０７」と、条件式が真の場合に行う、制御構造テーブル４ｃの識別番号を表す「真の実行先２０８」と、「真の行き先２０８」で実行される行数を表す「行数２０９」と、条件式が偽の場合に行う、制御構造テーブル４ｃの識別番号を表す「偽の実行先２１０」と、「偽の実行先２１０」で実行される行数を表す「行数２１１」と、編集処理によってｉｆ文の条件文の実行順序が変更されるかどうかを格納する「真偽の順２１２」を有する。「真偽の順２１２」がｔｒｕｅであったら編集後の条件式は編集前の条件式の否定条件式になる。ｆａｌｓｅであったら編集前の条件式のままである。
【００３４】
ソースコード上の１条件文に対して、制御構造テーブル４ｃの１行が対応する。ただし［メイン処理］［後処理ｎ］（ｎは正の整数）は条件文がない行として格納される。
【００３５】
ｉｆ文の分割と制御構造テーブル４ｃの作成方法を、図４を用いて説明する。
編集処理部５は、先ず初期処理として制御構造テーブル４ｃの先頭行を用意し、その先頭行の［＃２０１］に１を格納し、残りは空欄にする。次に、編集前ソースコード４ａの指定されたモジュールを読み込み、最初のｉｆ文の前にある前処理の部分を制御構造テーブル４ｃの前記先頭行の［前処理２０２］に文字列として書き込む［ステップ４０１］。
【００３６】
編集処理部５は、ｉｆ文の条件式の部分を、制御構造テーブル４ｃで現在書き込みを行っている行（以下、現在行）の［条件式２０６］に格納する。また、ｉｆ文では"ｉｆ（）｛"と、"｝ｅｌｓｅ｛"と、"｝"で３行消費しているので、現在行の［行数２０７］に「３」を格納する［ステップ４０２］。
【００３７】
ｉｆ文で真と判定された場合に実行されるブロックすなわち図４のＢの部分については、編集処理部５は、制御構造テーブルに１行追加し、まず当該の追加した行の「＃２０１」に一意的に定めた値、例えば「２」を格納し、次に当該の追加した行の［前処理２０２］に前記Ｂの部分を格納するとともに、現在行（この例では「＃２０１」が「１」の行）の「真の実行先２０８」に追加した行の「＃２０１」の値を格納する［ステップ４０３］。
【００３８】
同様に、ｉｆ文で真と判定された場合に実行されるブロックすなわち図４のＣの部分については、編集処理部５は、制御構造テーブルに１行追加し、まず当該の追加した行の「＃２０１」に一意的に定めた値、例えば「３」を格納し、次に当該の追加した行の［前処理２０２］に前記Ｃの部分を格納するとともに、現在行（この例では「＃２０１」が「１」の行）の「偽の実行先２０８」に追加した行の「＃２０１」の値を格納する［ステップ４０４］。
【００３９】
編集処理部５は、ｉｆ文より後方のブロックすなわち図４のＤの部分を現在行（この例では「＃２０１」が「１」の行）の［後処理２０４］に格納する［ステップ４０５］。
このように、編集処理部５は、指定されたモジュールを上の行から順に読み、ｉｆ文が見つかるたびに上記図４の動作を、ｉｆ文がなくなるまで繰り返す。
【００４０】
次に、編集処理部５は、制御テーブル４ｃの［行数２０３］、［行数２０５］、［行数２０９］、［行数２１１］を計算して格納する。
［行数２０３］と［行数２０５］についてはそれぞれ各行の［前処理２０２］、編集処理部５は、［前処理２０４］を取り出し、改行コードの個数を数えて各行数を数えて取得する。
［行数２０９］と［行数２１１］については、編集処理部５は、それぞれの実行先のブロックの改行コードを数えて取得する。
【００４１】
編集処理部５は、任意の行の［行数２０９］と［行数２１１］を次のように取得する。当該の行の［真の実行先２０８］の格納値を取り出し、その値と識別番号［＃２０１］が一致する行を検索し、その行の［行数２０３］と［行数２０７］と［行数２０９］と［行数２１１］の和を計算し、当該の行の［行数２０９］に格納する。もし、［真の実行先］の格納値が空欄であった場合には「０」を［行数２０９］に格納する。［行数２１１］についても［偽の実行先２１０］から格納値を取り出し、その値と識別番号［＃２０１］が一致する行を検索し、その行の［行数２０３］と［行数２０７］と［行数２０９］と［行数２１１］の和を計算し、当該の行の［行数２１１］に格納する。
【００４２】
次に、編集処理部５は、当該の行の［条件式２０６］が空欄の場合は［真偽の順２１２］は空欄にし、当該の行の［条件式２０６］が空欄以外で、その行にある［行数２０９］が［行数２１１］より大きいなら［真偽の順２１２］をｆａｌｓｅとし、［行数２０９］が［行数２１１］より大きくないならｔｒｕｅを格納する。
【００４３】
このように、［真偽の順２１２］を参照すれば、その値がｆａｌｓｅであるときはｉｆ文の条件文が偽のときに行うブロックの行数が少ないことがわかり、その値がｔｒｕｅのときはｉｆ文の条件文が真のときに行うブロックの行数が少ないことがわかるので、ｉｆ文の条件文が真偽のどちらの場合が実行する行数が少ないか、つまりどちらが簡明かを判断することができる。
【００４４】
（２）制御構造テーブル４ｃからのテンプレートを用いたｉｆ文の編集：
次に、この制御構造テーブル４ｃを用いて、編集後のソースコードを出力する。出力処理は次のような手順で行われる。
まず編集処理部５は、制御構造テーブルから前処理の処理順チェインを作成する。処理順チェインとは、編集後におけるソースコードの処理の記述順を表す。まず、制御構造テーブル４ｃの先頭行の［真偽の順２１２］を参照し、これがｔｒｕｅなら［偽の実行先２１０］の値が指す行、ｆａｌｓｅなら［真の実行先２０８］の値が指す行を求める。次に求めた行について同様の参照を行い、［真偽の順２１２］が空欄になるまで繰り返す。
【００４５】
その具体例を、図２の例で説明すると、制御構造テーブル４ｃの先頭行の［真偽の順２１２］はｆａｌｓｅであるので、同じ行の［真の実行先２０８］を参照すると「２」が格納されている。そこで、［#２０１］が「２」の行について［真偽の順２１２］を参照するとｆａｌｓｅなので、同じ行の［真の実行先２０８］を参照すると「４」が格納されている。そこで、［#２０１］が「４」の行について［真偽の順２１２］を参照するとｆａｌｓｅなので、同じ行の［真の実行先２０８］を参照すると「６」が格納されている。そこで、［#２０１］が「６」の行について［真偽の順２１２］を参照すると空欄になっている。この手順により、［#２０１］の値が１→２→４→６の順で、制御が遷移する事がわかり、これが処理順チェインになる。
【００４６】
処理順チェイン１→２→４→６の［前処理２０２］を見ると［前処理１］→［前処理２］→［前処理３］→［メイン処理］の順になり、これが編集後のソースコードの並び順になる。また後処理については、上記順を逆順（６→４→２→１）にし、［後処理２０２］を参照すると［後処理３］→［後処理２］→［後処理１］の順になり、これが編集後の後処理のモジュール内での並び順になる。
【００４７】
このように構成することで、編集処理部５は、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方をたどることができる。
【００４８】
次に、編集処理部５は、処理順チェインの個数−１だけｆａｌｓｅを繰り返した文字列をｐｏｓｔｆｕｎｃ（）の呼び出しの引数文字列としてメモリ上に作成する。図２の場合は処理順チェイン１→２→４→６は個数が４なので引数文字列は"ｆａｌｓｅ，ｆａｌｓｅ，ｆａｌｓｅ"となる。この変数は図５の［ステップ５１０］、［ステップ５１７］を通るたびに、"ｆａｌｓｅ，ｆａｌｓｅ，ｆａｌｓｅ"→"ｔｒｕｅ，ｆａｌｓｅ，ｆａｌｓｅ"→"ｔｒｕｅ，ｔｒｕｅ，ｆａｌｓｅ" →"ｔｒｕｅ，ｔｒｕｅ，ｔｒｕｅ"と変更される。
【００４９】
次に編集処理部５は、図６のテンプレートを用いてソースコードを編集する。
編集処理部５は、テンプレート６０１の▽の部分を編集前関数名に置換えて出力する。この部分が編集後関数の冒頭部分になる。
【００５０】
編集処理部５は、以降は処理順チェインをたどって出力する。まず、処理順チェインの先頭行を制御構造テーブル４ｃの現在行にする。図２の場合では［＃２０１］が１の行が現在行になる。
次に、現在行の［真偽の順２１２］を参照する。もし、現在行の［真偽の順２１２］がｆａｌｓｅならテンプレート６０２を編集したものを出力し（図５［ステップ５０６］〜［ステップ５１２］）、ｔｒｕｅならテンプレート６０３を編集したものを出力し（図５［ステップ５１３］〜［ステップ５１９］）、空欄ならテンプレート６０４を編集したものを出力する（図５［ステップ５２０］〜［ステップステップ５２２］）。
【００５１】
このように構成することで、編集処理部５は、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方を、条件式が真のときに行うように、条件式の真偽の条件を入れ替えることができる。このため、編集後のｉｆ文のロジックが簡明になり、ネストを浅くすることが可能になる。
【００５２】
また、編集処理部５は、現在行の［真偽の順２１２］がｆａｌｓｅまたはｔｒｕｅの場合は、処理順チェインに後続の処理があるので、処理順チェインの次の行を現在行にして［ステップ５０５］に戻り（図５［ステップ５１２］，［ステップ５１９］）、現在行の［真偽の順２１２］が空欄なら処理順チェインが終了するので、処理の繰り返しを抜ける（図５［ステップ５２３］）。
【００５３】
これを図２の例で説明すると、処理順チェイン１→２→４→６の各々について［真偽の順２１２］はｆａｌｓｅ，ｆａｌｓｅ，ｆａｌｓｅ，（空欄）がそれぞれ格納されている。従って編集処理部５は、［＃２０１］が１，２，４の行は図５［ステップ５０６］〜［ステップ５１２］を３回繰り返し、［＃２０１］が６の行は図６［ステップ５２０］〜［ステップ５２２］を行って繰り返し処理を抜ける。
【００５４】
具体的には、編集処理部５は以下のようにｉｆ文を編集する。
［＃２０１］が１の場合は、テンプレート６０３内の☆２０２☆を［前処理１］に、☆２０６☆を［条件式１］に、★２１０−２０２★を［エラー処理１］に、◇を"ｆａｌｓｅ，ｆａｌｓｅ，ｆａｌｓｅ"に置換えたものを出力する。
［＃２０１］が２の場合は、テンプレート６０３内の☆２０２☆を［前処理２］に、☆２０６☆を［条件式２］に、★２１０−２０２★を［エラー処理２］に、◇を"ｔｒｕｅ，ｆａｌｓｅ，ｆａｌｓｅ"に置換えたものを出力する。
［＃２０１］が４の場合は、テンプレート６０３内の☆２０２☆を［前処理３］に、☆２０６☆を［条件式３］に、★２１０−２０２★を［エラー処理３］に、◇を"ｔｒｕｅ，ｔｒｕｅ，ｆａｌｓｅ"に置換えたものを出力する。
［＃２０１］が６の場合は、テンプレート６０４内の☆２０２☆を［メイン処理］に、◇を"ｔｒｕｅ，ｔｒｕｅ，ｔｒｕｅ"に置換えたものを出力する。
【００５５】
続いて、後処理を一括して行うサブ関数ｐｏｓｔｆｕｎｃ（）の出力処理（図６［ステップ５２４］〜［ステップ５３６］）を説明する。
先ず、編集処理部５は、ｐｏｓｔｆｕｎｃ（）の宣言部分を出力する（図６［ステップ５２４］）。図２の例では、処理順チェインの個数は４なので、引数は１を減じて３となり、"ｐｏｓｔｆｕｎｃ（ｂｏｏｌｅａｎ  ｍ1，ｂｏｏｌｅａｎ  ｍ２，ｂｏｏｌｅａｎ  ｍ３）｛"が出力される。
【００５６】
次に編集処理部５は、処理順チェインを逆にたどって、各々テンプレート６０７を編集し出力する。図２の例では、処理順チェインの逆順は６→４→２→１なので、編集処理部５は、［＃２０１］が６，４，２，１の行をこの順で読む。
【００５７】
編集処理部５は、［#２０１］が６の場合では、［後処理２０４］が空欄なので出力しない。［#２０１］が４の場合は、テンプレート６０７内の△を"ｍ３"に、☆２０４☆を［後処理３］に置換えたものを出力する。［#２０１］が２の場合は、テンプレート６０７内の△を"ｍ２"に、☆２０４☆を［後処理２］に置換えたものを出力する。［#２０１］が１の場合は、テンプレート６０７内の△を"ｍ１"に、☆２０４☆を［後処理１］に置換えたものを出力する。
最後に編集処理部５は、テンプレート６０８を出力して編集を終了する（図６［ステップ５３５］）。
【００５８】
このように、編集前ソースコードから制御構造テーブル４ｃを作成し、該制御構造テーブルとテンプレート（図７）を用いて、ｉｆ文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方を、条件式が真のときに行うように、条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えた、編集後ソースコードを出力するように構成したことにより、編集前ソースコードよりネスティングの浅い編集後ソースコードを得ることができる。
【図面の簡単な説明】
【００５９】
【図１】本発明を実施するシステムの全体構成図である。
【図２】制御構造テーブルの例である。
【図３】本発明のプログラム及び方法のフローチャートである。
【図４】ｉｆ文から制御構造テーブルを作成する方法を模式的に示した図である。
【図５】制御構造テーブルからネスティングを低減したｉｆ文を作成するフローチャートである。
【図６】制御構造テーブルからネスティングを低減したｉｆ文を作成する続きのフローチャートである。
【図７】ｉｆ文のテンプレートを示した図である。
【図８】ネスティングしたｉｆ文のネストを低減する手順を表した図である。
【図９】ネスティングしたｉｆ文のネストを低減する手順を表した続きの図である。
【符号の説明】
【００６０】
1：表示装置、２：マウス、３：制御部、４：記憶装置、５：編集処理部、４ａ：編集前ソースコード、４ｂ：編集後ソースコード、４ｃ：制御構造テーブル、４ｄ：出力テンプレート。
【図１】
2006344097.tif 000003
【図２】
2006344097.tif 000004
【図３】
2006344097.tif 000005
【図４】
2006344097.tif 000006
【図５】
2006344097.tif 000007
【図６】
2006344097.tif 000008
【図７】
2006344097.tif 000009
【図８】
2006344097.tif 000010
【図９】
2006344097.tif 000011