在 ANTLR 语法中有条件地添加自定义代码

Conditionally adding custom code in ANTLR grammar

我正在编写一个语法,需要一些用目标语言编写的自定义代码。添加例如

相当容易
@parser::members {
}

问题是我的目标是多种语言,但我还没有找到一种方法可以在不复制+粘贴整个语法的情况下针对多种语言。

有没有不借助复制+粘贴或外部预处理器的方法?

恐怕没有解决办法。根据定义,动作代码是用目标语言编写的,因为它直接从语法复制到生成的文件中。如果您的目标语言都可以处理 #ifdef #endif(例如,C、C++ 和 Obj-C),那么您可以使用它来分隔各个代码部分。否则,您可以使用带占位符的基本语法,并在预编译步骤(您生成 parsers/lexers 的地方)处理它,并用真正的目标代码替换占位符。这甚至使语法更清晰。