Antlr4 带编译器指令的语法上的ANTR访问者

Antlr4 带编译器指令的语法上的ANTR访问者,antlr4,visitor,Antlr4,Visitor,我尝试在verilog解析器中获取编译器指令,它为我提供了真实的文件名/路径以及未预处理文件中的真实当前行 Verilog语言需要一个预处理过程,但在访问过程中,我必须知道当前文件名(不能通过include指令更改)以及非预处理文件中的真实当前行 预处理部分添加verilog指令'line,该指令指示当前文件和行。 然后,我将预处理的缓冲区发送到antlr Lexer,用访问者解析并提取所有verilog信息。我必须在verilog语法描述中保留verilog编译器的'line指令: Prepr

我尝试在verilog解析器中获取编译器指令,它为我提供了真实的文件名/路径以及未预处理文件中的真实当前行

Verilog语言需要一个预处理过程,但在访问过程中,我必须知道当前文件名(不能通过include指令更改)以及非预处理文件中的真实当前行

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

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

现在,我不知道如何在访问者的任何时候获得这个专用频道的信息?这个解析器的目标语言是Python3。

考虑到
预处理_行
标记可能与解析树标记没有可靠的关系(不同的Verilog编译器可能对它们在何处注入引用行有点松散),最简单的解决方案是在访问者漫游之前创建一个临时索引

也就是说,在解析预处理的Verilog源代码后,快速遍历整个令牌流(
BufferedTokenStream\35; getTokens
),找出
Preprocessing\u line
令牌,并构建
current\u line->original\u line
索引


然后,在任何访问过的上下文中,检查底层令牌(
parseruleContext\getStart
\getStop
\getSourceInterval
)以查找它们的
当前行
token\getLine

感谢GRosenberg的回答。您对整个令牌流进行快速传递是什么意思?只需浏览CommonTokenStream的结果?是的,只需简单的for循环
stream.getTokens()
即可找到每一行
预处理标记。