tcl错误:close-brace后的额外字符

时间:2014-02-26 14:48:03

标签: tcl

尝试在close-brace'错误后调试此额外字符时遇到问题。错误消息指向我的proc线...我只是看不到它2天了!

# {{{ MAIN PROGRAM
proc MAIN_PROGRAM  { INPUT_GDS_OASIS_FILE  L   CELL_LIST_FILE        }     {

    if { [file exists $CELL_LIST_FILE] == 0 } {
        set celllist [$L cells]
    } else {
        set fp [open $CELL_LIST_FILE r]
        set file_data [read $fp]
        close $fp
        set celllist [split $file_data "\n"]
        set totalcells [expr [llength $celllist] - 1]
    }

    set counter 0
    foreach cell $celllist {
        set counter [expr {$counter + 1}]
        set value [string length $cell] 
        set value3 [regexp {\$} $cell]
        if { $value > 0 && $value2 == 0 && $value3 == 0 }  {
            #   EXTRACT BOUNDRARY SIZE FIRST
            puts "INFO -- READING Num : $counter/$totalcells -- $cell ..." 
            ONEIP_EXTRACT_BOUNDARY_SIZE $cell $L "IP_SIZE/$cell.txt" 
            exec gzip -f "IP_SIZE/$cell.txt"
        }
    }
    # }}}
}
# }}}

3 个答案:

答案 0 :(得分:3)

这似乎是在评论中使用大括号的不幸情况。 Tcl解析器在注释(http://tcl.tk/man/tcl8.5/TclCmd/Tcl.htm)之前查看大括号。如果在注释中添加大括号会导致打开/关闭括号的数量不匹配,则会出现问题。

尝试使用其他评论方式,并从评论中删除“{{{”和“}}}”。

答案 1 :(得分:2)

我很确定这可以归结为proc体内评论中的括号 维基页面here有很好的解释。简而言之,Tcl评论不像评论大多数其他语言,并且在其中具有无与伦比的括号导致所有 各种各样的问题。

所以在proc结束之前#}}}中的大括号可能就是问题。

答案 2 :(得分:1)

即使在评论中,Tcl也要求程序体保持平衡。

好的,这是一个完全的谎言。 Tcl确实需要大括号引用的字符串来支持平衡(Tcl的括号引用的字符串就像bash中的单引号字符串,除了它们嵌套)。 proc命令只是将其第三个参数解释为脚本(用于定义过程体),并且对于那种事情使用括号引用的字符串是很常见的。这是Tcl通用语法的一个特性,也是Tcl在处理DSL这样的事情上非常好的原因。

你可以这样做:

proc brace-demo args "puts hi; # {{{"
brace-demo do it yeah

这将很好。完全合法的Tcl,并且在具有不平衡支架的程序体中发表评论。事实上,对于几乎任何真实的程序来说,将所有必需的反斜杠放入以停止对变量和命令替换的解释过早是一个总的问题。为简单起见,每个人都使用大括号,因此必须平衡它们。

除了偶尔发表评论之外,这几乎不是问题。