带有编译器指令

时间:2018-04-26 10:42:55

标签: antlr4 visitor

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

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

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

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

现在,我不知道如何在访问者的任何一点获取此专用频道信息?此解析器的目标语言是Python3。

1 个答案:

答案 0 :(得分:0)

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

也就是说,在解析预处理的Verilog源之后,快速遍历整个令牌流(BufferedTokenStream#getTokens),挑选Preprocessing_line令牌,并构建current_line -> original_line索引。

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