2011-11-17 41 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 {”,如果存在,检查“}”大括号内是否有任何字符。如果没有出现,则打印出错信息。