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_line
(Token#getLine
)
我尝试在 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_line
(Token#getLine
)