3

我正在为学习目的做一个编译器。

它使用针对 c# 代码生成的Antlr工具。

到目前为止,我可以处理语法。词汇,Sintatic,我的测试没问题。

我的目标是生成 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,因此网络上最好的示例来自 ANTLR 的作者。在此页面上,Ter 讨论了如何使用StringTemplate工具生成成为指令的输出。虽然 Ter 使用流行的LLVM进行演示,但同样的概念也适用于生成 CIL 作为作者请求。

另外一个选项。

当我使用Mercury 时,最初他们会生成 CIL 代码。在过去的几年里,CIL 没有得到维护,但人们仍然希望在 .Net 世界中使用 Mercury。由于在 .NET 世界中,任何 .NET 语言都编译为 CIL,因此通过生成 C# 作为 Mercury 编译器的输出,然后将 C# 编译为 CIL,他们实现了将 Mercury 编译为 CIL 的相同结果,但只是通过一种中间语言。任何地方都没有规定中间语言必须是低级语言。

于 2012-09-24T18:10:03.083 回答