Нам випала нагода написати програмне забезпечення для Bracketeer™, старого, але потужного мейнфрейма. Програми, що на ньому працюють, написані пропрієтарною мовою. Багато в її синтаксисі нам знайоме, але ми помічаємо безліч дужок: квадратних, фігурних і круглих. Попри всю свою потужність, Bracketeer™ позбавлений гнучкості. Якщо у вихідному коді є хоч одна незбалансована дужка (квадратна, фігурна чи кругла), Bracketeer™ падає і його доводиться перезавантажувати. Щоб уникнути такого розвитку подій, ми починаємо писати код, який перевіряє, що квадратні, фігурні та круглі дужки збалансовані, перш ніж спробувати запустити його на Bracketeer™.
Дано рядок тексту (англ. string), що містить квадратні дужки [], фігурні дужки {}, круглі дужки () або будь-яку їхню комбінацію. Перевірте, що всі пари збігаються та правильно вкладені одна в одну. Будь-які інші символи слід ігнорувати. Наприклад, "{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.
Так само, оскільки Tcl використовує дужки для підстановки команд., навіть усередині рядків тексту (англ. string) у подвійних лапках треба бути обережними з екрануванням відкритих дужок.
За винятком змінних асоціативних масивів, круглі дужки - це просто звичайні символи.