用于多语言生成的 Antlr

Antlr for multiple language generation

post about the antlr simple example 展示了如何为 java 创建和使用语法。

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

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

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

但是,谓词是不同的。它们用于引导解析器并且还需要本机代码。您可以做的是将所有本机代码移动到您生成的解析器派生的基 class 中。然后你只需要用你的目标语言重写这个基础 class 并保持语法大部分没有本地代码(调用本地代码的单个函数调用除外)。

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