JP2006344097A - if文を編集するプログラムおよびif文を編集する方法 - Google Patents

if文を編集するプログラムおよびif文を編集する方法 Download PDF

Info

Publication number
JP2006344097A
JP2006344097A JP2005170350A JP2005170350A JP2006344097A JP 2006344097 A JP2006344097 A JP 2006344097A JP 2005170350 A JP2005170350 A JP 2005170350A JP 2005170350 A JP2005170350 A JP 2005170350A JP 2006344097 A JP2006344097 A JP 2006344097A
Authority
JP
Japan
Prior art keywords
statement
true
false
executed
editing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
JP2005170350A
Other languages
English (en)
Inventor
Shusuke Hanzawa
秀典 半沢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Information Systems Ltd
Original Assignee
Hitachi Information Systems Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Information Systems Ltd filed Critical Hitachi Information Systems Ltd
Priority to JP2005170350A priority Critical patent/JP2006344097A/ja
Publication of JP2006344097A publication Critical patent/JP2006344097A/ja
Withdrawn legal-status Critical Current

Links

Images

Abstract

【課題】ネストしたif文をよりネストの浅いif文に自動的に編集する。
【解決手段】ネスティングしていないif文のテンプレートを備えるコンピューターに、ソースコード中のネスティングしているif文の論理構造を、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方はどちらであるかを示す真偽の順と共に、制御構造テーブルに書き出し、前記制御構造テーブルに従い、前記テンプレートを用いることにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成する。
【選択図】図3

Description

本発明は、プログラムのソースコードに含まれるif文を編集するプログラムおよびif文を編集する方法に係り、特にネスティングしたif文をネスティングを低減させた形に自動編集するプログラムおよび編集する方法に関する。
一般に、コンピューターを動作させるためのプログラムはJAVA(登録商標)言語やC言語のような高級言語でソースプログラムを記述し、このソースプログラムをコンパイルして実行形式のコードに変換してコンピューターに実行させる。
ソースコードは条件分岐、繰り返し、連接構造などのロジックを組み合わせることで、所望の動作をするように記述される。
前記の言語などの条件分岐はif文で記述され、そのif文は例えば、
if(条件文){条件が真だったときの処理}else{条件が偽だったときの処理}のように記述される。また、if文の中に、さらにif文を記述することもできる。これをネスティングという。
ソースコードの記述はロジックを読みやすく記述することが、不具合を見つけやすくしたり、プログラムの仕様変更を容易にしたりするために、重要である。
しかし、開発の現場では、ソースコードを読みやすく記述することは、開発期間の制約や、開発者の良識にまかされている事もあって、軽視されていて充分に行われておらず、複雑にネスティングしたif文が記述される傾向にある。このため、不具合の検出や仕様変更による修正作業を困難にしている。
これに対する対策として、さまざまな特許出願がなされている。例えば、特許文献1にはメモリーリーク対策として、メモリのアロックやフリーについて処理漏れがあるかどうかを検出する方法であって、ソースコードのうちメモリ管理に関するロジックだけを抽出して表示色や輝度を変えて表示する方法が開示されている。
特開2002-288004号公報
JAVA(登録商標)言語やC言語などの高級言語によって書かれたソースコードにおいては、if文のネストが深くなりすぎると読みづらくなり、不具合を見つけにくくなったり、仕様変更による修正作業がしづらくなったりする。
前述の特許文献1において開示されている方法は、メモリ管理に関するものであり、if文のネストを浅くすることはできないと言う不具合があった。
本発明の目的は、前述の従来技術による不具合を除去することであり、if文のネスティングを当初のif文よりも低減することができるif文を編集するプログラムおよびif文を編集する方法を提供することにある。
前記目的を達成するために請求項1記載の発明は、if文を編集するプログラムであって、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびif文の論理構造を表した制御構造テーブルおよびif文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
ソースコード中のネスティングしているif文の論理構造と、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成機能と、
前記制御構造テーブルに従い、前記テンプレートを用いることにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成するif文編集機能を実現させることを特徴とする。
また、請求項2記載の発明は、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびif文の論理構造を格納した制御構造テーブルおよびif文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターのif文を編集する方法であって、
ソースコード中のネスティングしているif文の論理構造と、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成手順と、
前記制御構造テーブルに格納されたif文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成するif文編集手順を実行させることを特徴とする。
本発明によるネスティングを低減したif文を編集するプログラムおよびネスティングを低減したif文を編集する方法は、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびif文の論理構造を格納した制御構造テーブルおよびif文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
ソースコード中のネスティングしているif文の論理構造と、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順とを制御構造テーブルに書き出す制御構造テーブル作成機能と、前記制御構造テーブルに格納されたif文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成するif文編集機能を実現させるので、編集前のif文に比べてネストが浅く読みやすいif文を自動編集できる。
以下、本発明によるネスティングを低減したif文を編集するプログラムおよびネスティングを低減したif文を編集する方法の一実施形態を図面を参照して詳細に説明する。
図1は、本発明を実施するシステムの全体構成図である。
図2は、制御構造テーブルの例である。
図3は、本発明のプログラム及び方法のフローチャートである。
図4は、if文から制御構造テーブルを作成する方法を模式的に示した図である。
図5は、制御構造テーブルからネスティングを低減したif文を作成するフローチャートである。
図6は、制御構造テーブルからネスティングを低減したif文を作成する続きのフローチャートである。
図7は、if文のテンプレートを示した図である。
図8は、ネスティングしたif文のネストを低減する手順を表した図である。
図9は、ネスティングしたif文のネストを低減する手順を表した続きの図である。
<構成の説明>
本発明のif文を編集するプログラムおよびif文を編集する方法を実施するコンピューターシステムの全体構成の例を、図1を用いて説明する。
このif文を編集するプログラムおよびif文を編集する方法を実施するコンピューターシステムは、コンピューター本体である制御部3と、この制御部3に接続されるディスプレイなどの表示装置1と、ポインティングデバイスのマウス2と、記憶装置4から構成されている。制御部3にはif文を編集する編集処理部5が設けられている。記憶装置4は、編集前のソースコードである編集前ソースコード4aと、編集後のソースコードである編集後ソースコード4bと、ネスティングしたif文の構造をまとめた表である制御構造テーブル4cと、if文を編集する際に使用するif文のテンプレートである出力テンプレート4dを格納している。
<動作の順序>
前記編集処理部5はネストしたif文を編集してネストを低減したif文を作成するものである。この編集処理部5の動作の順序を、図3を用いて説明する。
まず、ソースコードを読み込む読み込み処理を行う[ステップ301]。ソースコードの読み込みはマウス等で読み込み範囲を指定しても良い。次に、if文内の処理を分割し順次制御構造テーブル4cに書き込んでゆく、処理の分割を行う[ステップ302]。次に、分割されたif文の各ブロックの行数を算出する行数の算出を行う[ステップ303]。さらに、編集処理における条件文の真偽の順をそのままにするかどうかの判定である真偽の順の判定を行う[ステップ304]。最後に、if文を編集して出力する出力処理を行う。
<動作の原理>
本発明によるネスティングを有するif文のネストの低減手順を、図8〜9を用いて例を示しながら説明する。
まず、図8を用いて説明する。
ソースコード701においてモジュールfunc()が図示の如く定義されている。モジュールfunc()は、[メイン処理]710を行うモジュールであるが、[メイン処理]の前に[前処理1]と[前処理2]と[前処理3]を行い、さらに[メイン処理]の後に[後処理1]と[後処理2]と[後処理3]を行う。
このソースコード701に更に詳しく見てみると、[前処理1]の直後に[条件式1]が、[前処理2]の直後に[条件式2]が、[前処理3]の直後に[条件式3]が、それぞれ配置されている。それぞれの条件式では、その条件式が真と判定した場合は次の処理に進み、偽と判定した場合には、それぞれ[エラー処理1]、[エラー処理2]、[エラー処理3]を行いモジュールfunc()の処理を終了する。
また、ソースコード701においては、[前処理1]が行われている場合にはモジュールfunc()が終了する前に[後処理1]を行い、[前処理2]が行われている場合にはモジュールfunc()が終了する前に[後処理2]を行い、[前処理3]が行われている場合にはモジュールfunc()が終了する前に[後処理3]を行う。
このように、ソースコード701ではif文が3重にネストしている。また、[前処理1][前処理2][前処理3][後処理1][後処理2][後処理3][メイン処理]はソースコードのステップ数が数行から数十行になることもある。
次に、ソースコード701の編集方法について説明する。
先ず、if文において、条件式が真のときに行うブロックのステップ数と条件式が偽のときに行うブロックのステップ数を比較して、ステップ数が少ない方が、条件式が真の時に実行されるように、条件式の真偽の変更と条件式が真のときに行うブロックと条件式が偽のときに行うブロックを交換する。
ソースコード701の場合、各条件式が真のときに行うブロックの方が、各条件式が偽のときに行うブロックである[エラー処理1]、[エラー処理2]、[エラー処理3]よりも長いため、条件式の真偽の変更と各ブロックの交換を行い、その結果はソースコード702となる。このように、条件式が真の場合それを偽にするとは、単なる([条件式])を([条件式]==false)と変更すればよい。この処理を全てのif文について適用したものがソースコード702である。
ソースコード701、ソースコード702では、例えば最初のif文の判定が偽だったときには[エラー処理1]を行い当該のif文を抜けて[後処理1]を行うようにプログラムされている。ソースコード703では([条件式]==false)が真だったとき、各[エラー処理]の後にif文を抜けるためのreturn;を追加する。
ソースコード703では([条件式]==false)が真だったときはelse以降のステートメントを通過しないため、else文を指定しなくても論理的に変わらないので削除する。削除の結果がソースコード704である。else文を削除したため括弧"{"、"}"のネストが少なくなっている。
続いて図9を用いて、引き続きソースコードの編集方法を説明する。
ソースコード704では[後処理1][後処理2][後処理3]が何箇所にも記載されていて冗長である。そこで、[後処理1][後処理2][後処理3]を連続して行う専用のサブモジュールpostfunc()を用意し、それを必要箇所で呼ぶように変更すると、ソースコード705のように編集が完了したソースコードになる。
postfunc()内部で[後処理1][後処理2][後処理3]それぞれを行うかどうかはboolean型の引数でpostfunc()に渡される。渡される引数の数はpostfunc()内部で行われる処理の数と同じである。ソースコード705の例では、処理の数は[後処理1][後処理2][後処理3]の3つなので、boolean型の引数は3つになる。
以上説明したように、ネストしたif文は、条件文が真である場合に実行されるブロックの行数を少なくし、else句を用いないようにし、if文の後処理を、サブ関数などを用いるなどしてif文内の行数を減らすと、ネストが低減され、見やすく論理構造がわかりやすいif文になる。
<テンプレートの説明>
図1の出力テンプレート4dは、制御構造テーブル4cからif文を編集するときに用いられるもので、出力テンプレート4dの一部を制御構造テーブル4cに格納されている値で置換え、同時に整序することでif文を編集するためのものである。また同時に、重複して記述される処理をサブ関数にまとめてif文内に配置することによりネスティングを低減させるためにも、出力テンプレートは利用される。
以下、テンプレートの実施例として図7の出力テンプレートを順に説明する。
[テンプレート601]は"▽{"であり、関数の先頭に用いる。
[テンプレート602]は
"☆202☆
if(☆206☆==true){
★208−202★
postfunc(◇)
return
}"
であり、[真偽の順212]がtrueの場合に用いる。
[テンプレート603]は
"☆202☆
if(☆206☆==false){
★210−202★
postfunc(◇)
return
}"
であり、[真偽の順212]がfalseの場合に用いる。
[テンプレート604]は
"☆202☆
postfunc(◇)"
であり、[真偽の順212]が空欄の場合に用いる。
[テンプレート605]は
"}"であり、関数末尾に用いる。
[テンプレート606]は
"postfunc(◆){"
であり、サブ関数の開始に用いられる。
[テンプレート607]は
"if(△==true){
☆204☆
}"
であり、後処理に用いられる。
[テンプレート608]は
"}"
であり、サブ関数の終了に用いられる。
<プログラムの説明>
if文を制御構造テーブル4cから編集するプログラムを、図5及び図6を用いて説明する。
先ず、図5を説明する。
[ステップ501]制御構造テーブルから前処理の処理順チェインを作成する。
[ステップ502]処理順チェインの個数−1だけfalseを繰り返した文字列をposstfunc()引数文字列として作成する。
[ステップ503]テンプレート601の▽の部分を編集前の関数名に置換えて出力する。
[ステップ504]処理順チェインの先頭を現在行にする。
[ステップ505]現在行の[真偽の順]がfalseなのか、trueなのか、空欄なのかの判定を行う。falseのときは[ステップ506]へ、trueのときは[ステップ513]へ、空欄のときは第6図[ステップ520]へ進む。
[ステップ506]テンプレート603の☆202☆を現在行の[前処理202]の格納値に置換える。
[ステップ507]テンプレート603の☆206☆を現在行の[条件式206]の格納値に置換える。
[ステップ508]現在行の[偽の実行先210]に対し[#201]の値が一致する行を検索し、その[前処理202]の格納値に、テンプレート603の★210−202★を置換える。
[ステップ509]テンプレート603のpostfunc(◇)の◇をpostfuncの引数文字列に置換える。
[ステップ510]postfuncの引数文字列の最初のfalseをtrueに変更する。
[ステップ511]置換え後のテンプレート603を出力する。
[ステップ512]処理順チェインの次の行を現在行にし、[ステップ505]に戻る。
[ステップ513]テンプレート602の☆202☆を現在行の[前処理202]の格納値に置換える。
[ステップ514]テンプレート602の☆206☆を現在行の[条件式206]の格納値に置換える。
[ステップ515]現在行の[真の実行先208]に対し[#201]の値が一致する行を検索し、その[前処理202]の格納値に、テンプレート603の★208−202★に置換える。
[ステップ516]テンプレート602のpostfunc(◇)の◇をpostfuncの引数文字列に置換える。
[ステップ517]postfuncの引数文字列の最初のfalseをtrueに変更する。
[ステップ518]置換え後のテンプレートを出力する。
[ステップ519]処理順チェインの次の行を現在行にする。
続いて、図6を説明する。
[ステップ520]テンプレート604の☆202☆を現在行の[前処理202]の格納値に置換える。
[ステップ521]テンプレート604のpostfunc(◇)の◇をpostfuncの引数文字列に置換える。
[ステップ522]置換え後のテンプレート604を出力する。
[ステップ523]テンプレート605を出力する。
[ステップ524]テンプレート606の◆にboolean m*(*=1,2,3・・・処理順チェインの個数−1)を列挙したものに置換えて出力する。
[ステップ525]処理順チェインの末尾を現在行にする。
[ステップ526]nに処理順チェインの個数−1をセットする。
[ステップ527]現在行の[後処理204]が空欄か空欄でないかを判定する。空欄の場合は[ステップ528]に進む。空欄でない場合には[ステップ529]に進む。
[ステップ528]処理順チェインで1つ前の行を現在行にする。
[ステップ529]テンプレート607の△部分をn番目の引数名に置換える。
[ステップ530]テンプレート607の☆204☆を現在行の[後処理204]の格納値に置換える。
[ステップ531]テンプレート204を出力する。
[ステップ532]nから1を引く。
[ステップ533]nは0か判定する。0であれば[ステップ535]に進む。0でなければ[ステップ534]に進む。
[ステップ534]処理順チェインでの1つ前の行を現在行にし、[ステップ527]に戻る。
[ステップ535]テンプレート608を出力し、処理を終了する。
以上のように、制御構造テーブル4cに格納された論理構造に従って、出力テンプレートを書き換えると共に整序することで、ネストの低減されたif文を編集することができる。
<動作の説明>
<動作の原理>は上記の如くであるが、本発明のプログラム及び方法は編集前のソースコード701から編集完了後のソースコード705を作り出すものであり、本実施形態によるプログラム及び方法の手順を以下に説明する。
本発明のネスティングを低減したif文を自動編集するプログラムおよびネスティングしていないif文を自動編集する方法は次の手順を含む。(1)制御構造テーブル4cを作成する。制御構造テーブル4cとは、ネストしたif文の論理構造をテーブルにまとめたものである。(2)制御構造テーブル4cからテンプレートを用いてif文を編集する。
これらの編集作業は編集処理部5によって行われる。以下、動作を図2を用いて順に説明する。
(1)制御構造テーブル4cの作成:
制御構造テーブル4cの構成を説明する。
制御構造テーブル4cは、制御構造テーブル4cの行番号に一意に振られた識別番号「#201」と、if文を実行する前に行う処理を格納する「前処理202」と、前処理の行数を格納する「行数203」と、if文を実行した後に行う処理を格納する「後処理204」と、後処理の行数を格納する「行数205」と、if文の条件式を格納する「条件式206」と、条件文及び{}が記述される行数を格納する「行数207」と、条件式が真の場合に行う、制御構造テーブル4cの識別番号を表す「真の実行先208」と、「真の行き先208」で実行される行数を表す「行数209」と、条件式が偽の場合に行う、制御構造テーブル4cの識別番号を表す「偽の実行先210」と、「偽の実行先210」で実行される行数を表す「行数211」と、編集処理によってif文の条件文の実行順序が変更されるかどうかを格納する「真偽の順212」を有する。「真偽の順212」がtrueであったら編集後の条件式は編集前の条件式の否定条件式になる。falseであったら編集前の条件式のままである。
ソースコード上の1条件文に対して、制御構造テーブル4cの1行が対応する。ただし[メイン処理][後処理n](nは正の整数)は条件文がない行として格納される。
if文の分割と制御構造テーブル4cの作成方法を、図4を用いて説明する。
編集処理部5は、先ず初期処理として制御構造テーブル4cの先頭行を用意し、その先頭行の[#201]に1を格納し、残りは空欄にする。次に、編集前ソースコード4aの指定されたモジュールを読み込み、最初のif文の前にある前処理の部分を制御構造テーブル4cの前記先頭行の[前処理202]に文字列として書き込む[ステップ401]。
編集処理部5は、if文の条件式の部分を、制御構造テーブル4cで現在書き込みを行っている行(以下、現在行)の[条件式206]に格納する。また、if文では"if(){"と、"}else{"と、"}"で3行消費しているので、現在行の[行数207]に「3」を格納する[ステップ402]。
if文で真と判定された場合に実行されるブロックすなわち図4のBの部分については、編集処理部5は、制御構造テーブルに1行追加し、まず当該の追加した行の「#201」に一意的に定めた値、例えば「2」を格納し、次に当該の追加した行の[前処理202]に前記Bの部分を格納するとともに、現在行(この例では「#201」が「1」の行)の「真の実行先208」に追加した行の「#201」の値を格納する[ステップ403]。
同様に、if文で真と判定された場合に実行されるブロックすなわち図4のCの部分については、編集処理部5は、制御構造テーブルに1行追加し、まず当該の追加した行の「#201」に一意的に定めた値、例えば「3」を格納し、次に当該の追加した行の[前処理202]に前記Cの部分を格納するとともに、現在行(この例では「#201」が「1」の行)の「偽の実行先208」に追加した行の「#201」の値を格納する[ステップ404]。
編集処理部5は、if文より後方のブロックすなわち図4のDの部分を現在行(この例では「#201」が「1」の行)の[後処理204]に格納する[ステップ405]。
このように、編集処理部5は、指定されたモジュールを上の行から順に読み、if文が見つかるたびに上記図4の動作を、if文がなくなるまで繰り返す。
次に、編集処理部5は、制御テーブル4cの[行数203]、[行数205]、[行数209]、[行数211]を計算して格納する。
[行数203]と[行数205]についてはそれぞれ各行の[前処理202]、編集処理部5は、[前処理204]を取り出し、改行コードの個数を数えて各行数を数えて取得する。
[行数209]と[行数211]については、編集処理部5は、それぞれの実行先のブロックの改行コードを数えて取得する。
編集処理部5は、任意の行の[行数209]と[行数211]を次のように取得する。当該の行の[真の実行先208]の格納値を取り出し、その値と識別番号[#201]が一致する行を検索し、その行の[行数203]と[行数207]と[行数209]と[行数211]の和を計算し、当該の行の[行数209]に格納する。もし、[真の実行先]の格納値が空欄であった場合には「0」を[行数209]に格納する。[行数211]についても[偽の実行先210]から格納値を取り出し、その値と識別番号[#201]が一致する行を検索し、その行の[行数203]と[行数207]と[行数209]と[行数211]の和を計算し、当該の行の[行数211]に格納する。
次に、編集処理部5は、当該の行の[条件式206]が空欄の場合は[真偽の順212]は空欄にし、当該の行の[条件式206]が空欄以外で、その行にある[行数209]が[行数211]より大きいなら[真偽の順212]をfalseとし、[行数209]が[行数211]より大きくないならtrueを格納する。
このように、[真偽の順212]を参照すれば、その値がfalseであるときはif文の条件文が偽のときに行うブロックの行数が少ないことがわかり、その値がtrueのときはif文の条件文が真のときに行うブロックの行数が少ないことがわかるので、if文の条件文が真偽のどちらの場合が実行する行数が少ないか、つまりどちらが簡明かを判断することができる。
(2)制御構造テーブル4cからのテンプレートを用いたif文の編集:
次に、この制御構造テーブル4cを用いて、編集後のソースコードを出力する。出力処理は次のような手順で行われる。
まず編集処理部5は、制御構造テーブルから前処理の処理順チェインを作成する。処理順チェインとは、編集後におけるソースコードの処理の記述順を表す。まず、制御構造テーブル4cの先頭行の[真偽の順212]を参照し、これがtrueなら[偽の実行先210]の値が指す行、falseなら[真の実行先208]の値が指す行を求める。次に求めた行について同様の参照を行い、[真偽の順212]が空欄になるまで繰り返す。
その具体例を、図2の例で説明すると、制御構造テーブル4cの先頭行の[真偽の順212]はfalseであるので、同じ行の[真の実行先208]を参照すると「2」が格納されている。そこで、[#201]が「2」の行について[真偽の順212]を参照するとfalseなので、同じ行の[真の実行先208]を参照すると「4」が格納されている。そこで、[#201]が「4」の行について[真偽の順212]を参照するとfalseなので、同じ行の[真の実行先208]を参照すると「6」が格納されている。そこで、[#201]が「6」の行について[真偽の順212]を参照すると空欄になっている。この手順により、[#201]の値が1→2→4→6の順で、制御が遷移する事がわかり、これが処理順チェインになる。
処理順チェイン1→2→4→6の[前処理202]を見ると[前処理1]→[前処理2]→[前処理3]→[メイン処理]の順になり、これが編集後のソースコードの並び順になる。また後処理については、上記順を逆順(6→4→2→1)にし、[後処理202]を参照すると[後処理3]→[後処理2]→[後処理1]の順になり、これが編集後の後処理のモジュール内での並び順になる。
このように構成することで、編集処理部5は、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方をたどることができる。
次に、編集処理部5は、処理順チェインの個数−1だけfalseを繰り返した文字列をpostfunc()の呼び出しの引数文字列としてメモリ上に作成する。図2の場合は処理順チェイン1→2→4→6は個数が4なので引数文字列は"false,false,false"となる。この変数は図5の[ステップ510]、[ステップ517]を通るたびに、"false,false,false"→"true,false,false"→"true,true,false" →"true,true,true"と変更される。
次に編集処理部5は、図6のテンプレートを用いてソースコードを編集する。
編集処理部5は、テンプレート601の▽の部分を編集前関数名に置換えて出力する。この部分が編集後関数の冒頭部分になる。
編集処理部5は、以降は処理順チェインをたどって出力する。まず、処理順チェインの先頭行を制御構造テーブル4cの現在行にする。図2の場合では[#201]が1の行が現在行になる。
次に、現在行の[真偽の順212]を参照する。もし、現在行の[真偽の順212]がfalseならテンプレート602を編集したものを出力し(図5[ステップ506]〜[ステップ512])、trueならテンプレート603を編集したものを出力し(図5[ステップ513]〜[ステップ519])、空欄ならテンプレート604を編集したものを出力する(図5[ステップ520]〜[ステップステップ522])。
このように構成することで、編集処理部5は、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方を、条件式が真のときに行うように、条件式の真偽の条件を入れ替えることができる。このため、編集後のif文のロジックが簡明になり、ネストを浅くすることが可能になる。
また、編集処理部5は、現在行の[真偽の順212]がfalseまたはtrueの場合は、処理順チェインに後続の処理があるので、処理順チェインの次の行を現在行にして[ステップ505]に戻り(図5[ステップ512],[ステップ519])、現在行の[真偽の順212]が空欄なら処理順チェインが終了するので、処理の繰り返しを抜ける(図5[ステップ523])。
これを図2の例で説明すると、処理順チェイン1→2→4→6の各々について[真偽の順212]はfalse,false,false,(空欄)がそれぞれ格納されている。従って編集処理部5は、[#201]が1,2,4の行は図5[ステップ506]〜[ステップ512]を3回繰り返し、[#201]が6の行は図6[ステップ520]〜[ステップ522]を行って繰り返し処理を抜ける。
具体的には、編集処理部5は以下のようにif文を編集する。
[#201]が1の場合は、テンプレート603内の☆202☆を[前処理1]に、☆206☆を[条件式1]に、★210−202★を[エラー処理1]に、◇を"false,false,false"に置換えたものを出力する。
[#201]が2の場合は、テンプレート603内の☆202☆を[前処理2]に、☆206☆を[条件式2]に、★210−202★を[エラー処理2]に、◇を"true,false,false"に置換えたものを出力する。
[#201]が4の場合は、テンプレート603内の☆202☆を[前処理3]に、☆206☆を[条件式3]に、★210−202★を[エラー処理3]に、◇を"true,true,false"に置換えたものを出力する。
[#201]が6の場合は、テンプレート604内の☆202☆を[メイン処理]に、◇を"true,true,true"に置換えたものを出力する。
続いて、後処理を一括して行うサブ関数postfunc()の出力処理(図6[ステップ524]〜[ステップ536])を説明する。
先ず、編集処理部5は、postfunc()の宣言部分を出力する(図6[ステップ524])。図2の例では、処理順チェインの個数は4なので、引数は1を減じて3となり、"postfunc(boolean m1,boolean m2,boolean m3){"が出力される。
次に編集処理部5は、処理順チェインを逆にたどって、各々テンプレート607を編集し出力する。図2の例では、処理順チェインの逆順は6→4→2→1なので、編集処理部5は、[#201]が6,4,2,1の行をこの順で読む。
編集処理部5は、[#201]が6の場合では、[後処理204]が空欄なので出力しない。[#201]が4の場合は、テンプレート607内の△を"m3"に、☆204☆を[後処理3]に置換えたものを出力する。[#201]が2の場合は、テンプレート607内の△を"m2"に、☆204☆を[後処理2]に置換えたものを出力する。[#201]が1の場合は、テンプレート607内の△を"m1"に、☆204☆を[後処理1]に置換えたものを出力する。
最後に編集処理部5は、テンプレート608を出力して編集を終了する(図6[ステップ535])。
このように、編集前ソースコードから制御構造テーブル4cを作成し、該制御構造テーブルとテンプレート(図7)を用いて、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方、つまりロジックが簡明な方を、条件式が真のときに行うように、条件式の真偽の条件を入れ替え、条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えた、編集後ソースコードを出力するように構成したことにより、編集前ソースコードよりネスティングの浅い編集後ソースコードを得ることができる。
本発明を実施するシステムの全体構成図である。 制御構造テーブルの例である。 本発明のプログラム及び方法のフローチャートである。 if文から制御構造テーブルを作成する方法を模式的に示した図である。 制御構造テーブルからネスティングを低減したif文を作成するフローチャートである。 制御構造テーブルからネスティングを低減したif文を作成する続きのフローチャートである。 if文のテンプレートを示した図である。 ネスティングしたif文のネストを低減する手順を表した図である。 ネスティングしたif文のネストを低減する手順を表した続きの図である。
符号の説明
1:表示装置、2:マウス、3:制御部、4:記憶装置、5:編集処理部、4a:編集前ソースコード、4b:編集後ソースコード、4c:制御構造テーブル、4d:出力テンプレート。

Claims (2)

  1. if文を編集するプログラムであって、表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびif文の論理構造を格納した制御構造テーブルおよびif文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターに、
    ソースコード中のネスティングしているif文の論理構造と、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成機能と、
    前記制御構造テーブルに格納されたif文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成するif文編集機能を実現させることを特徴とするプログラム。
  2. 表示装置と、マウスと、編集処理部が動作する制御部と、編集前ソースコードおよび編集後ソースコードおよびif文の論理構造を格納した制御構造テーブルおよびif文を構成する要素に分割したテンプレートである出力テンプレートを記憶している記憶装置とを有するコンピューターのif文を編集する方法であって、
    ソースコード中のネスティングしているif文の論理構造と、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち実行行数の少ない方はどちらであるかを示す真偽の順と、を制御構造テーブルに書き出す制御構造テーブル作成手順と、
    前記制御構造テーブルに格納されたif文の論理構造に従い、前記テンプレートを書き換えると同時に整序することにより、if文の条件文が真のときに行うブロックと偽のときに行うブロックのうち、実行行数の少ない方を条件式が真のときに行うように条件式の真偽の条件と条件式が真のときに行うブロックと偽のときに行うブロックとを入れ替えたif文を作成するif文編集手順を実行させることを特徴とする方法。

JP2005170350A 2005-06-10 2005-06-10 if文を編集するプログラムおよびif文を編集する方法 Withdrawn JP2006344097A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2005170350A JP2006344097A (ja) 2005-06-10 2005-06-10 if文を編集するプログラムおよびif文を編集する方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005170350A JP2006344097A (ja) 2005-06-10 2005-06-10 if文を編集するプログラムおよびif文を編集する方法

Publications (1)

Publication Number Publication Date
JP2006344097A true JP2006344097A (ja) 2006-12-21

Family

ID=37641004

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005170350A Withdrawn JP2006344097A (ja) 2005-06-10 2005-06-10 if文を編集するプログラムおよびif文を編集する方法

Country Status (1)

Country Link
JP (1) JP2006344097A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007211060A (ja) * 2006-02-07 2007-08-23 Japan Advanced Institute Of Science & Technology Hokuriku 超分子ポリマー及びその合成方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007211060A (ja) * 2006-02-07 2007-08-23 Japan Advanced Institute Of Science & Technology Hokuriku 超分子ポリマー及びその合成方法

Similar Documents

Publication Publication Date Title
US4730315A (en) Diagrammatic method of testing program
US5367468A (en) Design aid method and design aid apparatus for integrated circuits
EP2698710A2 (en) Systems and methods for information flow analysis
JPS61282935A (ja) プログラムにおける属性割当て検査方法及び装置
JP5147240B2 (ja) リバーシブルなデザイン・ツリーの変換のための方法とシステム
CN109491658A (zh) 计算机可执行代码数据的生成方法及装置
JPH0816429A (ja) 並行プログラム作成支援装置及び並行プログラム作成方法並びに並行プログラム実行装置
US5359539A (en) Logic design system and circuit transformation rule compiler
CN103529749B (zh) 一种plc可编程控制器的梯形图程序开发系统及方法
KR100694381B1 (ko) 그래피컬 프로그래밍 장치 및 프로그래머블 표시기
JP2006344097A (ja) if文を編集するプログラムおよびif文を編集する方法
JP7338922B2 (ja) 異種埋め込み型の表形式化動作プロセスの処理および実行方法および装置
CN111309298B (zh) 数控系统中基于自定义格式文件实现加工刀路编制的系统及其处理方法
JP4488226B2 (ja) ラダープログラムの高機能部品化を実現するマクロプログラム
JP2007122187A (ja) プログラム・コード生成装置
Kulkarni et al. Automatic Syntax Error Correction
JPH1185486A (ja) プログラム編集装置,プログラム編集方法,及びコンピュータ可読媒体
Warren The coroutine model of attribute grammar evaluation.
TWI801836B (zh) 將程式碼於不同程式語言間進行轉換及優化的方法
CN113568607B (zh) 一种数字程序实现方法和系统
JPS6320529A (ja) 知識獲得方式
KR100423742B1 (ko) 순차기능챠트에 의한 전용 제어 시스템
JPH0652481B2 (ja) シーケンスプログラム入力装置
JPS63318605A (ja) Ncパ−トプログラム生成装置
JP3270777B2 (ja) 論理図プログラム用エディタ

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20080902