你得到了一個機會,可以為 Bracketeer™ 撰寫軟體,那是一台古老卻強大的大型主機。 它上面執行的軟體是用一種專有語言寫成的。 這門語言的語法大部分你都很熟悉,但你會注意到_好多_方括號、大括號和小括號。 Bracketeer™ 雖然強大,卻缺乏彈性。 只要原始碼裡有任何未成對的方括號、大括號或小括號,Bracketeer™ 就會當機,必須重新開機。 為了避免這種情況,你開始寫一段程式,在把程式碼放上 Bracketeer™ 執行之前,先確認方括號、大括號和小括號是否成對。
給定一個包含方括號 []、大括號 {}、小括號 () 或這些字元任意組合的字串,請確認所有成對的括號是否都正確配對並正確巢狀。其他字元都應該忽略。舉例來說,"{what is (42)}?" 是配對正確的,而 "[text}" 則不是。
Tcl 是一門非常簡單的語言,但它的翻譯員解析程式碼的方式有幾個很棘手的邊界情況。
大括號在 Tcl 裡只是把一段文字括起來的方式,那段文字可以被解讀成程式碼或資料。在大括號內可以出現巢狀的大括號,但巢狀的大括號必須成對平衡。Tcl 的 man page 這樣寫道:
大括號可以在單字內巢狀:每多一個左大括號,就必須多一個右大括號(不過,如果單字內的左大括號或右大括號是_以反斜線跳脫_的,那麼在尋找對應的右大括號時就不會把它計入)。
那裡的用字相當精確:如果你想留下沒有配對的左大括號或右大括號字元,就必須用反斜線將它跳脫。所以不要這樣寫:
proc isOpenBrace {char} {
return [expr {$char eq "{"}]
# ......................^ will not work
}
你必須這樣寫
proc isOpenBrace {char} {
return [expr {$char eq "\{"}]
# ......................^^ will work
}
這在 Tcl 解析註解的方式上可能會有問題,而這種方式和大多數語言不同。更多討論請見 Tcl wiki。
同樣地,由於 Tcl 用方括號來做命令替換,即使是在雙引號字串內,你也得小心跳脫左方括號。
除了關聯式陣列變數之外,小括號只是一般的字元。