我在编写的 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;
}
}
;
问题是我的评论进入了隐藏频道,虽然我可以通过使用正则表达式在词法分析器操作中处理评论来识别这些编译指示,但我还没有找到一种方法将所有即将到来的标记定向到隐藏通道,直到“--编译指示翻译_on ”。这是可能的还是您通常会使用不同的方法?