ГоБиблиотека: SGF/ОсновноеОпределение


1999–12–17

Оглавление документа

1. Основы SGF


SGF является текстовым форматом (не двоичным).

Он содержит деревья игр со всеми их узлами и свойствами и ничего более. Исключений нет. Если Вам надо сохранить некоторую информацию в файле, то для этого должно быть определено свойство (специфичное для игры).


Пример структуры дерева

Это дерево, записанное в предупорядоченном
(pre-order) виде:
(root(ab(c)(de))(f(ghi)(j)))

Дерево, как его видит пользователь.
Первая линия — это основная линия игры, остальные линии — варианты.
Пример SGF:
(;FF[4]C[root](;C[a];C[b](;C[c])
(;C[d];C[e]))
(;C[f](;C[g];C[h];C[i])
(;C[j])))


Имеются дополнительные примеры?.

Нумерация узлов:
При нумерации узлов рекомендуется начинать с нуля. Узлы необходимо нумеровать в том порядке, в котором они сохранены в файле.
Пример (для вышеупомянутого файла): root=0, a=1, b=2, c=3, d=4, e=5, f=6, g=7, h=8, i=9 and j=10.
SGF использует кодировку US ASCII для всех своих идентификаторов и значений свойств, исключая ПростойТекст и Текст. Кодировка для ПростогоТекста и Текста определяется с помощью свойства CA.



2. Основное (EBNF) определение


Условные обозначения EBNF Вы можете найти в литературе и в Интернете.
Краткое резюме:

  "..." : терминальный символ
  [...] : опциональность: появляется не больше одного раза
  {...} : повторение: любое число раз, включая нуль
  (...) : группировка
    |   : исключающее или
 курсив : параметр объясненный в каком-нибудь другом месте


2.1. EBNF определение


  Коллекция     = ДеревоИгры { ДеревоИгры }
  ДеревоИгры    = "(" Последовательность { ДеревоИгры } ")"
  Последовательность = Узел { Узел }
  Узел          = ";" { Свойство }
  Свойство      = Идентификатор Значение { Значение }
  Идентификатор = ЗаглБуква { ЗаглБуква }
  Значение      = "[" CТипЗначения "]"
  CТипЗначения  = (ТипЗначения | Композиция)
  ТипЗначения   = (Пусто | Число | Действительный | Парный | Цвет | ПрстойТекст |
                  Текст | Точка | Ход | Камень)


Пустые символы (пробел, табуляция, перевод каретки, вертикальная табуляция и т.п.) могут добавляться между Значениями, Свойствами, Узлами, Последовательностями и ДеревьямиИгры.
Существуют два типа списков свойств: 'список' и 'псписок'.

'список':    Значение { Значение }
'псписок':   ((Значение { Значение }) | Пусто)
Другими словами псписок это список или "[]".

2.2. Некоторые замечания по свойствам


Идентификаторы свойств определяются как ключевые слова, используя только заглавные (прописные) буквы. На данный момент идентификаторы состоят не более чем из двух прописных букв.

Порядок свойств в узле не фиксирован. Он может меняться каждый раз, когда сохраняется файл и может отличаться от приложения к приложению. Более того, приложения не должны зависеть от порядка значений свойств. Порядок значений также может изменяться.

Любой волен определять дополнительные, частные свойства до тех пор, пока они не пересекаются со стандартными свойствами, определенными в спецификации.

Поэтому если кто-то пишет просмотрщик SGF, то важно пропускать незнакомые свойства. Приложению следует выдавать предупреждение при пропуске незнакомых или ошибочных свойств.

Только по одному свойству каждого вида допускается на один узел, например, нельзя иметь два комментария в одном узле:

... ; C[комментарий1] B [dg] C[комментарий 2] ; ...
Это ошибка.

Каждое свойство имеет свой тип. Типы свойств налагают ограничения на определенные свойства, например, в каком узле они допустимы и с какими свойствами они могут быть скомбинированы.

2.2.1. Типы свойств


На данный момент существует пять типов свойств:

ход
Свойства этого типа концентрируются на осуществлении хода, а не на позиции достигнутой к этому ходу. Свойства хода не должны быть смешаны со свойствами установки внутри одного и того же узла.
Примечание: плохим стилем является размещение свойств хода в корневых узлах (несмотря на то, что это не запрещено).

установка
Свойства этого типа сосредотачиваются на текущей позиции. Свойства установки не должны смешиваться со свойствами хода внутри узла.

корень
Корневые свойства могут появляться лишь в корневых узлах. Корневые узлы — это первые узлы деревьев игры, которые являются прямыми потомками коллекции (т.е. не деревьев игры внутри других деревьев). Они определяют некоторые глобальные 'аттрибуты', такие как размер доски, вид игры, используемый формат фала и т.д.

игровая информация
Эти свойства дают информацию о сыгранной игре (например, кто, где, когда, что, результат, правила и т.д.). Они обычно хранятся в корневых узлах. При объединении набора игра в одно дерево игры, игровая информация сохраняется в узлах, где игра впервые становится отличима от остальных игр в дереве.

Узел содержащий игровую информацию называется игровым узлом. Может быть лишь один игровой узел на любом пути внутри дерева, т.е. если какое-то игровое свойство появляется в некотором узле, то не может быть больше никаких игровых свойств в следующих узлах:
a) на пути от корневого узла до данного.
b) в поддереве ниже данного узла.

- без типа
Эти свойства не имеют специальных типов и могут появляться в любом месте коллекции.

Из-за строгого разделения свойств хода и установки узлы также могут быть разделены на узлы хода и узлы установки. Это важно для баз данных, преобразования в/из формата ISHI и для некоторых особых приложений.

2.2.2. Атрибуты свойств


Пока существует лишь один атрибут свойств:

наследовать
Свойства имеющие этот атрибут влияют не только на содержащий их узел, а также на ВСЕ следующие узлы-потомки до тех пор, пока не встретятся новые настройки или настройки не будут очищены. То есть постанавливают одновременно всем потомкам (данного узла) наследовать значения свойства с атрибутом 'наследовать'. Например, VW ограничивает отображение не только для текущего узла, то также и всех узлов-потомков. Так VW в начале варианта имеет силу для всего дерева варианта. Наследование прекращается, если новое свойство встретится и его значения будут с этого момента наследоваться, или значение свойства будет очищено, обычно пустым значением, например VW[].

2.2.3. Как обращаться с неизвестными/ошибочными свойствами


  • Неизвестные свойства и их значения должны быть сохранены. Если приложение неспособно сохранять незнакомый свойства, то оно должно выдавать сообщение с предупреждением.
  • Неправильно оформленные игровые свойства должны быть по возможности исправлены, в противном случае — сохранены.
  • Другие неправильно оформленные свойства должны быть по возможности исправлены, в противном случае — удалены. Приложение должно отобразить сообщение с предупреждением, если оно удаляет неправильно оформленные свойства.

2.2.4. Собственные свойства


Приложения могут определять свои собственные частные свойства. Существуют некоторые ограничения.

Идентификатор свойства: собственные свойства не должны использовать идентификатор какого-нибудь стандартного свойства. Вы должны вместо этого использовать новый идентификатор. Следует составлять идентификатор из не более двух прописных букв. SGF не устанавливает для идентификаторов предел в две буквы, но некоторые приложения в противном случае могут нарушиться.

Значение свойства: собственные свойства могут использовать значения одного из определенных в этом документе типов или определить собственный тип. Когда используются собственные типы значений, приложение должно предохранять каждый "]" с помощью предшествующего "\". Иначе файл станет не разбираемым. Для типов значений, состоящих из комбинации двух простых типов, считается, что Ваше приложение использует Составной тип.



3. Типы значений свойств


  ЗаглБуква    = "A".."Z"
  Цифра        = "0".."9"
  Пусто        = ""

  Число        = [("+"|"-")] Цифра { Цифра }
  Действительный  = Число ["." Цифра { Цифра }]

  Парный       = ("1" | "2")
  Цвет         = ("B" | "W")

  ПростойТекст = { любые символы (см. ниже) }
  Текст        = { любые символы (см. ниже) }

  Точка        = специфично для каждой игры
  Ход          = специфично для каждой игры
  Камень       = специфично для каждой игры

  Составной    = ТипЗначения ":" ТипЗначения



3.1. Парный


Парные значения используются для свойств замечаний. Они называются Парными потому, что значение или простое, или усиленное. Значение '1' означает 'нормальный'; '2' означает, что оно усилено.
Пример:
GB[1] может быть отображено как: Хорошо для черных
GB[2] может быть отображено как: Очень хорошо для черных

3.2. Текст


Текст это форматированный текст. Невидимые символы, кроме разрывов строки, заменяются пробелами (например, табуляция, вертикальная табуляция, ...).

Форматирование:
Мягкие разрывы строк: разрывы строк с предшествующим "\" (мягкие разрывы строк преобразуются в "", т.е. они удаляются)
Жесткие разрывы строк: любые другие встречающиеся разрывы строк

Внимание: одиночный разрыв строки по разному представляется в различных операционных системах, например “LFCR” в DOS, “LF” в Unix. Приложение должно быть способно работать со следующими разрывами строк: LF, CR, LFCR, CRLF.

Приложения должны справляться с Текстом любого размера. Текст должен быть отображен обычным способом, хотя длинные строка могут быть перенесены, если они не помещаются на экран.

Предохранение: "\" это предохраняющий символ. Любой символ, следующий после "\", вставляется дословно (исключение: невидимые символы по-прежнему должны быть преобразованы в пробел!). Следующие символы должны быть предохранены, если используются в Тексте: "]", "\" и “:" (только если используется в составном типе данных).

3.2.1. Пример


C[Meijin NR: yeah, k4 is won\
derful
sweat NR: thank you! :\)
dada NR: yup. I like this move too. It's a move only to be expected from a pro. I really like it :)
jansteen 4d: Can anyone\
 explain [me\] k4?]

может быть отображено как:

Meijin NR: yeah, k4 is wonderful
sweat NR: thank you! :)
dada NR: yup. I like this move too. It's a move only to be expected
from a pro. I really like it :)
jansteen 4d: Can anyone explain [me] k4?


3.3. ПростойТекст


ПростойТекст — это обычная строка. Невидимые символы должны быть преобразованы в пробел, т.е. здесь нет переводов строк. Приложения должны быть способны справляться с ПростымТекстом любого размера.

Форматирование: Разрывы строк с предшествующим "\" преобразуются в "", т.е. они удаляются (также как для типа Текст). Любые другие разрывы строк преобразуются в пробел (никаких переводов строк на экране!).

Предохранение (так же как для типа Текст): Символ "\" является предохраняющим. Любой символ, следующий после "\", вставляется дословно (исключение: невидимые символы по-прежнему должны быть преобразованы в пробел!). Следующие символы должны быть предохранены, если используются в ПростомТексте: "]", "\" и “:" (только если используется в составном типе данных).

3.4. Камень


Этот тип используется для задания точки и фигуры, которая должна быть помещена в эту точку. Если игра не имеет различимого набора фигур как, например, Го (GM[1]), то тип Камень снижается до типа Точка (см. ниже), например «список камней» становится «списком точек» для данной игры.
Примечание: если свойство допускает «список камней», то понижение до «списка точек» допускает сжатые списки точек.
  • Го, Отелло, Гомоку, Рэндзю: Камни становятся Точками
  • Шахматы
  • Nine Men's Morris
  • Китайские шахматы
  • Сёги
  • Нарды, Lines of Action, Hex, Gess: Камни становятся Точками
  • Amazons
  • Octi

3.5. Ход / Точка


Эти два типа специфичны для каждой игры.

* Го
* Отелло
* Шахматы
* Гомоку, Рэндзю
* Nine Men's Morris
* Нарды
* Китайские шахматы
* Сёги
* Lines of Action
* Hex 
* Amazons
* Gess
* Octi

3.5.1. Сжатые списки точек


Значение типа «список точек» or «псписок точек» может быть сжато.
Сжатие осуществляется определением прямоугольника вместо перечисления каждой отдельной точки в прямоугольнике. Прямоугольники задаются с использованием своего левого верхнего и правого нижнего угла.

Определение:
Список точек: список из (точка | точка “:" точка)
Для составного типа первая точка задает левый верхний угол, вторая точка — правый нижний угол прямоугольника.
Прямоугольники 1x1 недопустимы — они должны быть перечислены как отдельные точка.

Определение 'списка точек' позволяет задавать отдельные точки [xy] и прямоугольники [ul:lr] в любом порядке и комбинации. Однако точки должны быть уникальны, т.е. пересечение и повторение запрещено.

Чтобы уловить идею взгляните на пример.


Комментарии

Оставляйте свои комментарии на странице SGF/Комментарии.


Скачать: SGF file format FF[4].zip (49K)

Автор: Arno Hollosi mailto:ahollosi@xmp.net
Опубликовано в соответствии Open Content License.

Перевод: Павел Стрибук.
Источник: http://www.red-bean.com/sgf/sgf4.html