В случае, когда координата соответствует морфологической категории, состояния этой координаты являются граммемами. К примеру для падежа граммемами являются именительный, родительный, местный и так далее.
Однако координаты грамматического словаря охватывают более широкий набор признаков слов. В качестве примера можно привести атрибуты написания слов, включая CharCasing для русского и английского языков, а также признак кандзи/кана/ромадзи для японских слов. Кроме того, координаты используются для классификации связей в тезаурусе.
Разберемся с деталями описания координат в текстовом файле. Основной формат такой:
enum имя_координаты { имя_сост1имя_сост2... }
Здесь 'enum' - ключевое слово, 'имя_координаты' - произвольная комбинация букв и цифр, начинающаяся с буквы (конечно, буквами признаются и элементы национальных алфавитов, а не только латинские символы), 'имя_сост1' и далее - имена состояний данной координаты. Перечень имен состояний обязательно заключается в фигурные скобки '{' и '}'. Если координата имеет только два состояния, например, переходность для глаголов, то можно использовать сокращенный формат:
enum имя_координаты
То есть список имен состояний не приводится. Фактически дело будет обстоять так, что такая бистабильная координата имеет состояния с условными именами 'true' и 'false', хотя в явном виде эти имена состояний не генерируются Транслятором и не должны употребляться в ПРИИСК-программе. Вместо явного использования имен состояний для бистабильных координат формат описания координатной пары изменяется таким образом:
имя_координаты эквивалентно имя_координаты:true
~имя_координаты эквивалентно имя_координаты:false
Если две координаты должны иметь лексически и позиционно одинаковый список имен состояний, то можно записать:
enum имя_координаты = имя_образца
При этом список состояний будет просто скопирован из уже загруженного описания координаты с именем 'имя_образца'. Такие координаты (с одинаковыми состояниями в одних и тех же позициях) позволяют реализовать особые формы сравнения (см. далее).
В некоторых случаях, рассматриваемых в главе #, необходимо кроме основного имени координаты иметь дополнительные имена-синонимы. Формат объявления координаты для этого случая:
enum осн_имя [ , доп_имя1 [ , доп_имя1 ] ] ... { ... }
Например:
enum Падеж, Падеж1 { именительный притяжательный }
Чтобы объявить бистабильную координату с синонимами, достаточно не указывать имена состояний в фигурных скобочках:
enum Переходность, Перех1 {}
Осталось ввести формат особой разновидности координат, которые мы назвали многоохватными.
Кроме шести падежей: именительного, родительного, творительного, дательного, винительного и предложного, в русской грамматике можно выделить несколько редких и/или исчезающих падежных форм. К примеру, так называемая звательная форма (вокатив): "Старче!", "Мам!" иногда считается особым звательным падежем; партитивный падеж: "дай чаю!", и некоторые другие (местный, отложительный, счетный) увеличивают падежную парадигму до 9 форм. Важно отметить, что либо эти падежные формы употребляются довольно редко, либо слова в этих формах неотличимы лексически от какой-либо из основных 6 форм: ср. именительный село и звательный село. Чтобы облегчить описание словарных статей (о чем речь пойдет здесь), реализован специальный прием.
Объявляем категорию падеж так:
enum падеж
{
{ им зват}
{ род парт счетн }
твор
вин
дат
{ предл отлож мест }
}
Близкие (лексически и синтаксически) состояния объединяются в подгруппы, причем первым идет имя основной падежной формы: { им зват }. Это означает, что вместо словоформы с координатной парой падеж:зват может использоваться словоформа с падеж:им.
Перечисления используются не только как координаты Лексического Пространства, но и как именованные множества имен (состояний), аналогично перечислениям языка C++. Например, связи в тезаурусе помечаются состояниями координаты с именем net.
Бывают ситуации, когда желательно только объявить имя перечисления, не специфицируя имен состояний. Язык ПРИИСК позволяет использовать ключевое слово extern:
extern enum Name
Транслятор запомнит имя нового перечисления и позволит указывать его до тех пор, пока не потребуется задать имя какого-либо состояния этой координаты. К этому моменту координата должна быть полностью описана, в противном случае compiler выдаст сообщение об ошибке. Объявления одной и той же координаты можно повторять без ограничения: повторное объявление не считается ошибкой. Таким образом, можно написать:
extern enum Name
:
extern enum Name
:
Определение же координаты может быть прочитано лишь единожды, причем до и после полного описания можно ставить произвольное количество объявлений координаты:
extern enum Name
:
enum Name { State1 State2 }
:
extern enum Name
:
Есть важное исключение: если определение координаты встречается повторно, и все состояния в новом определении не были объявлены таковыми в старом, то выполняется конкатенация двух определений: новые состояния добавляются в список состояний координаты. Это безусловно создает необходимые предпосылки проникновению труднообнаруживаемых ошибок в ПРИИСК-программу, но повышает гибкость языка: можно добавлять состояния к списку координаты помодульно. Например, два оператора:
enum Name { State1 State2 }
enum Name { State3 State4 }
полностью эквивалентны одной строке:
enum Name { State1 State2
State3 State4 }
По окончании трансляции словаря будет
выполнена проверка того, что все предварительно объявленные координаты полностью определены.
Объявленные в одном словаре координаты гарантированно имеют уникальные имена, так как компилятор словаря не допускает повторного объявления.
Но уникальность имен состояний гарантируется только в рамках одной координаты. Совпадение имен состояний у двух разных координат - вполне нормальное явление, например грамматические лицо в английском и русском языках
enum ЛИЦО { 1 2 3 }
enum PERSON { 1 2 3 }
Чтобы однозначно указать, какое состояние имеется в виду в описании какой-либо сущности словаря, необходимо использовать пару имя координаты + имя состояния, разделив их двоеточием:
ЛИЦО:1
PERSON:2
Такая конструкция используется очень часто и далее в документации называется координатной парой.
Координаты и их состояния хранятся в виде объектов класса
GramCoord (файл coordinate.h)
для координаты и GramCoordState (там же)
для состояния. Во всех операциях используется индекс координаты во внутреннем
списке грамматики (поле coord класса Grammar - см. grammar.h).
На уровне API грамматического словаря работа с координатами выполняется несколькими функциями, например получение количества состояний у координаты - функция sol_CountCoordStates. Кроме того, номера координат и их состояний, используемые в вызовах API и в возвращаемых результатах, объявлены как символические константы для C/C++/C#/Delphi.
Для SQL варианта словаря координаты и их состояния хранятся как записи в таблицах SG_COORD и SG_STATE соответственно.
Для реализации русской морфологии в грамматическом словаре объявлены следующие категории:
Падеж - именительный, вокатив, родительный, партитив, творительный, винительный, дательный, предложный, локатив.
Число - единственное, множественное
Род - женский, мужской, средний
Время - прошедшее, настоящее, будущее
Степень сравнения - положительная, сравнительная, превосходная
Лицо - первое, второе, третье
Наклонение - изъявительное, побудительное
Модальность
Внутренний язык грамматической машины
Грамматический Словарь Русского Языка
Грамматический род у существительных без форм единственного числа
© Козиев Илья 2019
![]() |
|
изменено 05-Feb-12 |