プログラムのパターン変換系における空白字句保存手法に関する研究
2007MI192 大島誠也
指導教員：吉田敦

1

はじめに

2

背景技術

3.1.1

2.1

属性付き字句系列

パターン変換記述は TEBA で解析し，変換前パターンと変換後断片の字句列に分ける．LCS で精度の高い対応関係を得るために，変換前パターンと変換後断片の字句別などの情報を与えることで，抽象構文木と同等の情報を持つ属性付き字句系列を生成する．この属性付き字句
ソフトウェアの開発等で，プログラムを記述するときはテキストを結合することで元のソースプログラムを再に，一度ですべて書ききることは難しく，仕様を満たす現できる．TEBA はソースプログラムを解析して得た属ように小規模な変更を積み重ねていく必要がある．また，性付き字句系列を書き換えることによってソースプログ一度完成したプログラムでも，運用，保守の段階でプロラムの書き換えを実現している．
グラムに仕様変更等が生じるので，プログラムの書き換え作業を何度も繰り返す必要がある．このような書き換 2.2 プログラムのパターン変換え作業の中では，コードクローンに対する修正や関数呼TEBA が提供するプログラムのパターン変換は，書き出しなどの識別子の参照に対する変更など，分散する複換え前と後の 2 つのソースコード断片を変換前パターン数の箇所に同じ編集作業をする場合がある．このようなと変換後断片として記述したパターン変換記述に従い行編集作業は，プログラムの書き換えツールを用いることう．パターン変換記述とは，変換前パターンに記述したで，手作業で単純作業を繰り返すことで起こる人為的ミプログラム断片が対象のソースプログラムに含まれると，ス混入を回避でき，作業効率の向上に貢献する．既存の変換後断片に記述したプログラム断片に書き換えるとい書き換えツールとしてプログラムのパターン変換ツールう情報を記述したものである．パターン変換記述には，パ[1][2] がある．
ターン変数という差異のある要素を可変部分として抽象
プログラムの書き換え支援では，書き換え後も継続的化する仕組の字句があり，変換前の指定された構文要素にプログラマがそのプログラムを読み，編集もしていくに適合して，変換後の参照箇所に適合した構文要素をあことから，処理の把握に役立つコメントやプログラムのてはめ維持する．パターン変数は，変換前パターンでは可読性を向上させる空白・改行を保存することが不可欠${名前:型}と記述し，変換後断片では${名前}と記述すである [3]．しかし，既に提案されている書き換え支援環る．本研究は，空白字句の構文要素に適合するパターン境である TEBA[1] や TXL[2] ではコメントや空白を保存変数 (以下，空白パターン変数) を用意して，字句間の空する仕組がなく，書き換え対象箇所のコメントや空白の白字句を維持する．
欠落が生じる．
パターン変換でコメント・空白・改行を表す空白字句を 3 空白字句保存手法維持する方法として，空白字句を一つの構文要素としてパターン変換に使用するパターン変換記述に空白字句扱い，書き換え前の空白字句を書き換え後のどこの箇所 を保存する記述を加える補正を行うことで，書き換え後に維持させるかを明示的に書くことが考えられる．しか のプログラムに空白字句を維持する方法を提案する．まし，この方法をプログラマが手作業で行うには，パター た，書き換え後のプログラムに対しても，余分な空白やンが複雑化し，記述の労力も大きい．この処理は書き換 改行によりインデントが乱れないように処理を行う．
えの本質的な作業ではないので，この作業を自動化する
3.1 パターン変換記述の空白字句保存補正ことが望ましい．
関連研究としてプログラム書き換えツールから独立し本研究では，パターン変換記述を字句系列の変換ルーたスタイル維持方法に関する研究 [4] があるが，この研究 ルに生成するときに空白字句保存補正を行う．補正内容
では，書き換えるプログラム全体の空白字句をまとめて は，パターン変換記述の変換前パターンと変換後断片の維持するので，条件によっては書き換えられていない箇 対応する字句同士に空白パターン変数を付随させること所の空白字句が維持されない．本研究は，プログラムの で，書き換え後プログラムに空白字句を維持する処理でパターン変換を行うときに，空白字句の書き換え後の位 ある．対応する字句はパターン変換記述に明記されてい置を決定し，自動的に挿入する仕組を提案する．また，本 ないので，LCS(Longest Common Subsequence) のアル研究では実装が公開されていて，かつ変更しやすいこと ゴリズムで共通字句系列を求めたときに対応したと判定から TEBA を対象に拡張を行う．ただし，基本的な処理 した 2 つの字句の関係とする．この補正処理の全体像をは他の変換系にも適用可能である．
図 1 に示し，各処理について説明していく．

プログラムの書き換え支援環境 TEBA は，ソースプログラムを字句解析して得た字句系列に対して構文上の種

パターン変換記述の解析と補正処理

として，パターン変換の記述例を図 2 に，入力したプログラムと変換後の出力を図 3 に示す．図 2 は，for 文をwhile 文に書き換える．図 3 を見ると，各字句間にコメントを挿入して変換を行ったが，すべてのコメントが維持できている．また，字句の移動も含む書き換えだが，移動した字句にも前後のコメントが付随していることも分
かる．
% beforefor ( ${init:EXPR} ; ${cond:EXPR} ; ${succ:EXPR} )${stmt:STMT}$;% after${init};while (${cond}) {${stmt}$;${succ};}% end

図 2 パターン変換記述例
図 1 空白字句保存補正を行うツールの全体像列に含まれる空白字句の削除と IdUnify ツールで対応する各字句列の識別番号を統一する．

3.1.2

字句番号の付加と LCS各字句列に相違する字句番号を付加させ，付加した字句番号を無視した LCS を求める．LCS で得た対応字句の字句番号を統一し，字句の対応関係を表現する．

3.1.3

空白パターン変数と空白字句の挿入/*書き換え前*/
for /*cmt1*/ ( /*cmt2*/ i = 1 /*cmt3*/ ;/*cmt4*/ i <= 10 /*cmt5*/ ; /*cmt6*/ i++ /*cmt7*/ ){ /*cmt8*/
sum = sum * i; /*cmt9*/
printf("%2d = %7d\n", i, sum); /*cmt10*/}/*書き換え後*//*cmt1*/ /*cmt2*/ i = 1 /*cmt3*/ ; /*cmt4*/
while (i <= 10 /*cmt5*/ ) {{ /*cmt8*/
sum = sum * i; /*cmt9*/
printf("%2d = %7d\n", i, sum); /*cmt10*/}/*cmt6*/ i++ /*cmt7*/ ;}変換前パターンの字句間には名前が相違する空白パターン変数を挿入し，変換後断片の字句列には 3.1.1 節で削除した空白字句を復元する．空白字句を復元する理由は，削除した状態のままでは，識別子と識別子の間など，本来，1 つ以上存在すべき箇所の空白が欠落し，書き換え後 5プログラムにエラーが生じる可能性があることである。

3.1.4

変換後断片への空白パターン変数の挿入

図 3 ソースプログラムの書き換え例

おわりに本研究では，空白字句を保存する手法を提案・実装し，実現できることを示した．今後の課題は，複数のパターン変換例の検証を通して空白字句の付随方法を洗練することである．

変換後断片への空白パターン変数は，3.1.2 節で得た変換前パターンの対応字句に付随させる方法で，変換前パターンの空白パターン変数をすべて挿入する．空白パター
参考文献
ン変数が付随する字句は，前後に存在する対応関係がある字句の中で最も近くにある字句である．前後にある対応 [1] 吉田敦，蜂巣吉成，沢田篤史，張漢明，野呂昌満，“
属性付き字句系列に基づくソースコード書き換え支援
する字句の距離が同じ場合は，前にある字句を優先する．
環境，” 情報処理学会論文誌，vol.53，no.7，pp.18323.2 空白字句の補正
1849，July 2012．
3.1.3 節で復元した空白字句と変換前パターンから保存 [2] “The TXL Programming Language,” http://した空白字句を両方維持することで書き換え後プログラ
www.txl.ca/, 2012.
ムのインデントが乱れる可能性がある．この問題を軽減[3] Waddington, Daniel G. and Yao, Bin, “High-Fidelity
させるために，書き換え後プログラムの同一字句間に変換
C/C++ Code Transformation,” Electron. Notes
前プログラムと変換後断片の空白と改行が存在したら，変Theor. Comput. Sci., vol.141, no.4, pp.35-56, 2005.
換後断片の重複した空白と改行を削除する補正を加える．
[4] 本田竜二，石原浩佑，立道昂太，“プログラム書換え
4 評価・考察
ツールから独立したスタイル維持方法に関する研究，”
南山大学 数理情報学部 情報通信学科，2010 年度卒業
3.1 節で提案した空白字句保存補正の妥当性を確認する
論文要旨集．
ために実装を行い，複数の事例に適用した．適用した例