有没有办法区分语言目标并在语法文件中提供适当版本的@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
}
1条答案
按热度按时间w8ntj3qf1#
这一切都不可能。这是一个简单的复制粘贴操作,由antlr4在解析器生成时执行,包括缩进+换行等所有空格。
唯一的选择是区分c和所有其他目标,因为对于c我引入了额外的命名操作,比如
@parser::definitions
.但是,如果您向命名操作添加了
@members
,它出现在所有目标中,然后结果文件中会出现非c代码(当使用c作为目标时)。总之,您的方法将不起作用,您最好使用不同的解决方案,比如parser和lexer的基类,其中包含您需要的成员变量。有关详细信息,请搜索: