【问题标题】:Generate two parsers for a single DSL为单个 DSL 生成两个解析器
【发布时间】:2013-07-13 19:15:37
【问题描述】:

我需要为单个 DSL 实现两个工具:Java 中的 UI 编辑器和 C/C++ 中的解释器。我的第一个想法是使用 ANTLR,因为它可以为 Java 和 C/C++ 生成解析器。但我见过的所有 ANTLR 示例都包含一些特定于语言的代码或设置。

有没有办法为单个 DSL 生成两个解析器?

从一个语法生成两个解析器是否有意义?

这个问题有什么常用的方法吗?

【问题讨论】:

    标签: java c++ parsing antlr generator


    【解决方案1】:

    bison 可以生成 C++ 和 Java 解析器,至少根据文档(我从未使用过 Java 接口,只使用过一次 C++ 接口,但有人告诉我它们可以工作)。语法不会是问题,但动作会是问题,特别是因为您可能在两个解析器中做不同的事情,而不仅仅是使用不同的语言。但是您应该能够使每个操作都成为一个简单的$$ = method($1, $2, ...); 语句。

    bison 不使用 C(++) 预处理器(实际上并不能,因为将预处理器指令放入 bison 输入文件很常见),但是您可以使用其他一些宏系统——我犹豫推荐m4,但如果你知道如何使用它,它会起作用——或者一个shell脚本来组装不同的输入文件。

    另一种可能性是在解析器中创建一个 AST。您可以使用任何解析器生成器(包括 Antlr 或 bison)在 C 或 C++ 中构建 AST 解析器,然后将结果包装起来以与 JNI for Java 一起使用。如果你使用 Antlr,你可以用很少的语言特定代码生成一个 AST 生成器,所以使用简单的宏处理器,你可以在 C++ 和 Java 中构建本地 AST 解析器,我认为。但这取决于您的语言是否相当简单。

    我不知道这个问题是否有“常用方法”,但这肯定是一个经常出现的问题;许多语法在不同的项目之间共享,但据我所见,最常见的方法是剪切和粘贴语法,然后重写动作。我已经做过几次宏观方法,它可以工作,但它永远不会像你想要的那样优雅。

    【讨论】:

    • “我不太愿意推荐 m4,但如果你知道如何使用它,它会起作用” - 有什么我可以偶然发现的问题吗?
    • @IvanMushketyk:只是奇怪。它工作得很好,但有一点学习曲线。另一方面,我不知道有什么更好的。
    【解决方案2】:

    你可以试试yacc和jacc。 http://web.cecs.pdx.edu/~mpj/jacc/ http://dinosaur.compilertools.net/#yacc

    它们的语法非常相似,可能需要一些帮助 女仆预处理工具,你可以使用一个源文件。

    PS 但是为什么不在 C++ 中编写一次解析器并通过 JNI 使用它呢?

    【讨论】:

      【解决方案3】:

      您当然可以使用 ANTLR。语言特定部分是动作或谓词。如果您不需要它们,那么语法中将没有任何特定于语言的内容。顺便提一句。无论您使用哪种解析器生成器(包括 yacc、bison 等),如果您需要,语法中总是会包含特定于语言的内容。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2021-10-21
        • 2015-08-16
        • 2018-09-22
        相关资源
        最近更新 更多