我需要写一个编译器。这是大学的家庭作业。老师告诉我们,我们可以使用任何我们想要的API来进行代码的解析,只要它是好的。这样我们就可以更加关注我们将生成的 JVM。

所以是的,我将用 Java 编写一个编译器来生成 Java。

你知道有什么好的API吗?我应该使用正则表达式吗?我通常手动编写自己的解析器,尽管在这种情况下不建议这样做。

任何帮助,将不胜感激。

有帮助吗?

解决方案

正则表达式很适合在编译器中使用,但仅用于识别标记(即没有递归结构)。

编写编译器的经典方法是 词法分析器 为了识别令牌, 语法分析器 为了识别结构, 语义分析器 为了识别意义, 中间代码生成器, , 一个 优化器, ,最后一个 目标代码生成器. 。如果使编译器更易于编写,则可以合并或完全跳过这些步骤中的任何一个。

已经开发了许多工具来帮助完成此过程。对于Java,你可以看看

其他提示

我建议 ANTLR 时,主要是因为通过StringTemplate的其输出端生成功能。

什么是更好的是在相同的是特伦斯·帕尔的书由远的更好书籍之一朝与解析器生成编写编译器定向。

然后,你必须 ANTLRWorks ,使您学习和调试你的语法的飞行。

要上它全部,所述 ANTLR维基+文档,(虽然不够我喜欢综合),是开始任何初学者的好地方。它帮助我刷新编译写作知识在一个星期。

看一看 JavaCC的,语言解析器的Java。它非常容易使用,并找到窍门

走向经典 - Lex + Yacc。在 Java 中它拼写为 贾克斯javacc. 。Javacc 甚至还有一些 Java语法 准备接受检查。

我建议使用像这样的元编译器 ANTLR, ,或者一个简单的 解析器组合器 图书馆。 函数式Java 有一个 解析器组合器 API. 。还有 秒差距. 。这两者都是基于 Haskell 的 Parsec 库.

杰弗莱克斯 是一个扫描仪生成器,根据 手动的, ,旨在与解析器生成器一起使用 杯子.

JFlex 的主要设计目标之一是使与免费 Java 解析器生成器 CUP 的接口尽可能简单 [原文如此]。

它也有 支持 为了 BYACC/J, 顾名思义,它是 Berkeley YACC 的一个端口,用于生成 Java 代码。

我已经使用过 JFlex 本身并且很喜欢它。然而,我正在做的项目很简单,我手工编写了解析器,所以我不知道 CUP 或 BYACC/J 有多好。

我用SableCC在我的编译器过程中,虽然没有选择的余地。

我记得发现它很笨重和重量级,更加注重清洁方便比(无运算符优先级或任何东西,你必须声明的是,在语法)

我可能会想用别的东西,如果我当初的选择。我与YACC(为C)和快乐(Haskell的)经验均出现了令人愉快的。

解析器组合是一个很好的选择。流行的Java实现是JParsec。

如果你打算去铁杆,扔在一个位 http://llvm.org 的混合:)

我建议你看一下在源BeanShell的。它有一个Java编译器和是相当简单的读取。

使用一个解析器组合,如 JParsec 。有如何使用它一个很好的视频教程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top