有没有办法区分语言目标,并在语法文件中提供@members的适当版本?不同的语言目标使用不同的注释和语法。我想为不同的目标语言维护相同的语法文件。
对于Cpp (C++)目标:
@members {
// C++ target:
bool a_boolean = 0;
}对于Python3目标:
@members {
# Python target:
a_boolean: bool = True
}对于Java目标:
@members {
/** Java target:
*/
Boolean a_boolean = true;
}或者有没有可以检查目标语言的ANTLR4元条件?这是我自己的语法,但是这行有什么东西吗?
@members {
$if Cpp
// C++ target:
bool a_boolean = 0;
$fi
$if Python
# Python target:
a_boolean: bool = True
$fi
$if Java
/** Java target:
*/
Boolean a_boolean = true;
$fi
}发布于 2020-12-17 16:01:33
这一切都是不可能的。这是一个简单的复制-粘贴操作,ANTLR4在解析器生成时执行,包括所有空格,如缩进+换行符。
您唯一的选择就是区分C++和所有其他目标,因为对于C++,我引入了additional named actions,比如@parser::definitions。
但是,如果您向出现在所有目标中的@members之类的命名操作中添加了一些内容,那么在结果文件中(当使用C++作为目标时),您最终会得到非C++代码。
因此,总而言之,您的方法将不起作用,您最好使用不同的解决方案,比如解析器和词法分析器的基类,它们包含您需要的成员变量。有关详细信息,请搜索:
options {
superClass = ...;
}https://stackoverflow.com/questions/65335454
复制相似问题