我正在尝试使用 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 的一些内容后,我认为首先定义的规则将优先。但是,我认为它正在做一个贪婪的比赛?
关于如何修复语法的任何想法?