我做一个编译器是为了学习。
它使用Antlr工具生成c#代码。
到目前为止,我能处理这台留声机。词汇,Sintatic,我的测试还可以。
我的目标是生成CIL字节码,我对它有点熟悉
问题是。。。我不知道"输出"代码的好方法。我想要一些建议,例如生成它。
我的一个想法是创建一个类"编译器",其中包含大量与节点相关的方法,并在树迭代时调用该方法。
Ideia:
Class Compiler
{
private AppededStrings = "";
void CreateClass();
void EndClass();
void AddParam();
void setAtributeToTheClass("public");
... and so on ...
}
这是一个好方法吗?我找不到具体的话题来谈论这件事。
页面的某些部分http://msdn.microsoft.com/en-us/magazine/cc136756.aspx将为您工作:)
下面是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编译到CII的相同结果,但只是通过一种中间语言。任何地方都不存在中间语言必须是低级语言的规则。