为什么期望与预期不匹配?

Why expect does not match as expected?

在我的案例中,expect 与调试模式的预期不匹配,我不明白为什么...

相关的tcl部分是这样的

...
set index 0
set p [lindex $propname $index]
send "prove -property {<embedded>::wrapper.$p}\r"
expect {
  "*proven\r\n\[<embedded>\] % " { 
        incr index
        if {$index == [llength $propname]} {
            send "exit\r"
            expect "*bash-4.2$ "
            send "exit\r"
            close
        }
        set p [lindex $propname $index]
        send "prove -property {<embedded>::wrapper.$p}\r"
        exp_continue
        }

  "*cex\r\n\[<embedded>\] % " { 
        send "visualize -violation -property <embedded>::wrapper.$p\r"
        expect "*\[<embedded>\] % "
        send "visualize -save -vcd cex.vcd -force\r"
        }
}
...

来自调试模式的输出:

expect: does "prove -property {<embedded>::wrapper.x0_nouse}\r\nINFO (IPF031): Settings used for this proof:\r\n    time_limit                    = 86400s\r\n    per_property_time_limit       = 1s * 10 ^ scan\r\n    engine_mode                   = Hp Ht N B \r\n    proofgrid_per_engine_max_jobs = 1\r\n    proofgrid_mode                = local\r\n    proofgrid_restarts            = 10\r\nINFO (IPF036): Starting proof on task: "<embedded>", 1 properties to prove with 0 already proven/unreachable\r\nINFO (IRS029): Starting reset analysis: phase 1 of 4.\r\nINFO (IRS030): Running reset analysis phase 2 of 4.\r\nINFO (IRS031): Running reset analysis phase 3 of 4.\r\nINFO (IRS020): Starting the reset analysis simulation with a limit of 100 iterations (phase 4 of 4).\r\nINFO (IRS024): Reset iterations 0 to 4 analyzed.\r\nINFO (IRS018): Reset analysis simulation executed for 3 iterations. Assigned values for 280 of 4626 design flops, 0 of 32 design latches, 136 of 2696 internal elements.\r\nUsing multistage preprocessing\r\nStarting reduce\r\nFinished reduce in 0.192s\r\n0.PRE: A proof was found: No trace exists. [0.00 s]\r\nINFO (IPF057): 0.PRE: The property "wrapper.x0_nouse" was proven in 0.00 s.\r\nFound proofs for 1 properties in preprocessing\r\nINFO (IPF059): Completed proof on task: <embedded>\r\nproven\r\n[<embedded>] % " (spawn_id exp4) match glob pattern "*proven\r\n[<embedded>] % "? no
 "*cex\r\n[<embedded>] % "? no

抱歉,该行有点长,但是如果您滚动到最右侧,您会看到该行的结尾正是第一种情况下所期望的。

您正在提供一个 glob 模式并且正确地需要转义 [] 以便 tcl 不会将其作为命令执行。您需要进一步转义 [],以便 [abc] 匹配文字字符串 [abc] 而不仅仅是集合 abc 中的一个字符。

然而,当用 "" 引用时,反斜杠也需要转义,所以你需要作为你的 glob 模式

"proven\r\n\\[<embedded>\\] % " 

作为替代方案,您可以尝试不使用 glob 的完全匹配

 -exact "proven\r\n\[<embedded>\] % "

您也可以使用 {} 代替 "",但是您的 \r 等将不会被转换。