Правила
Грамматики для Томита-парсера состоят из правил. У каждого правила есть левая и правая части, разделенных символом —>
. В левой части стоит один нетерминал (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 находится вектор граммем, который присваивается символу в левой части правила. | |
count | В поле пометы count записывается максимальное число терминалов, которое может включать в себя символ в левой части правила. Количество терминалов должно быть строго меньше указанного значения. | |
weight | В поле пометы weight записывается вес (число, со значением от 0 до 1), который присваивается символу в левой части правила. Подробнее использование весов правил описано в разделе Веса. | |
trim | Помета trim означает, что из выделенной цепочки выбрасываются все терминалы, которые не входят в факты, построенные в ходе интерпретации. | |
not_hreg_fact | Если у группы, построенной по правилу с ограничением not_hreg_fact , все слова, входящие в значения заполненных полей факта, находятся в верхнем регистре, то анализ такого дерева объявляется неуспешным. | |
Помета | Семантика | Пример использования |
---|---|---|
| В поле пометы outgram находится вектор граммем, который присваивается символу в левой части правила. | |
count | В поле пометы count записывается максимальное число терминалов, которое может включать в себя символ в левой части правила. Количество терминалов должно быть строго меньше указанного значения. | |
weight | В поле пометы weight записывается вес (число, со значением от 0 до 1), который присваивается символу в левой части правила. Подробнее использование весов правил описано в разделе Веса. | |
trim | Помета trim означает, что из выделенной цепочки выбрасываются все терминалы, которые не входят в факты, построенные в ходе интерпретации. | |
not_hreg_fact | Если у группы, построенной по правилу с ограничением not_hreg_fact , все слова, входящие в значения заполненных полей факта, находятся в верхнем регистре, то анализ такого дерева объявляется неуспешным. | |
Кавычки в правилах
Символы двойных и одинарных кавычек " "
и ' '
заключают строки в правой части правил. Слово в кавычках должно стоять в словарной форме. Если требуется ограничить слово косвенной формой, то можно использовать помету gram
.
Кроме того статьи с кириллическими названиями обязательно должны оформляться двойными кавычками " "
.
Пример
CatSlangWord —> "котэ";
CatSlangWord —> Word<kwtype="котэ">;