【问题标题】:Integrating ANTLR 4 in a C++ application在 C++ 应用程序中集成 ANTLR 4
【发布时间】:2017-08-30 21:57:08
【问题描述】:

最近我拿起了一份The Definitive ANTLR 4 Reference 的副本,由于我在处理语法和语言方面很老练,所以我想在我曾经使用yaccbison 编写的DSL 上工作。总体思路是编写一个转换器(包括对类型安全性的验证(1)),它在运行时将 DSL 转换为 JavaScript,然后由 v8 执行。

虽然 ANTLR 是为包含在 Java 应用程序中而设计的,但我还是希望继续使用原生 C++。 ANTLR 4 可以生成这样的 C 解析器/词法分析器(2),我可以使用 C++ 样式的包装器包含它吗?以及如何做到这一点?


(1) 这本书有一些很好的例子,我将用作模板。
(2) 我不确定,但我认为我读过ANTLR 不支持 C++ 输出的地方,对吗?

【问题讨论】:

  • 只是好奇,你最后做了什么? JavaCC 可以生成 C++ 输出。

标签: c++ antlr dsl


【解决方案1】:

我发现 ANTLR 3 C/C++ 目标几乎无法使用。它包含许多技巧来规避 C 语言中缺少异常的情况,因此仅推荐给专家使用。尽管这是 Terr 的要求,但我希望 ANTLR 4 不支持没有本地异常的目标语言,除非它可以将任何需要这样做的黑客与最终用户隔离开来。 ANTLR 2 C++ 目标比 ANTLR 3 更干净,但 ANTLR 2 本身有局限性,包括极其混乱的许可(使其难以在商业产品中使用)。

【讨论】:

  • ANTLR 4 中的语言目标现在是完全独立的项目。参考实现只有 Java,现在也可以使用 C# 目标。如果/当它由独立开发人员/团队贡献时,C++ 目标将可用。
【解决方案2】:

ANTLR v3 有各种不同的目标,最著名的是 Java(当然)、C、C#、JavaScript 和 Python。如需完整列表,请参阅:http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets

然而,ANTLR v4 目前只有一个 Java 目标。

【讨论】:

  • 在提供完整的 C/C++ 生成目标之前,我将不得不使用另一种方法......有点蹩脚。
  • 跛脚,真的吗?无论如何,您可以使用 ANTLR 3。语法语法并没有什么不同,当为 v4 提供 C/C++ 时,您可以切换到较新的版本?
  • v3和v4有很多不同吗?我认为第 4 版效率更高,并且以本书作为最新版本的参考,我不想使用旧版本。我考虑只是通过调用 Java 将 Java 的输出作为输入传递给 C++,直到有一个解决方案可以在不使用 Java 的情况下包含所有内容。
【解决方案3】:

如果您仍然感兴趣,antlr 4.7 版确实有一个 c++ 目标。

【讨论】:

    【解决方案4】:

    给约翰 G. 回答

    • 我同意 ANTLR3 C 目标非常黑客。我,20 年的 C/C++ 专家,如果没有作者的回答,我什至无法猜测如何使用它。是的,想法非常好,但没有文档几乎无法理解。

    • 我不同意例外的主要问题。在 ANTLR2 和 C++ 实现 fir v2 的时代,确实存在异常......并且有人认为如果删除异常会更快。在 v3 中,他们尝试过这样做,但是 ...

    • 但是速度并没有变得更好。我们希望在 Valentina 数据库引擎中从 ANTRL2 切换到 ANTLR3,我们花了几个月的时间重新编写 v3 语法,并且……零加速。只是零。所以我们使用 ANTLR 到现在 v2。

    • 我认为主要问题是 ANTLR 中的速度是否为每个规则产生单独的功能。是的,这是它强大的一面,这也是它的弱点。

    在 v4 中,Terrence 发明了如何在 Lexer 中使用状态机。如果我们也可以为解析器获取它。我认为理想情况下,ANTLR 可以像现在一样产生功能,同时我们开发语法和状态机以供发布。但到目前为止,这只是一个梦想。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多