2

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 を少し読んだ後、最初に定義されたルールが優先されると思いました。しかし、欲張りな勝負をしていると思いますか?

文法を修正する方法についてのアイデアはありますか?

4

2 に答える 2

2

私はこれらすべてに慣れていませんが、'(*'その行のトークンがコード内で一致してい(*て、物事が台無しになっていると推測しています。

あなたは正しいです。

The Definitive ANTLR 4 Reference を少し読んだ後、最初に定義されたルールが優先されると思いました。しかし、欲張りな勝負をしていると思いますか?

パーサー ルールで定義されていますが、リテラル トークンは実際にはレクサー ルールであり、同じ量の文字に一致する場合にのみ、定義された順序で優先されます。lexer ルールがより多く一致できる場合は、そうします (観察したように)。

私はVerilogを知りませんが、簡単な修正は次のようにすることattribute_instanceです:

attribute_instance : '(' '*' attr_spec ( ',' attr_spec )* '*' ')' ;

ただし、レクサーがスペースなどの文字を破棄する場合、入力"( *"(括弧、スペース、スター) も a の開始として一致しattribute_instanceます。それが望ましくない場合は、次のようにすることができますevent_control

event_control 
 : '@' event_identifier
 | '@' '(' event_expression ')'
 | '@' '*'
 | '@' ( '(' '*' | '(*' ) ')'
 ;

( '(' '*' | '(*' )最後の選択肢の に注意してください。これは、2 つの単一のトークンに一致する'('and '*'(間にスペースを入れることもできます!)、または単一の token'(*'です。

于 2013-10-09T19:48:06.933 に答える