私は、次のようなサンプル ANTLR ツリー文法を使用したコード変換プロジェクトに取り組んでいます。
start: ^(PROGRAM declaration+) -> program_decl_tmpl();
declaration: class_decl | interface_decl;
class_decl: ^(CLASS ^(ID CLASS_IDENTIFIER))
-> class_decl_tmpl(cid={$CLASS_IDENTIFIER.text});
グループ テンプレート ファイルは次のようになります。
group My;
program_decl_tmpl() ::= <<
*WHAT?*
>>
class_decl_tmpl(cid) ::= <<
public class <cid> {}
>>
これに基づいて、私はこれらの質問があります:
WHAT?
プログラムは、最終的に生成された出力を取得するための単なるクラス宣言のリストであると 表現する必要があることを除けば、すべて正常に機能しますか?- このアプローチは、それほど高級でない言語に平均的に適していますか ?
- 私はANTLR Code Translation with String Templatesも研究しましたが、このアプローチはツリー文法でコードをインターリーブすることを大いに活用しているようです。文字列テンプレートだけで可能な限りそれを行うことも可能ですか?
SOLUTION、テレンスが提案したものに基づいてソリューションを追加します。
start: ^(PROGRAM d+=declaration+) -> program_decl_tmpl(decls={$d});
declaration: cd = class_decl -> decl_tmpl(decl={$cd.st})
| id = interface_decl -> decl_tmpl(decl={$id.st});
class_decl: ^(CLASS ^(ID CLASS_IDENTIFIER))
-> class_decl_tmpl(cid={$CLASS_IDENTIFIER.text});
テンプレートは次のようになります。
group My;
program_decl_tmpl(decls) ::= <<
<decls>
>>
decl_tmpl(decl) ::= <<
<decl>
>>
class_decl_tmpl(cid) ::= <<
public class <cid> {}
>>