在C ++应用程序中集成ANTLR 4

时间:2013-02-16 18:33:58

标签: c++ antlr dsl

最近我收到了The Definitive ANTLR 4 Reference的副本,因为我在使用语法和语言方面很成熟,我想在我的DSL上工作,我曾经使用yacc和{{1 }}。一般的想法是编写一个翻译器(包含类型安全(1)的验证),它在运行时将DSL转换为JavaScript,然后由v8执行。

虽然ANTLR是为了包含在Java应用程序中而设计的,但我希望继续使用本机C ++。 ANTLR 4可以生成这样的C语法分析器/词法分析器(2)我可以使用C ++风格的包装器来包含它吗?怎么做?


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

4 个答案:

答案 0 :(得分:8)

我发现ANTLR 3 C / C ++目标几乎无法使用。它包含了许多黑客,以避免C中缺少例外情况,仅建议专家使用。虽然这是Terr的号召,但我希望ANTLR 4不支持目标语言,除非它可以隔离最终用户需要的任何hackery。 ANTLR 2 C ++目标比ANTLR 3更清洁,但ANTLR 2本身也有局限性,包括非常混乱的许可(使其难以用于商业产品)。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

致John G.回答

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

  • 我不同意主要的例外情况。在ANTLR2和C ++实现时,确实存在异常......并且有观点认为如果要删除异常,它会更快。在第3节他们尝试这样做,但是......

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

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

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