我正在出于研究目的进行编译。
它使用针对c#代码生成的Antlr工具。
到目前为止,我可以应付。词汇,Sintatic,我的测试还可以。
我的目的是生成CIL字节码,我对此很熟悉。
问题是...
我不知道“输出”代码的好方法。我想要一些建议,例如生成它。
我有一个想法,就是创建一个与节点相关的大量方法的“编译器”类,并在迭代树时调用该方法。
思想:
Class Compiler
{
private AppededStrings = "";
void CreateClass();
void EndClass();
void AddParam();
void setAtributeToTheClass("public");
... and so on ...
}
这是一个好方法吗?
我找不到有关此话题的话题。
最佳答案
这是来自ANTLR 3.x的示例。
对于ANTLR,一旦有了AST,接下来的任务就是将其转换为一组可执行指令。由于作者不是要求汇编输出,而是CIL,并且正在使用ANTLR,因此Web上最好的示例来自ANTLR的作者。在此page上,Ter谈论了人们如何使用StringTemplate工具生成成为指令的输出。尽管Ter使用流行的LLVM进行演示,但同样的概念也适用于作者要求的CIL生成。
另外一个选项。
当我最初使用Mercury,时,它们生成了CIL代码。在过去的几年中,CIL一直没有得到维护,但是人们仍然想在.Net世界中使用Mercury。由于在.NET世界中,任何.NET语言都可以编译为CIL,通过生成C#作为Mercury编译器的输出,然后将C#编译为CIL,他们仅通过中间语言即可获得将Mercury编译为CIL的相同结果。中间语言必须是低级语言是没有规则的。