Antlr 访问者在带有编译器指令的语法上

Antrl visitor on a grammar with compiler directive

我尝试在 verilog 解析器中获取编译器指令,它为我提供真实文件 name/path 和非预处理文件中的真实当前行。

Verilog 语言需要我拥有的预处理通道,但在访问期间我必须知道当前文件名(无法通过 `include 指令更改)以及非预处理文件中的真实当前行.

预处理部分添加verilog指令`line表示当前文件和行。 然后我将预处理后的缓冲区发送给antlr Lexer,用访问者解析和提取所有verilog信息。我必须在verilog语法描述中保留verilog编译器`line指令:

Preprocessing_line  
: '`line ' Decimal_number String Decimal_number '\n' -> channel(2)  
;

现在,我不知道如何在访客中随时获取这个专用频道信息?此解析器的目标语言是 Python3.

鉴于 Preprocessing_line 标记可能与解析树标记没有可靠的关系(不同的 Verilog 编译器在注入参考行的位置上可能有点松散),最简单的解决方案是创建访客步行前的临时索引。

即解析预处理后的Verilog源码​​后,快速遍历整个token流(BufferedTokenStream#getTokens),挑出Preprocessing_line个token,构建current_line -> original_line索引。

然后,在任何访问过的上下文中,检查底层令牌(ParserRuleContext#getStart#getStop#getSourceInterval)以找到它们的 current_lineToken#getLine)