你有机会为 Bracketeer™ 编写软件,这是一台古老却功能强大的大型机。 它上面运行的软件是用一种专有语言编写的。 这种语言的语法大部分看起来很熟悉,但你会注意到_大量_的方括号、大括号和圆括号。 尽管 Bracketeer™ 功能强大,却缺乏灵活性。 只要源代码里出现任何不配对的方括号、大括号或圆括号,Bracketeer™ 就会崩溃,必须重启。 为了避免这种情况,你开始编写一段代码,用来在把程序放到 Bracketeer™ 上运行之前,先检查方括号、大括号和圆括号是否配对。
给定一个字符串,其中可能包含方括号[]、大括号{}、圆括号()或它们的任意组合,请验证所有括号对是否都匹配且嵌套正确。其他字符一律忽略。例如,"{what is (42)}?" 是平衡的,而"[text}"则不是。
Tcl 是一门非常简单的语言,但它的翻译解析代码的方式有几个棘手的边界情况。
在 Tcl 中,花括号只是把一段文本括起来的一种方式,这段文本可以被解释为代码或数据。花括号内可以出现嵌套的花括号,但嵌套的花括号必须配对。Tcl 的 man 手册页是这样写的:
花括号在词内嵌套:每多一个左花括号,就必须多一个右花括号(不过,如果词内的左花括号或右花括号_用反斜杠转义_,那么在查找匹配的右花括号时就不会计入它)。
那里的措辞相当具体:如果你想使用一个不配对的左花括号或右花括号字符,就必须用反斜杠转义。所以不要这样做:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
应该这样做
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
这在与 Tcl 解析注释的方式结合时可能会带来麻烦,而 Tcl 解析注释的方式与大多数语言不同。更多讨论见 Tcl wiki。
同样,由于 Tcl 用方括号进行命令替换,即使在双引号字符串内,也要小心转义左方括号。
除了关联数组变量之外,圆括号只是普通字符。