我在编写的VHDL语法中遇到了ANTLR问题。 VHDL没有真正的多行注释,也没有编译指示,所以工具供应商发明了一种基于注释的机制来排除代码的某些部分,比如
-- pragma translate_off
code to disregard
-- pragma translate_on
(' - '在VHDL中引入注释),其中pragma的实际代码各不相同,“synopsys translate off”和“rtl translate_off”是已知的变体。
ANTLR语法处理注释的部分现在是
@lexer::members {
private static final Pattern translateOnPattern = Pattern.compile("\\s*--\\s*(rtl_synthesis\\s+on|(pragma|synthesis|synopsys)\\s+translate(\\s|_)on)\\s*");
private static final Pattern translateOffPattern = Pattern.compile("\\s*-- \\s*(rtl_synthesis\\s+off|(pragma|synthesis|synopsys)\\s+translate(\\s|_)off)\\s*");
private boolean translateOn = true;
}
[...]
COMMENT
: '--' ( ~( '\n' | '\r' ) )*
{
$channel = CHANNEL_COMMENT;
String content = getText();
Matcher mOn = translateOnPattern.matcher(content);
if(mOn.matches()) {
translateOn = true;
}
Matcher mOff = translateOffPattern.matcher(content);
if(mOff.matches()) {
translateOn = false;
}
}
;
问题是我的评论转到了隐藏的频道,虽然我可以通过使用正则表达式在词法分析器动作中处理注释来识别这些编译指示,但我还没有找到一种方法将所有即将到来的标记指向隐藏的通道,直到“ - - pragma translate_on“。这是可能的还是你通常会采用不同的方法?