ソースコードの基本的なパターンマッチングと書き換えシステムを実装する古いソフトウェア (死んでいないが、私には死んでいる言語で ;-)) があります。このコードを復活させ、現代の言語に翻訳し、プロジェクトをリファクタリング パワー ツールとしてオープンソース化することを検討しています。さらに先に進む前に、このようなものがすでに存在するかどうかを知りたいです (今夜、私の google-fu がこれを煽っています)。
仕組みは次のとおりです。
- パターン マッチング部分は、バインディング変数を含むテンプレートを使用して、複数行のコードにまたがるソース コード パターンと一致します。
- パターン書き換え部分は、テンプレートを使用して一致したコードを書き換え、一致するテンプレートからバインドされた変数の内容を挿入します
- 一致テンプレートと書き換えテンプレートは、単純な (無条件の) 書き換えルールによって (1:1) 関連付けられます
ソフトウェアは、入力アプリケーションの抽象構文ツリー (AST) で動作し、変更された AST を出力します。これは、新しいソース コードに再生成できます。
たとえば、実際には for ループであるはずの while ループがたくさん見つかったとします。次のテンプレートは、while ループ パターンに一致します。
Template oldLoopPtrn
int @cnt@ = 0;
while (@cnt@ < @max@)
{
… @body@
++@cnt@;
}
End_Template
次のテンプレートは、出力の書き換えパターンを指定します。
Template newLoopPtrn
for(int @cnt@ = 0; @cnt@ < @max@; @cnt@++)
{
@body@
}
End_Template
それらを関連付ける簡単なルール
Rule oldLoopPtrn --> newLoopPtrn
コードは次のようになります
int i=0;
while(i<arrlen)
{
printf("element %d: %f\n",i,arr[i]);
++i;
}
このように自動的に書き換えられます
for(int i = 0; i < arrlen; i++)
{
printf("element %d: %f\n",i,arr[i]);
}
これに最も近いのはコード リファクタリング ツールの一部ですが、それらは大規模な自動変更ではなく、選択したスニペットのインタラクティブな書き換えを目的としているようです。
この種のツールはリファクタリングを促進し、複数の言語 (HTML/CSS でさえも) で動作すると信じています。また、コード ベースの変換と磨き上げは、私だけでは妥当な時間内に行うことのできない巨大なプロジェクトになると考えています。
それで、このようなものはすでにそこにありますか?そうでない場合、考慮すべき明らかな機能(書き換えルール条件以外)はありますか?
編集: このシステムの私が非常に気に入っている機能の 1 つは、テンプレート パターンがかなり明白で読みやすいことです。これは、テンプレート パターンが難解な変異正規表現/BNF 形式ではなく、ターゲット ソース コードと同じ言語で記述されているためです。