我正在编写一个用于学习目的的编译器。
它使用针对c#代码生成的 Antlr 工具。
到目前为止,我可以处理gramar。 Lexical,Sintatic,我的测试还可以。
我的目标是生成CIL字节码,我对它很熟悉。
问题是...... 我不知道“输出”代码的好方法。我想要一些建议,例如生成它。
我有一个想法,就是创建一个类“编译器”,其中包含大量与节点相关的方法,并在迭代树时调用该方法。
IDEIA:
Class Compiler
{
private AppededStrings = "";
void CreateClass();
void EndClass();
void AddParam();
void setAtributeToTheClass("public");
... and so on ...
}
这是一个好方法吗? 我找不到一个特定的话题。
答案 0 :(得分:1)
答案 1 :(得分:0)
以下是ANTLR 3.x的示例。
从ANTLR获得AST后,根据此问题,下一个任务是将其转换为一组可执行指令。由于作者没有请求汇编作为输出,而是CIL并且正在使用ANTLR,因此网上最好的例子来自ANTLR的作者。在page Ter上讨论了如何使用StringTemplate工具生成成为指令的输出。虽然Ter使用流行的LLVM进行演示,但同样的概念适用于生成CIL作为作者请求。
另一种选择。
当我最初使用Mercury,时,他们生成了CIL代码。在过去的几年中,CIL没有得到维护,但人们仍然希望将Mercury用于.Net世界。因为在.NET世界中,任何.NET语言都编译为CIL,通过生成C#作为Mercury编译器的输出,然后将C#编译为CIL,它们实现了将Mercury编译为CIL的相同结果,但只是通过中间语言。中间语言必须是低级语言的规则。