我尝试在verilog解析器中获取编译器指令,该解析器为我提供了真正的文件名/路径以及非预处理文件中的真实当前行。
Verilog语言需要我有一个预处理过程,但在访问期间我必须知道当前文件名(不能通过`include指令更改)以及非预处理文件中的真实当前行。 / p>
预处理部分添加verilog指令`line ,它指示当前文件和行。 然后我将预处理的缓冲区发送到antlr Lexer,解析并提取访问者的所有verilog信息。我必须在verilog语法描述中保留verilog编译器`line指令:
Preprocessing_line
: '`line ' Decimal_number String Decimal_number '\n' -> channel(2)
;
现在,我不知道如何在访问者的任何一点获取此专用频道信息?此解析器的目标语言是Python3。
答案 0 :(得分:0)
鉴于Preprocessing_line
令牌可能与解析树令牌没有可靠的关系(不同的Verilog编译器在注入参考线的位置可能有点松散),最简单的解决方案是创建一个临时的在游客步行之前的索引。
也就是说,在解析预处理的Verilog源之后,快速遍历整个令牌流(BufferedTokenStream#getTokens
),挑选Preprocessing_line
令牌,并构建current_line -> original_line
索引。
然后,在任何访问过的上下文中,检查基础令牌(ParserRuleContext#getStart
,#getStop
,#getSourceInterval
)以找到他们的current_line
(Token#getLine
)