我開發了一些代碼,並且遇到了Linux機器上Tcl解釋器錯誤標記的問題。靜態檢測Tcl腳本中的錯誤
#!/usr/bin/tclsh
if {1} {
puts "abc1"
} elseif {} {
puts "abc2"
}
上面的代碼是不是"elseif"
狀態標記錯誤,直到其進入 elseif
條件。 有什麼辦法可以檢查這種無意中犯的錯字錯誤。
提前致謝!
我開發了一些代碼,並且遇到了Linux機器上Tcl解釋器錯誤標記的問題。靜態檢測Tcl腳本中的錯誤
#!/usr/bin/tclsh
if {1} {
puts "abc1"
} elseif {} {
puts "abc2"
}
上面的代碼是不是"elseif"
狀態標記錯誤,直到其進入 elseif
條件。 有什麼辦法可以檢查這種無意中犯的錯字錯誤。
提前致謝!
爲了闡述Donal的答案,Tcl在編譯時沒有發現錯誤,因爲在一般情況下它不能完成,在if之前執行的任何代碼可能已經重新定義了if命令,所以它可能是有效的唯一方法以確定是否是這種情況是運行的代碼(即,這是在停機問題)
考慮此腳本:
gets stdin input
if {$input == "fail"} {
rename if if_
proc if {arg1 arg2 arg3} {
puts "ha ha"
}
}
if {1} { puts "success"}
顯然是不可能靜態地確定,如果{1}線具有沒有運行程序的正確參數數量
TCL確實沒有任何語法,編譯器可以檢查什麼都沒有,你可以做的最好的就是Lint風格的警告,它只會在某些情況下是準確的
Tcl在編譯時沒有發現錯誤,在上面的示例中,它可以確定它永遠不需要首先檢查elseif
子句;它只是直接發佈第一個puts
。
現在,在存在不平凡的第一個條件的情況下,elseif
表達式中的錯誤直到達到它們才報告。這就是Tcl的語義 - 特別是if
命令 - 是如何定義的;在執行命令時報告評估中的錯誤(與主要語法相反)。我可以理解你的挫敗感,並建議你查看關於靜態語法分析工具的Tcler's Wiki page,這些工具可以標記出潛在的問題(在非常適中的假設下,幾乎總是如此)。特別是,我聽說Frink和the checker tool in TDK(後者是一個商業工具,但質量非常好)的好處。
[Nagelfar](http://nagelfar.berlios.de/)是靜態Tcl語法檢查程序的另一個選項。 – schlenk
@schlenk:+1;我應該記住也要列出。 –
Tcl在編譯時沒有發現錯誤,但是我們可以使用regexp來檢查語法。 匹配模式「elseif {」,如果存在,檢查「}」大括號內是否有任何字符。如果沒有出現,則打印出錯信息。
有tcl靜態語法檢查器,可以找到這樣的問題。
這裏是這樣checkes名單:http://wiki.tcl.tk/3162
的ttclchecker http://www.xdobry.de/ttclcheck 產生以下錯誤消息這麼短的腳本
stackoverflow.tcl:4: error in expression missing operator <<{}>>
一個好的語法在編輯器中可能有助於突出。 – schlenk
@schlenk如...? – Thufir