Розбір рядка тексту у форматі Smart Game Format.
SGF - це стандартний формат для зберігання файлів настільних ігор, зокрема ґо.
Формат SGF доволі простий. Файл SGF зазвичай містить одне дерево вузлів, де кожен вузол є масивом властивостей. Масив властивостей містить пари ключ-значення; кожен ключ може траплятися лише один раз, але може мати кілька значень.
У цій вправі ми розберемо рядок тексту (англ. string) у форматі SGF і повернемо деревоподібну структуру властивостей.
Файл SGF може мати такий вигляд:
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Це дерево з трьома вузлами:
Як неважко уявити, файл SGF містить багато вузлів з єдиним дочірнім вузлом, тому для цього є скорочений запис.
SGF може кодувати варіанти гри. Гравці в ґо часто повертаються назад під час розбору партій (спробуймо так, не працює, спробуймо інакше), і SGF підтримує варіанти послідовностей гри. Наприклад:
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Тут кореневий вузол має два варіанти. Перший (за домовленістю він показує, як насправді зіграли) - це той, де чорні грають у точці 1-1. Цей файл чорним надіслав їхній учитель, який вказав на розумніший хід у другому дочірньому вузлі кореневого вузла: B[dd] (точка 4-4, дуже стандартний початок, щоб зайняти кут).
Ключ може мати кілька повʼязаних із ним значень. Наприклад:
(;FF[4];AB[aa][ab][ba])
Тут AB (додати чорні) використовують, щоб додати на дошку три чорні камені.
Усі значення властивостей належатимуть до типу Text у SGF. Решту типів значень реалізовувати не потрібно. Можна прочитати повну документацію типу Text, але нижче наведено стислий виклад найважливішого:
\, інакше вони залишаються символами нового рядка.\ - це символ екранування.
Будь-який не-пробільний символ після \ вставляється як є.
Будь-який пробільний символ після \ підпадає під наведені вище правила.
Зауважте, що SGF не має керуючих послідовностей для пробільних символів, як-от \t чи \n.Будьмо уважні та не сплутаймо:
Керуючі послідовності в рядкових літералах могли вже бути оброблені парсером мови програмування, перш ніж їх передали парсеру SGF.
У SGF (і в розборі загалом) є ще кілька складнощів, які здебільшого можна залишити поза увагою. Вважатимемо, що вхідні дані закодовані в UTF-8, а тести не міститимуть властивості charset, тож про це можна не хвилюватися. Крім того, можемо припустити, що всі символи нового рядка мають unix-стиль (\n, жодних \r чи \r\n у тестах не буде) і що в тестах не буде необовʼязкових пробільних символів між властивостями, вузлами тощо.