我已经开发了一些代码,我在Linux机器上遇到错误标记Tcl解释器的问题。
#!/usr/bin/tclsh
if {1} {
puts "abc1"
} elseif {} {
puts "abc2"
}
上述代码在"elseif"
条件进入之前没有标记错误
elseif
条件。
有没有办法检查无意中完成的这种拼写错误。
答案 0 :(得分:6)
Tcl在编译时没有发现错误,在上面的示例中,它可以确定它永远不需要首先检查elseif
子句;它只是直接发出puts
。
现在,在存在非平凡的第一个条件的情况下,在达到elseif
表达式之前不会报告错误。这就是如何定义Tcl的语义 - 尤其是if
命令的语义;在执行命令时报告评估中的错误(与总主语法相反)。我可以理解你对此的沮丧,并建议你查看Tcler's Wiki page静态语法分析工具,它可以为你标记潜在的问题(在非常适度的假设下,几乎总是如此)。特别是,我听说过有关Frink和the checker tool in TDK的好消息(后者是一种商业工具,但质量非常高)。
答案 1 :(得分:3)
为了详细说明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"}
显然,如果不运行程序,静态确定if {1}行是否具有正确数量的参数
TCL实际上几乎没有语法,编译器无法检查,你能做的最好的是Lint风格的警告,这在某些情况下才准确
答案 2 :(得分:0)
Tcl在编译时没有发现错误,但我们可以使用 regexp 检查语法。 匹配模式“elseif {”,如果存在,检查“}”花括号内是否有任何字符。如果没有任何内容,则打印错误消息。
答案 3 :(得分:0)
有tcl静态语法检查器可以找到这样的问题。
以下是此类支票的列表:http://wiki.tcl.tk/3162
ttclchecker http://www.xdobry.de/ttclcheck 为此简短脚本生成以下错误消息
stackoverflow.tcl:4: error in expression missing operator <<{}>>