我刚刚开始我的毕业项目,该项目应该持续 6 个月。
该项目的目标是为一种脚本语言实现一个 .Net 编译器。我在类(class)中将编译器构造作为一个主题,并且知道如何实现编译器的基本步骤,但是我们使用了 Bison 和简单的编译器以及 GCC 作为后端,因此我对实现编译器知之甚少在.Net平台上。
在对这个主题进行了一些研究之后,我发现了以下代码生成的替代解决方案(我不是在谈论编译器的其他重要部分,比如解析器——它超出了这里的范围):
我项目的主要目标是更深入地研究 .Net,学习编译器构造并为我的工作取得好成绩。第二个目标是提出一个编译器实现,以后可以在许可的开源许可下向社区开放。
那么,什么是最有趣、最有教育意义、最有趣和最有前途的方法呢?如果我有更多时间,我肯定会尝试所有这些,但我需要在 6 个月内提交我的工作以获得积极的成绩......
先感谢您,
亚历山大。
最佳答案
如果您想要更简单的方法并且您的语言可以合理地翻译成 C#,我建议您生成 C# 代码(或类似代码)并编译它。罗斯林可能是最擅长的。显然,CCI 也可以使用 CCI Code ,但我从来没有使用过。我不会推荐 CodeDOM,因为 it doesn't support features like static classes or extension methods .
如果你想要更多的控制或者你想要去低级,你可以使用 Reflection.Emit 直接生成 CIL。但这将是(更多)工作,特别是如果您不熟悉 CIL。我认为 Cecil 可以以相同的方式使用,但它是用于其他用途的,而且我认为它与 Reflection.Emit 相比没有任何优势。
顾名思义,DLR 是动态语言的意思。 Expression
它使用的 s 可以用于代码生成,但我认为它们最擅长在运行时生成相对简单的方法。当然,如果您的语言是动态的,DLR 本身就会非常有用。
关于.net - 在 C# 中实现编译器最有趣和最有前途的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8072833/