Правила

Грамматики для Томита-парсера состоят из правил. У каждого правила есть левая и правая части, разделенных символом —>. В левой части стоит один нетерминал (S в примере, приведенном ниже). В правой части стоит список терминалов или нетерминалов (S1 ... Sn), после которого указываются условия (Q), применяемые ко всему правилу в целом. Условия могут отсутствовать. Правило заканчивается точкой с запятой (;).

Общий вид правила в грамматике

S —> S1 ... Sn { Q };

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

Если во входном тексте находится цепочка, которая соответствует правой части, то правило «срабатывает» и грамматика использует эту цепочку как значение символа LeftPart.

MoscowWord —> "москва"<h—reg1>;
MoscowGroup —> Adj<gnc—agr[1]>* MoscowWord<rt,gnc—agr[1]>;

Возьмется текст «Красная Москва»;

Символы S i в правой части правила разделяются пробелами или оператором «или» |, а также могут сопровождаться унарными операторами *, + и ().

Операторы

Оператор |

Оператор | используется для сокращенной записи правил с одинаковой левой частью. У пробела приоритет выше, чем у |. Следующий пример иллюстрирует применение оператора |.

Пример без оператора |

NP —> Noun;                              // правило 1: именная группа может состоять
                                         //            из одного существительного
NP —> Adj<gnc—agr[1]> Noun<gnc—agr[1]>;  // правило 2: именная группа может включать
                                         //            согласованные прилагательное и существительное
NP —> Noun Noun<gram="рд">;              // правило 3: именная группа может состоять из двух
                                         //            существительных, при этом второе стоит в родительном падеже

Пример с оператором |

NP —> Noun | Adj<gnc—agr[1]> Noun<gnc—agr[1]> | Noun Noun<gram="рд">;

Оператор *

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

NounGroup —> Noun Noun<gram="gen">*;
//Препроцессор парсера преобразует это правило так:
ARTIFICIAL_Noun —> Noun<gram="gen">;
ARTIFICIAL_Noun —> ARTIFICIAL_Noun  Noun<gram="gen">
NounGroup —> Noun ARTIFICIAL_Noun<gram="gen">;
NounGroup —> Noun;

Оператор * позволяет определить согласование между копиями (не)терминала. Согласование записывается после оператора * в квадратных скобках [].

NounGroup —> Noun Noun<gram="gen">*[gn—agr];

Оператор +

Оператор + после (не)терминала означает что символ повторяется один или больше раз. Оператор + также позволяет определить согласование между копиями (не)терминала.

Пример

Adjectives —> Adj+[gnc—agr];

Это правило аналогично следующему:

Adjectives —> Adj<gnc—agr[1]> Adj<gnc—agr[1]>+;

Символы в правой части правила

Символы Si в правой части состоит из трех частей: N <P1,…,Pn> interp (I1;…;In), где N — имя терминала или нетерминала, Piпометы-ограничения на свойства терминала/нетерминала N, Ii — имя поля и факта, куда при интерпретации записывается цепочка слов, подходящая под нетерминал N. Обязательным является только имя терминала/нетерминала N. Названия нетерминалов могут состоять из латинских букв, цифр и знака подчеркивания _, должны начинаться с буквы и не могут совпадать с зарезервированными именами терминалов.

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

См. Пометы—ограничения при терминалах и нетерминалах

Операции над правилами

Помета Семантика Пример использования

outgram

В поле пометы outgram находится вектор граммем, который присваивается символу в левой части правила.
ForeignWord —> Word<lat>
               {outgram = 'nom,acc,gen,loc,dat,ins'};
count В поле пометы count записывается максимальное число терминалов, которое может включать в себя символ в левой части правила. Количество терминалов должно быть строго меньше указанного значения.
S —> NP {count = 10};
weight В поле пометы weight записывается вес (число, со значением от 0 до 1), который присваивается символу в левой части правила. Подробнее использование весов правил описано в разделе Веса.
NP —> Adj Noun {weight = 0.7};
trim Помета trim означает, что из выделенной цепочки выбрасываются все терминалы, которые не входят в факты, построенные в ходе интерпретации.
S —> NP {trim};
not_hreg_fact Если у группы, построенной по правилу с ограничением not_hreg_fact, все слова, входящие в значения заполненных полей факта, находятся в верхнем регистре, то анализ такого дерева объявляется неуспешным.
S —> NP {trim, not_hreg_fact};
Помета Семантика Пример использования

outgram

В поле пометы outgram находится вектор граммем, который присваивается символу в левой части правила.
ForeignWord —> Word<lat>
               {outgram = 'nom,acc,gen,loc,dat,ins'};
count В поле пометы count записывается максимальное число терминалов, которое может включать в себя символ в левой части правила. Количество терминалов должно быть строго меньше указанного значения.
S —> NP {count = 10};
weight В поле пометы weight записывается вес (число, со значением от 0 до 1), который присваивается символу в левой части правила. Подробнее использование весов правил описано в разделе Веса.
NP —> Adj Noun {weight = 0.7};
trim Помета trim означает, что из выделенной цепочки выбрасываются все терминалы, которые не входят в факты, построенные в ходе интерпретации.
S —> NP {trim};
not_hreg_fact Если у группы, построенной по правилу с ограничением not_hreg_fact, все слова, входящие в значения заполненных полей факта, находятся в верхнем регистре, то анализ такого дерева объявляется неуспешным.
S —> NP {trim, not_hreg_fact};

Кавычки в правилах

Символы двойных и одинарных кавычек " " и ' ' заключают строки в правой части правил. Слово в кавычках должно стоять в словарной форме. Если требуется ограничить слово косвенной формой, то можно использовать помету gram.

Кроме того статьи с кириллическими названиями обязательно должны оформляться двойными кавычками " ".

Пример

CatSlangWord —> "котэ";
CatSlangWord —> Word<kwtype="котэ">;