我开发了一些代码,并且遇到了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