如何解析代码以构建 Java 编译器?
-
21-08-2019 - |
题
我需要写一个编译器。这是大学的家庭作业。老师告诉我们,我们可以使用任何我们想要的API来进行代码的解析,只要它是好的。这样我们就可以更加关注我们将生成的 JVM。
所以是的,我将用 Java 编写一个编译器来生成 Java。
你知道有什么好的API吗?我应该使用正则表达式吗?我通常手动编写自己的解析器,尽管在这种情况下不建议这样做。
任何帮助,将不胜感激。
解决方案
正则表达式很适合在编译器中使用,但仅用于识别标记(即没有递归结构)。
编写编译器的经典方法是 词法分析器 为了识别令牌, 语法分析器 为了识别结构, 语义分析器 为了识别意义, 中间代码生成器, , 一个 优化器, ,最后一个 目标代码生成器. 。如果使编译器更易于编写,则可以合并或完全跳过这些步骤中的任何一个。
已经开发了许多工具来帮助完成此过程。对于Java,你可以看看
- ANTLR- http://www.antlr.org/
- 可可/R - http://ssw.jku.at/Coco/
- JavaCC- https://javacc.dev.java.net/
- 黑貂CC - http://sablecc.org/
其他提示
我建议 ANTLR 时,主要是因为通过StringTemplate的其输出端生成功能。
什么是更好的是在相同的是特伦斯·帕尔的书由远的更好书籍之一朝与解析器生成编写编译器定向。
然后,你必须 ANTLRWorks ,使您学习和调试你的语法的飞行。
要上它全部,所述 ANTLR维基+文档一>,(虽然不够我喜欢综合),是开始任何初学者的好地方。它帮助我刷新编译写作知识在一个星期。
看一看 JavaCC的,语言解析器的Java。它非常容易使用,并找到窍门
我建议使用像这样的元编译器 ANTLR, ,或者一个简单的 解析器组合器 图书馆。 函数式Java 有一个 解析器组合器 API. 。还有 秒差距. 。这两者都是基于 Haskell 的 Parsec 库.
我用SableCC在我的编译器过程中,虽然没有选择的余地。
我记得发现它很笨重和重量级,更加注重清洁方便比(无运算符优先级或任何东西,你必须声明的是,在语法)
我可能会想用别的东西,如果我当初的选择。我与YACC(为C)和快乐(Haskell的)经验均出现了令人愉快的。
解析器组合是一个很好的选择。流行的Java实现是JParsec。
如果你打算去铁杆,扔在一个位 http://llvm.org 的混合:)
我建议你看一下在源BeanShell的。它有一个Java编译器和是相当简单的读取。