我正在尝试使用 ANTLR4 来解析 Verilog 代码。我正在使用这里找到的 Verilog 语法https://github.com/antlr/grammars-v4/blob/master/verilog/Verilog2001.g4
示例代码是
module blinker(
input clk,
input rst,
output blink
);
reg [24:0] counter_d, counter_q;
assign blink = counter_q[24];
always @(*) begin
counter_d = counter_q + 1'b1;
end
always @(posedge clk) begin
if (rst) begin
counter_q <= 25'b0;
end else begin
counter_q <= counter_d;
end
end
endmodule
问题是线路
always @(*) begin
(*) 被拆分为标记 '(*' 和 ')'。
在语法文件的第 723 行有
event_control :
'@' event_identifier
| '@' '(' event_expression ')'
| '@' '*'
| '@' '(' '*' ')'
;
如果不是第 1329 行,哪个应该匹配 @(*) 行
attribute_instance : '(*' attr_spec ( ',' attr_spec )* '*)' ;
我对这一切都很陌生,但我猜测该行中的 '(*' 标记与代码中的 (* 匹配并且搞砸了。
在阅读了 The Definitive ANTLR 4 Reference 的一些内容后,我认为首先定义的规则将优先。但是,我认为它正在做一个贪婪的比赛?
关于如何修复语法的任何想法?