【问题标题】:How can I parse code to build a compiler in Java?如何解析代码以在 Java 中构建编译器?
【发布时间】:2010-10-14 22:15:51
【问题描述】:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 我不确定 1.6,但直到 1.4,Sun JDK 中 javac 的解析器是手工编写的。

标签: java parsing compiler-construction parser-generator


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,也许是语义分析器?用于检查无法在解析器中检查的内容?
  • 在我看来,解析器就是语法和语义分析器。我已经更新了将这两个概念分开的答案。
【解决方案2】:

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

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

那么您就有了ANTLRWorks,它可以让您随时学习和调试您的语法。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我建议使用像 ANTLR 这样的元编译器或简单的 parser combinator 库。 Functional Java 有一个 parser combinator API。还有JParsec。这两个都是基于the Parsec library for Haskell

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                如果您要成为硬核,请在组合中加入一些 http://llvm.org :)

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

                    【讨论】:

                      【解决方案12】:

                      使用解析器组合器,例如JParsec。有a good video tutorial on how to use it

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2015-03-03
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-01-21
                        • 1970-01-01
                        • 2015-11-13
                        相关资源
                        最近更新 更多