7

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

尽管 ANTLR 是为包含在 Java 应用程序中而设计的,但我想继续使用本机 C++。ANTLR 4 能否生成这样的 C 解析器/词法分析器(2),我可以使用 C++ 样式的包装器将其包含在内?以及如何做到这一点?


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

4

4 回答 4

8

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

于 2013-03-07T23:17:56.860 回答
3

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

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

于 2013-02-16T18:50:36.190 回答
3

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

于 2017-08-30T13:57:08.050 回答
1

约翰 G. 回答

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

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

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

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

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

于 2014-01-05T12:20:13.377 回答