【问题标题】:Antlr for multiple language generationAntlr 用于多语言生成
【发布时间】:2017-09-07 14:44:30
【问题描述】:

这个post about the antlr simple example 展示了如何为我们创建一个java 语法。

但是,这将 Exp.g 源代码中的语法和 Java 源代码混合在一起。

我的问题是,是否可以将语法文件与目标语言解耦,以便一个语法文件可以用于生成多个 Java、Scala、C++ 等 Lexers/Parsers?

【问题讨论】:

标签: antlr antlr4


【解决方案1】:

这主要取决于语法中使用目标代码的原因。是否只有操作代码对找到的标记做某事(例如构建符号表或替代树表示)然后确实没有问题删除此类本机代码并在之后进行处理(使用解析树步行器或访问者)。

但是,谓词是不同的。它们用于指导解析器,也需要本机代码。您可以做的是将所有本机代码移动到生成的解析器派生的基类中。然后,您只需要用您的目标语言重新编写这个基类,并保持语法大部分不受本机代码的影响(除了调用本机代码的单个函数调用)。

这种方法的优点是不需要额外的库引用(#include 在 C/C++ 中,在其他语言中导入),这也是防止用于多个目标的本机代码。

【讨论】:

  • 将依赖于目标的逻辑移动到解析器的基类不会从语法中删除目标依赖,因为超类仍然需要由解析器(在 @header 部分)在目标语言依赖时尚。
猜你喜欢
  • 2012-11-10
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多