7

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

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

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

任何帮助,将不胜感激。

4

12 回答 12

12

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

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

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

于 2009-03-23T09:06:10.967 回答
10

我会推荐ANTLR,主要是因为它通过 StringTemplate 的输出生成能力。

更好的是,Terence Parr 的这本书是迄今为止面向使用解析器生成器编写编译器的更好的书籍之一。

然后你就有了ANTLRWorks,它可以让你在运行中学习和调试你的语法。

最重要的是,ANTLR wiki + 文档(虽然我不喜欢这样全面),对于任何初学者来说都是一个很好的起点。它帮助我在一周内刷新了编译器编写的知识。

于 2009-03-23T08:58:01.157 回答
9

看看JavaCC,一个 Java 语言解析器。它非常易于使用并掌握

于 2009-03-23T08:50:18.663 回答
6

去经典 - Lex + Yacc。在 Java 中,它拼写为JAXjavacc。Javacc 甚至有一些Java 语法可供检查。

于 2009-03-23T08:50:37.743 回答
5

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

于 2009-03-23T14:24:40.187 回答
3

JFlex是一个扫描器生成器,根据手册,它被设计为与解析器生成器CUP一起使用。

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

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

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

于 2009-03-23T13:57:42.950 回答
2

我在我的编译器课程中使用了 SableCC,尽管不是自愿的。

我记得发现它非常笨重和重量级,更强调清洁而不是方便(没有运算符优先级或任何东西;你必须在语法中说明这一点)。

如果可以选择,我可能想使用其他东西。我对 yacc(对于 C)和 happy(对于 Haskell)的体验都很愉快。

于 2009-03-23T09:35:31.287 回答
2

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

于 2009-03-23T11:58:49.147 回答
1

如果您要成为铁杆,请在混合中加入一些http://llvm.org :)

于 2009-03-23T09:27:24.503 回答
1

我建议您查看 BeanShell 的源代码。它有一个 Java 编译器,而且读起来相当简单。

于 2009-03-23T19:42:32.667 回答
1

http://java-source.net/open-source/parser-generatorshttp://catalog.compilertools.net/java.html包含用于此目的的工具目录。还比较 Stackoverflow 问题Alternatives to Regular Expressions

于 2010-01-23T17:44:19.657 回答
0

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

于 2012-04-14T12:27:46.080 回答