我尝试在Windows PC上使用ActiveState TCL来运行以下TCL。看起来我在#\(.* ?\)及其匹配的greedy到下一个语句中。你知道我做错了什么或者怎么补救吗
proc extract_verilog_instances {text} {
set rexp {(\w+)\s+(\#\s*\((?:.*?)\)\s*)?(\w+(?:\[\d+\])?)\s*\(}
# rexp will match any of the following statement types:
#
# module_name instance_name (
# module_name instance_name[0] (
# module_name #(parameter1, parameter2) instance_name (
# module_name #(parameter1, parameter2) instance_name[0] (
set regrun [regexp -inline -all -indices -expanded $rexp $text]
foreach {m0 m1 m2 m3} $regrun {
set start_index [lindex $m0 0]
set end_index [lindex $m0 1]
set module [string range $text [lindex $m1 0] [lindex $m1 1]]
set instance [string range $text [lindex $m3 0] [lindex $m3 1]]
puts "module:$module instance:$instance"
}
}
set vlog {
second_module #(2) inst2 (.in2(sig2), .out2(sig3));
third_module inst3 (.in3(sig3), .out3(sig4));
fourth_module #(.in4_clk_freq(50), .in4_rst_val(1'b0)) inst4 (.in4_clk(clk), .in4_rst(rst), .in4_in1(sig4), .in4_in2(sig5), .out4(sig6));
}
extract_verilog_instances $vlog
proc extract_verilog_instances5 $vlog
预期输出:
module:second_module instance:inst2
module:third_module instance:inst3
module:forth_module instance:inst4
实际产量:
module:second_module instance:inst4
1条答案
按热度按时间vaqhlq811#
你可以用
在Tcl正则表达式中,贪婪是用模式中的第一个量词设置的。因此,如果您使用
\w+?
作为第一个量化子模式,则所有后续的+
或*
模式将自动转换为+?
和*?
。如果您想在PCRE兼容的regex测试仪中测试这个regex,上面的模式应该写成
参见regex demo。
这个正则表达式适合你,因为模式开始的
\w+?
和\w+
一样,因为它后面有一个强制性的\s
,而所有其他的懒惰模式都是因为它们后面有强制性的模式(\(
在这里非常好,也很重要)。