静态检测Tcl脚本中的错误

时间:2011-11-17 06:53:11

标签: tcl

我已经开发了一些代码,我在Linux机器上遇到错误标记Tcl解释器的问题。

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

上述代码在"elseif"条件进入之前没有标记错误 elseif条件。 有没有办法检查无意中完成的这种拼写错误。

4 个答案:

答案 0 :(得分:6)

Tcl在编译时没有发现错误,在上面的示例中,它可以确定它永远不需要首先检查elseif子句;它只是直接发出puts

现在,在存在非平凡的第一个条件的情况下,在达到elseif表达式之前不会报告错误。这就是如何定义Tcl的语义 - 尤其是if命令的语义;在执行命令时报告评估中的错误(与总主语法相反)。我可以理解你对此的沮丧,并建议你查看Tcler's Wiki page静态语法分析工具,它可以为你标记潜在的问题(在非常适度的假设下,几乎总是如此)。特别是,我听说过有关Frinkthe 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 <<{}>>