gpt4 book ai didi

ANTLR Verilog @(*) 匹配两个标记

转载 作者:行者123 更新时间:2023-12-04 04:38:33 25 4
gpt4 key购买 nike

我正在尝试使用 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 之后,我认为首先定义的规则会优先。但是,我认为这是在进行贪婪的匹配?

关于如何修复语法的任何想法?

最佳答案

I'm new to all of this, but I'm guessing that the '(*' token from that line is matching the (* in the code and screwing things up.



你是对的。

After reading a bit from The Definitive ANTLR 4 Reference, I thought that the rule first defined would take precedence. However, I think that it's doing a greedy match?



尽管在解析器规则中定义,文字标记实际上是词法分析器规则,只有在它们匹配相同数量的字符时才按定义的顺序优先。如果词法分析器规则可以匹配更多,它就会匹配(如您所见)。

我不知道任何 Verilog,但快速解决它的方法是让 attribute_instance看起来像:
attribute_instance : '(' '*' attr_spec ( ',' attr_spec )* '*' ')' ;

但是,如果词法分析器丢弃字符,如空格,则输入 "( *" (括号、空格、星号) 也将作为 attribute_instance 的开始匹配.如果这不理想,您可以让您的 event_control看起来像这样:
event_control 
: '@' event_identifier
| '@' '(' event_expression ')'
| '@' '*'
| '@' ( '(' '*' | '(*' ) ')'
;

请注意 ( '(' '*' | '(*' )在最后一个选项中,它匹配两个单个标记, '(''*' (中间可能有空格!),或单个标记 '(*' .

关于ANTLR Verilog @(*) 匹配两个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com