Tcl脚本中错误的静态检测

Tcl脚本中错误的静态检测,tcl,Tcl,我已经开发了一些代码,并且在Linux机器上面临Tcl解释器错误标记的问题 #/usr/bin/tclsh 如果{1}{ 把“abc1” }埃尔塞伊夫{}{ 把“abc2” } 上述代码在进入状态之前,不会标记“elseif”条件的错误 elseif条件。 是否有任何方法可以检查无意中发生的此类键入错误。Tcl在编译时没有发现错误,在上面的示例中,它可以确定它将不再需要首先检查elseif子句;它只是直接发布第一个放置的 现在,在存在非平凡的第一个条件的情况下,elseif表达式中的错误在到达

我已经开发了一些代码,并且在Linux机器上面临Tcl解释器错误标记的问题

#/usr/bin/tclsh
如果{1}{
把“abc1”
}埃尔塞伊夫{}{
把“abc2”
}
上述代码在进入状态之前,不会标记“elseif”条件的错误
elseif
条件。
是否有任何方法可以检查无意中发生的此类键入错误。

Tcl在编译时没有发现错误,在上面的示例中,它可以确定它将不再需要首先检查
elseif
子句;它只是直接发布第一个
放置的


现在,在存在非平凡的第一个条件的情况下,
elseif
表达式中的错误在到达之前不会报告。这就是如何定义Tcl的语义,尤其是
if
命令;执行命令时会报告计算错误(与主要语法相反)。我可以理解您对此的不满,并建议您查看on静态语法分析工具,它可以为您指出潜在的问题(在非常温和的假设下,这些假设实际上总是正确的)。特别是,我听说了关于and的好消息(后者是一个商业工具,但质量非常高)。

为了详细说明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样式的警告,它只在某些情况下是准确的

TCL在编译时没有发现错误,但我们可以使用regexp检查语法。
匹配模式“elseif{”,如果存在,请检查“}”大括号内是否有任何字符。如果不存在任何问题,则打印错误消息。

有tcl静态语法检查器可以发现此类问题

以下是此类检查的列表:

ttclchecker 为此短脚本生成以下错误消息

stackoverflow.tcl:4: error in expression missing operator <<{}>>
stackoverflow.tcl:4:表达式中的错误缺少运算符

是静态Tcl语法检查器的另一个选项。@schlenk:+1;我应该记得也列出了。在编辑器中突出显示好的语法可能会有所帮助。@schlenk,比如。。。?