2011-11-17 60 views
6

我開發了一些代碼,並且遇到了Linux機器上Tcl解釋器錯誤標記的問題。靜態檢測Tcl腳本中的錯誤

#!/usr/bin/tclsh 
if {1} { 
    puts "abc1" 
} elseif {} { 
    puts "abc2" 
} 

上面的代碼是不是"elseif"狀態標記錯誤,直到其進入 elseif條件。 有什麼辦法可以檢查這種無意中犯的錯字錯誤。

提前致謝!

+1

一個好的語法在編輯器中可能有助於突出。 – schlenk

+0

@schlenk如...? – Thufir

回答

2

爲了闡述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風格的警告,它只會在某些情況下是準確的

5

Tcl在編譯時沒有發現錯誤,在上面的示例中,它可以確定它永遠不需要首先檢查elseif子句;它只是直接發佈第一個puts

現在,在存在不平凡的第一個條件的情況下,elseif表達式中的錯誤直到達到它們才報告。這就是Tcl的語義 - 特別是if命令 - 是如何定義的;在執行命令時報告評估中的錯誤(與主要語法相反)。我可以理解你的挫敗感,並建議你查看關於靜態語法分析工具的Tcler's Wiki page,這些工具可以標記出潛在的問題(在非常適中的假設下,幾乎總是如此)。特別是,我聽說Frinkthe checker tool in TDK(後者是一個商業工具,但質量非常好)的好處。

+3

[Nagelfar](http://nagelfar.berlios.de/)是靜態Tcl語法檢查程序的另一個選項。 – schlenk

+0

@schlenk:+1;我應該記住也要列出。 –

0

Tcl在編譯時沒有發現錯誤,但是我們可以使用regexp來檢查語法。 匹配模式「elseif {」,如果存在,檢查「}」大括號內是否有任何字符。如果沒有出現,則打印出錯信息。