这个post about the antlr simple example展示了如何为java创建和使用语法。
但是,这会混合Exp.g源中的语法和Java源代码。
我的问题是,是否可以将语法文件与目标语言分离,以便一个语法文件可用于生成多个Java,Scala,C ++等Lexers / Parsers?
答案 0 :(得分:1)
这主要取决于在语法中使用目标代码的原因。是否仅使用找到的令牌执行某些操作代码(例如,构建符号表或替代树表示)然后确实没有问题请删除此类本机代码并在之后进行处理(使用解析树助手或访问者)。
然而,谓词是不同的。它们用于指导解析器并且还需要本机代码。您可以做的是将所有本机代码移动到生成的解析器派生的基类中。然后,您只需要在目标语言中重写此基类,并保持语法大部分不含本机代码(除了调用本机代码的单个函数调用之外)。
这种方法的优点是不需要额外的库引用(在C / C ++中包含#include,在其他语言中导入),这也是防止用于多个目标的本机代码。