轨道
/
Tcl
Tcl
/
练习
/
匹配括号
匹配括号

匹配括号

简单

简介

你有机会为 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 用方括号进行命令替换,即使在双引号字符串内,也要小心转义左方括号。

圆括号

除了关联数组变量之外,圆括号只是普通字符。


来源

Ginna Baker
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Tcl Exercism

准备好开始 匹配括号 了吗?

注册 Exercism,借助 135 个练习 和真人导师指导,学习并掌握 Tcl,全部免费。