2013-02-16 106 views
5

最近我拿起了The Definitive ANTLR 4 Reference的副本,由于我在处理语法和语言方面很成熟,所以我想在我的DSL上工作,我曾用yaccbison编写过。总体思路是编写一个翻译器(包含对类型安全性的验证(1)),在运行时将DSL转换为JavaScript,然后由v8执行。将ANTLR 4集成到C++应用程序中

尽管ANTLR被设计为包含在Java应用程序中,但我仍想继续使用本机C++。 ANTLR 4能否生成这样一个C语法分析器/词法分析器,我可以使用C++样式的包装器来包含它?怎么做?


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

+0

只是好奇,你最终做了什么? JavaCC可以生成C++输出。 – costa 2015-10-19 18:08:26

回答

3

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

但是,ANTLR v4此时只有一个Java目标。

+1

在提供完整的C/C++生成目标之前,我将不得不使用另一种方法,然后......不知何故。 – 2013-02-16 19:22:46

+1

跛脚,真的吗?无论如何,你可以使用ANTLR 3.语法语法并非完全不同,当为C++提供C/C++时,你可以切换到更新的版本? – 2013-02-16 19:37:13

+0

v3和v4有很多不同吗?我认为第4版更加高效,并且本书作为我不想使用旧版本的最新版本的参考。我想通过调用Java将Java输出作为输入传递给C++,直到有一个解决方案在不使用Java的情况下包含所有内容。 – 2013-02-16 19:42:09

8

我发现ANTLR 3 C/C++目标几乎不可用。它包含了很多黑客来绕过C中缺少的例外情况,因此仅向专家推荐。虽然这是Terr的呼吁,但我希望ANTLR 4不支持目标语言,除非能够隔离最终用户所需的任何hackery,否则不会有本机异常。 ANTLR 2 C++目标比ANTLR 3更清晰,但ANTLR 2本身具有局限性,包括非常混乱的许可(使其难以在商业产品中使用)。

+0

ANTLR 4中的语言目标现在是完全独立的项目。参考实现只有Java,并且C#目标现在也可用。如果/由独立开发人员/团队提供,C++目标将可用。 – 2014-01-05 22:43:48

1

约翰G.回答

  • 我同意ANTLR3Ç目标是非常黑客。我,20年的C/C++专家,甚至没有作者的答案甚至猜测如何使用它。是的,想法很好,但没有接近不可能理解的文档。

  • 我不同意主要的例外情况。在ANTLR2和C++实现fir v2的时候,异常确实存在......并且有人认为如果删除异常,它会更快。在v3他们已经尝试做到这一点,但...

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

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

在v4中,Terrence发明了如何在Lexer中使用状态机。如果我们也可以解析解析器。我认为在理想情况下,ANTLR可以像现在一样产生功能,而我们开发语法,并释放状态机。但迄今为止这是一个梦想。

3

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