あなたがやろうとしていることは、プログラムの変換、つまり、あるプログラムから別のプログラムへの自動生成と呼ばれます。あなたが「間違っている」ことは、パーサーだけが必要であると仮定し、そうではなく、ギャップを埋めなければならないことを発見することです。
これをうまく行うツールには、パーサー (AST をビルドするため)、AST を変更する手段 (手続き型およびパターン指向の両方)、および(変更された) AST を正規のソース コードに変換するprettyprinterがあります。ANTLR には prettyprinters が付属していないという事実に苦労しているようです。それはその哲学の一部ではありません。ANTLR は (細かい) パーサー ジェネレーターです。他の回答では、ANTLR の「文字列テンプレート」を使用することが提案されています。これは、それ自体はプリティプリンターではありませんが、実装するという代償を払って実装するために使用できます。これは見た目よりも難しいことです。AST をソース コードにコンパイルする方法については、SO の回答を参照してください。
ここでの本当の問題は、「パーサーがあれば、複雑なプログラム分析および変換ツールを構築する道を順調に進んでいる」という、広く行われているが誤った仮定です。これについての長い議論については、Life After Parsingに関する私のエッセイを参照してください。基本的に、タスクを続行する代わりにインフラストラクチャのかなりの部分を自分で再構築したくない場合を除き、これを行うには「単なる」パーサーよりも多くのツールが必要です。実用的なプログラム変換システムのその他の便利な機能には、通常、ソースからソースへの変換が含まれます。これにより、ツリー内の複雑なパターンを見つけて置き換える問題が大幅に簡素化されます。
たとえば、ソースからソースへの変換機能 (当社のツールであるDMS Software Reengineering Toolkitの機能) があれば、これらの DMS 変換を使用してサンプル コードの変更の一部を記述することができます。
domain ECMAScript.
tag replace; -- says this is a special kind of temporary tree
rule barize(function_name:IDENTIFIER,list:expression_list,b:body):
expression->expression
= " \function_name ( '[' \list ']' ) "
-> "\function_name( \firstarg\(\function_name\), \replace\(\list\))";
rule replace_unit_list(s:character_literal):
expression_list -> expression_list
replace(s) -> compute_index_for(s);
rule replace_long_list(s:character_list, list:expression_list):
expression_list -> expression_list
"\replace\(\s\,\list)-> "compute_index_for\(\s\),\list";
ルール外部の「メタ」プロシージャ「first_arg」(識別子「foo」を指定して「バー」を計算する方法を知っている[あなたはこれをやりたいと思います)、および文字列リテラルを指定した「compute_index_for」を使用して、何を知っていますか置き換える整数。
個々の書き換えルールには、サブツリーを表すスロットの名前が付けられたパラメーター リスト "(....)" があり、左側は一致するパターンとして機能し、右側は置換として機能します。どちらも通常はメタクォート "で引用されます。書き換えルール言語のテキストをターゲット言語 (JavaScript など) のテキストから分離します. 特別な書き換えルール言語の項目を示すメタクォートの中に多くのメタエスケープがあります **パラメーターが表す名前ツリー、または外部メタ プロシージャ コール (first_arg など。その引数リスト ( , ) がメタ引用符で囲まれていることに注意してください!)、または最後に、「replace」などの「タグ」を表します。これは、より多くの変換を行うという将来の意図を表す独特の種類の木です。
この特定のルールのセットは、リストを変換する追加の意図「置換」を使用して、候補関数呼び出しをバー化されたバージョンで置き換えることによって機能します。他の 2 つの変換は、リストの要素を一度に 1 つずつ処理することによって「置換」を変換し、最終的に末尾から外れて置換が完了するまで置換をリストのさらに下に押し込むことによって、意図を実現します。(これは、ループに相当する変形です)。
詳細については正確ではなかったため、特定の例は多少異なる場合があります。
解析されたツリーを変更するためにこれらのルールを適用すると、DMS は簡単に結果をプリティプリントできます (一部の構成でのデフォルトの動作は、「AST に解析し、使い果たされるまでルールを適用し、AST をプリティプリントする」というものです。これは便利なためです)。
DMS ドメインとして (高校) Algebraで、「言語の定義」、「書き換え規則の定義」、「規則の適用と prettyprint」の完全なプロセスを見ることができます。
その他のプログラム変換システムには、TXLやStrategoなどがあります。DMS は、これらの産業用強度バージョンであり、多くの標準言語パーサーや prettyprintersを含むすべてのインフラストラクチャが構築されていると考えています。