3

私は研究目的でコンパイラをやっています。

C# コード生成を対象としたAntlrツールを使用します。

これまでのところ、私は文法を扱うことができます。レキシカル、シンタティック、私のテストは問題ありません。

私の目的は、CIL バイトコードを生成することです。私はそれに精通しています。

問題は...コードを「出力」する良い方法がわかりません。それを生成するためのアドバイス、例が欲しいです。

私が考えているのは、ノードに関連する大量のメソッドを持つクラス「コンパイラ」を作成し、ツリーが反復されるときにメソッドを呼び出すことです。

アイデア:

Class Compiler
{
   private AppededStrings = "";

   void CreateClass();
   void EndClass();
   void AddParam();
   void setAtributeToTheClass("public");
   ... and so on ...
}

これは良いアプローチですか?これについて具体的に話しているトピックは見つかりませんでした。

4

2 に答える 2

1

ページhttp://msdn.microsoft.com/en-us/magazine/cc136756.aspxの一部が機能します:)

于 2012-09-24T17:25:51.930 に答える
0

これはANTLR 3.xの例です。

この質問に従って、ANTLR からASTを取得したら、次のタスクはそれを一連の実行可能な命令に変換することです。作成者は出力としてアセンブリを要求しているのではなく、CILを要求しており、ANTLR を使用しているため、Web 上の最良の例は ANTLR の作成者からのものです。このページでは、Ter がStringTemplateツールを使用して命令となる出力を生成する方法について説明しています。Ter はデモンストレーションに一般的なLLVMを使用していますが、著者の要求と同じ概念が CIL の生成に適用されます。

別のオプション。

私が Mercury と仕事をしたときもともと Mercury は CIL コードを生成していました。過ぎ去った数年間、CIL は維持されませんでしたが、人々は依然として .Net の世界で Mercury を使用したいと考えていました。.NET の世界では、すべての .NET 言語が CIL にコンパイルされるため、Mercury コンパイラの出力として C# を生成し、C# を CIL にコンパイルすることで、Mercury を CIL にコンパイルした場合と同じ結果が得られましたが、中間言語を介しただけでした。中間言語が低水準言語でなければならないというルールはどこにもありません。

于 2012-09-24T18:10:03.083 に答える