重要なアイデアはプログラム変換です。OndrejはDMSに関して正しい考えを持っていますが、私はDMSの作成者であるため、偏見がある可能性があります。
変換を実行するために使用されるDMS言語は、「(DMS)ルール仕様言語」またはRSLと呼ばれ、(プログラム変換)ルールを指定するために使用されます。このようなルールには次のものがあります。
- 名前(私たちはそれらをたくさん持っている傾向があり、これはそれらを参照するための便利な方法です)
- 対象のターゲット言語の文法に従って入力されたパラメーター(パターン変数の定義)、
- 左側の「match-this」パターン
- 右手「これで置き換える」パターン
パターンは、多くの場合、ターゲット言語の表面構文で記述されます。これは、パターン変数の拡張機能を使用して変換される言語のネイティブ構文です。RSL言語の構文をターゲット言語と区別するために、パターンは(メタ)引用符「...」内に記述されます。パターン内の\文字は、RSLに戻る(メタ)エスケープです。パターン変数は「\x」と書かれています。(メタ)関数foobarは\ foobar(...)と記述されます。(メタ)関数引数の(メタ)エスケープに注意してください。引用符の外では、メタエスケープが必要であり、これらの構成は\なしで記述されます(例:foobar(...))。
DMSルールはこれよりもはるかに複雑になる可能性がありますが、これらが基本です。表面構文パターンはテキストを表しません。むしろ、それらは実際にはパターン内のコードの同等のASTを表しています。DMSルールは、ASTを照合および変更するために使用されます。もちろん、プログラム変換システムには、ASTを生成するためのパーサーと、ASTをテキストに戻すためのアンチパーサー(「プリティプリンター」)が必要です。(DMSには、地球上で広く使用されているすべての言語と多くの珍しい言語用の言語フロントエンドの大きなライブラリがあります。MUMPSを追加したばかりです)。
特定の例では、次のルールでうまくいきます。
"...特定の関数を削除する":
rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations
" \f \p \b " -> " ; " -- replace function delcaration by empty declation
if f==target_function_name();
...コードのブロックの周りにif条件を追加します:
rule wrap_in_if(s:statement): statement -> statement
" \s " -> " \if ( \generated_condition\(\) ) \s ";
...何もしない新しい関数宣言を追加します。
rule insert_noop_function(d:declarations): delcarations -> declarations
" \d " -> " \target_function\name\(\) ( ) { } ";
あなたが観察したように、あなたはこれらをどこかに向けなければなりません。これは、AST内のどこにルールを適用するかを特定し、それらを適用する「メタプログラム」の仕事です。ルールについては、適切な場所を見つけるために(DMSを使用して)明示的な手続き型の方法が必要です。一部のDMSルールでは、「どこでも」適用できます。DMSは基本的に、指定されたAST全体を歩き回り、ルールを適用します。
コードの数行が印象的でないのと同じように、いくつかのルールは決して印象的ではありません。数百または数千行のコードが非常に興味深い結果を生成できるのと同じように、数百または数千のルールが非常に壮観なこと(完全な言語翻訳など)を実行できます。違いは、従来のコードは数値、文字列、構造で機能し、プログラム変換ツールはプログラム構造(AST)を計算することです。
DMSに対して言語とルールを定義する方法、およびそれらのルールを達成する「プログラム変更」にどのように適用するかを示す完全な実例があります(この例は実際には「代数式」を変更しますが、考え方はまったく同じです)。
DMSは恥ずかしがらずに商用であり、ダイムストアツールではないため、論文に必要なものではない可能性があります。
DMSでない場合は、同じアイデアを持つ無料のツールを入手できます。TXL(www.txl.ca)またはStrategoXt(www.strategoxt.org)を検討してください。DMS、TXL、Strategoはすべて、サーフェス構文パターンを使用してプログラム変換を実行しますが、TXLとStrategoは、DMSIMHOと同様にコードへの大規模な変更を処理できません。(いくつかの理由で、DMS Webサイトでフロー分析について読んでください)。ただし、TXLとStrategoは、基本を学び、強力なデモを作成するのに適しています。