Сборник 2002

РАЗРАБОТКА ФОРМАЛИЗМА ДЛЯ ОПИСАНИЯ СЕГМЕНТНЫХ МОРФОЛОГИЧЕСКИХ ПРОЦЕССОВ В ГЕРМАНСКИХ ЯЗЫКАХ И ЕГО КОМПЬЮТЕРНАЯ РЕАЛИЗАЦИЯ

 

 

А. А. Перекрестенко

Российский Государственный Гуманитарный Университет

A.Perekrestenko@gmx.net

 

 

Ключевые слова: компьютерная морфология, морфологический анализ, морфологический синтез, германские языки, немецкий, шведский

 

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

 

 

1. Введение

 

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

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

Устройство, моделирующее СМП, можно описать как функцию f(s,a), получающую на вход некоторую сегментную последовательность s и задание по её изменению a и выдающую результат применения задания a к последовательности s. Разработанная автором библиотека GeInstr.lib содержит такую функцию, позволяющую работать со специально разработанными языками описания СМП, а также ряд вспомогательных функций, при помощи которых можно осуществлять парсинг записи задания. При разработке языка описания СМП и при создании библиотеки автор преследовал цель разработать формализм, который позволил бы просто и удобно описывать все СМП, имеющие место в письменных вариантах данных естественных языков, и создать эффективную функцию, моделирующую вышеупомянутые СМП, такую, чтобы её можно было использовать в других программах; стремление к эффективности компьютерной реализации нашло отражение, в частности, в выборе языка реализации – C++ (Borland C++ Builder версии 5).

 

 

2. Языки инструкций

 

Все СМП описываются при помощи т. н. языков инструкций, обозначаемых далее как языки GeInstrXX, где XX – сокращённое обозначение того естественного языка, для описания СМП которого данный язык инструкций предназначен. Предложение на GeInstrXX представляет собой последовательность т. н. инструкций – команд на моделирование СМП, выполняемых в том порядке, в котором они входят в данное предложение. Языки GeInstrXX являются подмножествами некоторого обобщённого языка – т. н. языка GeInstr, служащего своего рода шаблоном для всех GeInstrXX-языков.

Язык GeInstr, а также языки GeInstrDE и GeInstrSV, предназначенные для описания СМП, соответственно, немецкого и шведского языков, будут заданы ниже в расширенной нотации Бакуса-Наура при помощи достаточно простого языка регулярных выражений с использованием следующих обозначений (везде имеются ввиду символы в кодировке iso‑8859‑1, при обозначении кодов символов используется десятеричные числа): [#m‑#n] – любой символ с кодом от m до n; [C1‑C2] – любой символ с кодом большим или равным коду символа C1 и меньшим или равном коду символа C2; [C1C2…Cn] – любой из символов C1C2…Cn; 'C' – символ C; "C1C2…Cn" – последовательность символов C1C2…Cn. Вышеописанные объекты представляют собой предложения данного языка регулярных выражений. Если A и B – предложения этого языка, то предложениями будут также следующие конструкции: A B – последовательность A B (B следует за A); A | B – дизъюнкция A и B – либо A, либо B; A* – факультативное произвольное количество вхождений A; A+ – однократное или многократное вхождение A; A? – факультативное однократное вхождение A; A‑B – A, но не B; (A) – то же самое, что A (скобки используются стандартным образом для оформления приоритета). Приоритет операций выглядит следующим образом: наибольший приоритет – у скобок, далее следуют операции *, + и ?, далее – последовательность, самый низкий приоритет – у операций дизъюнкции и «минуса».

 

2.1. Язык GeInstr

 

Сначала введём некоторые вспомогательные объекты, из которых далее будут строится инструкции:

PChr ::= [#32‑#255]

любой печатный символ;

Sp ::= ',' | ';' | ' '

символ-разделитель инструкций;

Dig ::= ['0'‑'9']

любая цифра;

LLet ::= ['a'‑'z'] | [šœàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿß]

любая буква нижнего регистра;

Seg ::= '\' PChr | '\'? (LLet | Dig)

сегмент – любой печатный символ, которому обязательно предшествует обратная косая черта, если он не буква нижнего регистра и не цифра;

ULet ::= ['A'‑'Z'] | [ŠŒÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸ]

любая буква верхнего регистра;

NLet ::= '@' | …

литера – символ(ы) из ограниченного множества некоторых небуквенных символов, это множество может быть расширено за счёт небуквенных печатных символов, не задействованных в данной спецификации;

QLet ::= ULet | NLet

спецсимвол – буква верхнего регистра или литера;

Sign ::= '‑' | '+' | '*' | '~' | '^' | …

знак – символы из ограниченного множества некоторых небуквенных символов, это множество может быть расширено;

SegSeq ::= Seg+

непустая последовательность сегментов;

PrefSegSeq ::= SegSeq QLet? | QLet

префиксная последовательность сегментов;

SufSegSeq ::= QLet? SegSeq | QLet

суффиксная последовательность сегментов;

OperName ::= (Dig | ULet | LLet)+

имя оператора;

OperType ::= '#' | '?'

тип оператора.

Все введённые до этого момента объекты являются своего рода строительным материалом для построения собственно инструкций, описание которых следует далее.

Prefix ::= PrefSegSeq Sign

Префикс. Инструкция обозначает добавление префикса к исходной последовательности, при этом PrefSegSeq задаёт по определённым правилам сегментный состав префикса, а Sign – некоторую сопутствующую добавлению прификса стандартную модификацию исходной последовательности, ситуация Sign = '‑' означает, что таких модификаций нет.

Suffix ::= Sign SufSegSeq?

Суффикс. Инструкция обозначает добавление суффикса к исходной последовательности, при этом SufSegSeq? задаёт по определённым правилам сегментный состав суффикса, а Sign – некоторую сопутствующую добавлению суффикса стандартную модификацию исходной последовательности, ситуация Sign = '‑' означает, что таких модификаций нет.

Affix ::= Prefix | Suffix

Обобщённое определение аффикса.

Oper ::= '[' OperType OperName ']'

Операция. Инструкция обозначает стандартное для данного языка изменения сегментной последовательности, как, например, умлаут в немецком, при этом принимается соглашение, что если OperType = '#', то инструкция является обязательной в том смысле, что невозможность осуществить обозначаемое ей изменение исходной сегментной последовательности рассматривается как ошибка, в то время как аналогичная факультативная инструкция с OperType = '?' в этом случае будет проигнорирована.

PrefSubst ::= "[/" SegSeq? '|' PrefSegSeq? ']'

Префиксная подстановка. Инструкция обозначает замену некоторого начального фрагмента исходной последовательности, задаваемого как SegSeq?, на фрагмент PrefSegSeq?.

SufSubst ::= '[' SegSeq? '|' SufSegSeq? ']'

Суффиксная подстановка. Инструкция обозначает замену некоторого конечного фрагмента исходной последовательности, задаваемого как SegSeq?, на фрагмент SufSegSeq?.

Subst ::= PrefSubst | SufSubst

Обобщённое определение подстановки, неприменимость подстановки не должна приводить к ошибке, т. е. подстановка должна в этом смысле вести себя, как факультативная операция.

SyntMorph ::= '='

Фиктивная инструкция – не вызывает никаких изменений исходной сегментной последовательности и вводится для обозначения процессов, не сводимых к СМП, как, например, конверсии.

Instr ::= Affix | SyntMorph | Subst | Oper

Обобщённое определение инструкции.

GeInstr ::= Sp* ((Instr Sp*)* ‑ ((Instr Sp*)* Sufix Prefix (Instr Sp*)*))

Собственно «язык инструкций» – произвольная описывающая серию СМП последовательность инструкций, факультативно разделённых произвольными последовательностями символов-разделителей, кроме случаев непосредственного следования друг за другом инструкции типа суффикса и инструкции типа префикса, где как минимум один символ-разделитель обязателен.

Языки GeInstrXX отличается от языка GeInstr, среди прочего, ограниченным количеством операторов (так как количество стандартных чередований в естественных языках ограничено), а также наличием ограничений на порядок вхождения инструкций различных классов; такие ограничения вводятся, чтобы исключить различные контринтуитивные последовательности СМП, как, например, «сначала умлаут, потом аблаут» и т. п.

 

2.2. Язык GeInstrDE

 

Язык GeInstrDE отличается от языка GeInstr отсутствием объектов GeInstr и NLet, а также наличием / другим определением следующих объектов:

QLet ::= ULet

Sign ::= '‑' | '+' | '*'

OperName1 ::= "Ablaut1" | "Ablaut1Sy" | "Ablaut1Sp" | "Ablaut2" | "Ablaut2Ex" | "Ablaut2Sp" | "Ie" | "IeSy" | "IeSp" | "Nh" | "Ea" | "Sp" | "Ablaut1" | "Ablaut1Sy" | "Ablaut1Sp" | "Ablaut2" | "Ablaut2Ex" | "Ablaut2Sp" | "Ie" | "IeSy" | "IeSp" | "Nh" | "Ea" | "Sp"

Oper1 ::= '[' OperType OperName1 ']'

OperName2 ::= "Umlaut" | "ReUmlaut" | "CutE" | "CutELMNR" | "DoubleC" | "DeDoubleC"

Oper2 ::= '[' OperType OperName2 ']'

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

Oper ::= Oper1 | Oper2

GeInstrDE ::= Sp* (Oper1 Sp*)? (((Affix | SyntMorph | Subst | Oper2) Sp*)* - (((Affix | SyntMorph | Subst | Oper2) Sp*)* Suffix Prefix ((Affix | SyntMorph | Subst | Oper2) Sp*)*))

Опишем далее кратко СМП, моделируемые инструкциями классов Oper, Affix и Subst языка GeInstrDE. Здесь сразу же следует обратить внимание на то, что исходные сегментные последовательности, над которыми действуют описываемые инструкциями СМП, в общем случае записываются буквами нижнего регистра. То же самое касается и результата действия инструкций. Инструкции класса Oper языка GeInstrDE приведены в таблице 1.

 

Таблица 1. Инструкции класса Oper для немецкого языка и описываемые ими СМП.

 

Инструкция

Описание СМП

Пример

[#Ablaut1]
[?Ablaut1]

Первая ступень аблаута

Форма претерита сильных глаголов образуется в результате действия СМП [#Ablaut1] на корневой морф глагола.

[#Ablaut1Sy]
[?Ablaut1Sy]

Дополнительная первая ступень аблаута корня сильного глагола dreschen, образующего претерит через аблаут двумя разными способами

Синонимичная форма претеритаdrosch сильного глагола dreschen(существующая наряду с формойdrasch) образуется в результате действия СМП [#Ablaut1Sy] на корневой морф «dresch».

[#Ablaut1Sp]
[?Ablaut1Sp]

Видоизменённая первая ступень аблаута корня сильного глагола schreiben в отглагольных существительных, содержащих компонент «schrift»

Субстантивный компонент «schrift» образуется в результате действия СМП [#Ablaut1Sp]‑t на корень «schreib» глагола schreiben.

[#Ablaut2]
[?Ablaut2]

Вторая ступень аблаута

Форма второго причастия сильных глаголов образуется в результате действия СМП [#Ablaut2]ge‑‑en на корневой морф глагола.

[#Ablaut2Ex]
[?Ablaut2Ex]

Дополнительная вторая ступень аблаута. Через неё образуются отглагольные существительные от ряда сильных глагольных корней.

Субстантивный компонент «wurf» образуется в результате действия СМП [#Ablaut2Ex] на корень «werf» глагола werfen.

[#Ie]
[?Ie]

Сужение (перегласовка e ® i) – СМП, сопутствующий, в частности, образованию формы 3 л. ед. ч. ряда сильных глаголов и добавлению префикса «ge» к некоторым субстантивным корням

Форма 3 л. ед. ч. trifft сильного глагола treffen может быть описана, как образованная в результате действия СМП [#Ie]‑t на корень «treff».

[#IeSy]
[?IeSy]

Дополнительная суженная форма корня сильного глагола geben в словах, содержащих компонент «gieb»

Прилагательное nachgiebig может быть описано, как образованное в результате действия СМП[#IeSy]nach‑‑ig на корень «geb» глагола nachgeben.

[#IeSp]
[?IeSp]

Видоизменённая суженная форма корней «geb», «scheh» и «seh» сильных глаголовgeben, schehen и sehen. Вводится для описания преобразований geb ® gif,scheh ® schich и seh ® sich.

Субстантивный компонент «sicht» может быть описан, как образованный в результате действие СМП [#IeSp]‑t на корень «seh» глагола sehen.

[#Nh]
[?Nh]

Чередование ng/nk ® ch. Вводится для описания преобразований bring ® brach,denk ® dach и dünk ® deuch корней «bring», «denk» и «dünk» глаголовbringen, denken и dünken.

Форма претерита brachte глаголаbringen образуется в результате действия СМП [#Nh]‑te на глагольный корень «bring».

[#Ea]
[?Ea]

Квази-реумлаут (чередование e ® a). Вводится для описания преобразованийbrenn ® brann, kenn ® kann,nenn ® nann и wend ® wand корней «brenn», «kenn», «nenn»и «wend» глаголов brennen, kennen, nennen иwenden.

Форма претерита kannte глаголаkennen образуется в результате действия СМП [#Ea]‑te на глагольный корень «kenn».

[#Sp]
[?Sp]

Чередование g ® ch. Вводится для описания преобразованийschlag ® schlach и trag ® trach корней «schlag» и «trag» глаголов schlagen иtragen.

Субстантивный компонент «schlacht» можно рассматривать как полученный из глагольного корня «schlag» при помощи СМП [#Sp]‑t.

[#Umlaut]
[?Umlaut]

i‑Умлаут

Форма 3 л. ед. ч. läuft глагола laufenможет быть описана, как образованная в результате действия СМП [#Umlaut]‑t на глагольный корень «lauf».

[#ReUmlaut]
[?ReUmlaut]

i‑Реумлаут

Отглагольный субстантивный компонент «betrug» можно рассматривать как результат действия СМП [#ReUmlaut]be‑ на корень «trüg» глагола betrügen.

[#CutE]
[?CutE]

Усечение финального e

Компонент «farb» композита farbstoffобразован в результате действия СМП [#CutE] над субстантивным корнем «farbe».

[#CutELMNR]
[?CutELMNR]

Усечение e перед финальными l, m, n и r

Прилагательное wacklig образовано от корня «wackel» глагола wackeln в результате действия СМП[#CutELMNR]‑ig.

[#DoubleC]
[?DoubleC]

Удвоение некоторых «консонантных» графем в финали. Этот СМП вводится, в частности, для описания орфографического преобразованияß ® ss.

Преобразования типа bloß ® bloss, актуальные при переводе написанного с использованием «стандартной» немецкой орфографической нормы в норму без символа ß.

[#DeDoubleC]
[?DeDoubleC]

Снятие удвоения некоторых двойных «консонантных» графем в финали. Этот СМП вводится, в частности, для описания орфографического преобразования ss ® ß.

Пример к предыдущей инструкции «с точностью до наоборот»

 

СМП, описываемые операционными инструкциями класса Oper1, должны применяться только к сегментным последовательностям, представляющим корневой морф. Так, попытка породить форму претерита 1/3 л. мн. ч. глагола verlaufen, применяя СМП [#Ablaut1]‑en к последовательности verlaufen, приведёт к ошибке, так как система не сможет проинтерпретировать эту последовательность символов как аблаутный корень. (СМП [?Ablaut1]‑en породит в этом случае последовательность «verlaufenen», что тоже не то, что нужно.) Указанный СМП должен применяться к корню «lauf», а то, как потом будет добавляться префикс ver‑ зависит от устройства системы, в которой эта функция применяется. Подробное описание действия всех операций имеется у автора.

Используется два типа аффиксации – простая и расширенная, сводимая к действию некоторых операций и простой аффиксации.

Под простой аффиксацией понимается такое добавление аффикса, при котором не происходит никаких дополнительных модификаций исходной сегментной последовательности. Простые аффиксы записываются как аффиксы со знаком «минус». Инструкция «простой суффикс» a0a1an моделирует добавление к исходной последовательности справа последовательности a0a1an, при этом если a0 – буква верхнего регистра, то она опускается в случае, если в финали исходной последовательности находится аналогичная буква нижнего регистра, и добавляется после перевода в нижний регистр во всех остальных случаях, символы обратной косой черты в a0a1an, используемые как служебные, не добавляются; так, например, инструкции ‑En и ‑E\n моделируют добавление суффикса ‑en к исходной последовательности, при этом буква e опускается, если исходная последовательность кончается на e, и добавляется после перевода в нижний регистр в противном случае: применение одной из этих инструкций к последовательностям fahrt и reise даст, соответственно, последовательности fahrten и reisen. Инструкция «простой нулевой суффикс» - (знак «минус») моделирует добавление нулевого суффикса.

Инструкция «простой префикс» anan‑1a0 моделирует добавление к исходной последовательности слева последовательности anan‑1a0, при этом если a0 – буква верхнего регистра, то она опускается в случае, если в инициали исходной последовательности находится аналогичная буква нижнего регистра, и добавляется после перевода в нижний регистр во всех остальных случаях, символы обратной косой черты в anan‑1a0, используемые как служебные, не добавляются.

Под расширенной аффиксацией понимается добавление аффикса, такое, что оно параллельно вызывает изменения исходной последовательности, которые могут быть описаны через операции (в данной версии языка GeInstrDE – через факультативные операции, т. е. операции с OperType='?'). В остальном, расширенная аффиксация ни чем не отличается от обычной. Расширение аффиксации задаётся путём замены знака «минус» аффикса на другой знак из допустимого множества. Описание расширенных аффиксов языка GeInstrDE приводится в таблице 2.

 

Таблица 2. Расширенные аффиксы языка GeInstrDE.

 

Запись с расширенным аффиксом

Равносильная запись с простым аффиксом

+a0a1an

[?Umlaut]‑a0a1an

+

[?Umlaut]-

*a0a1an

[?Ie]‑a0a1an

*

[?Ie]‑

anan‑1a0+

[?Umlaut]anan‑1a0

anan‑1a0*

[?Ie]anan‑1a0

 

Подстановки позволяют моделировать различные уникальные СМП. В языке GeInstrDE реализованы следующие типы подстановок: суффиксная подстановка [b1b2bm|a0a1an], которая удаляет расположенный в начале исходной сегментной последовательности фрагмент, идентичный последовательности b1b2bm с удалёнными служебными символами обратной косой черты (если таковые есть) и добавляет справа к оставшейся последовательности последовательность a0a1an по правилам, предусмотренным для простой суффиксации, и префиксная подстановка [/b1b2bm|anan‑1a0], которая удаляет расположенный в конце исходной сегментной последовательности фрагмент, идентичный последовательности b1b2bm с удалёнными служебными символами обратной косой черты (если таковые есть) и добавляет слева к оставшейся последовательности последовательность anan‑1a0 по правилам, предусмотренным для простой префиксации. Действие подстановок можно проиллюстрировать следующим примером: слово Sascha может быть получено из слова Alexander посредством серии [nder|scha][/\Alex|\S].

 

2.3. Язык GeInstrSV

 

Язык GeInstrSV будет здесь описан лишь обзорно, без описания операций. Подробное описание этого языка, включая описание всех операций, имеется у автора.

GeInstrSV отличается от GeInstr отсутствием объектов GeInstr и Sign а также наличием либо другим определением следующих объектов:

PrefSign ::= '-'

Prefix ::= PrefSegSeq PrefSign

SufSign ::= '-' | '+' | '*' | '~' | '^'

Suffix ::= SufSign SufSegSeq?

OperName1 ::= "Ablaut1" | "Ablaut2" | "Ablaut2Ex"

Oper1 ::= '[' OperType OperName1 ']'

OperName2 ::= "Ea"

Oper2 ::= '[' OperType OperName2 ']'

OperName2a ::= "Ko"

Oper2a ::= '[' OperType OperName2a ']'

OperName3 ::= "Umlaut"

Oper3 ::= '[' OperType OperName3 ']'

OperName3a ::= "Ji"

Oper3a ::= '[' OperType OperName3a ']'

OperName4 ::= "CutE" | "CutA" | "CutEA" | "CutELNR"  | "CutALNR" | "CutOLNR" | "CutMN" | "RestoreELNR"  | "RestoreALNR" | "RestoreOLNR" | "RestoreMN" | "DoubleC" | "DeDoubleC"

Oper4 ::= '[' OperType OperName4 ']'

Oper ::= Oper1 | Oper2 | Oper2a | Oper3 | Oper3a | Oper4

GeInstrSV ::= Sp* (Oper1 | Oper2 | Oper3 | (Oper2a (Sp* Oper1)?) | (Oper3a (Sp* Oper1)?) | (Oper3a (Sp* (Oper2 | (Oper2a (Sp* Oper1)?)))?) Sp*)? (((Affix | SyntMorph | Subst | Oper4) Sp*)* - (((Affix | SyntMorph | Subst | Oper4) Sp*)* Sufix Prefix ((Affix | SyntMorph | Subst | Oper4) Sp*)*))

Операции языка GeInstrSV, естественно, отличается от операций GeInstrDE (поскольку речь идёт о моделировании СМП разных естественных языков). Подробно операции здесь освещаться не будут из соображений экономии места.

Простые аффиксы и подстановки в языке GeInstrSV поддерживают все те же способы применения, что и аналогичные объекты языка GeInstrDE, и, кроме этого, допускают знак (литеру) @ на месте символа, обозначаемого в описании этих объектов в языке GeInstrDE как a0. Эта литера ведёт себя также, как буква верхнего регистра E на этом же месте, за тем лишь исключением, что она опускается не только при наличие символа e в соответствующем контактном контексте сегментной последовательности, к которой применяется данная инструкция, но также и при наличии там символа a. Во всех остальных случаях она реализуется как символ e; так, например, инструкция ‑@n моделирует присоединение суффигрированного определённого артикля, который реализуется как en, если присоединяется к существительным, оканчивающимся на согласный, и как n, если присоединяется к существительным, оканчивающимся на a или e: bil ® bilen, flicka ® flickan, pojke ® pojken. В языке GeInstrSV различается допустимый набор знаков при суффиксах и префиксах. Расширенная префиксация здесь не вводится. Описание расширенных суффиксов языка GeInstrSV приводится в таблице 3.

 

Таблица 3. Расширенные суффиксы языка GeInstrSV.

 

Запись с расширенным суффиксом

Равносильная запись с простым суффиксом

+a0a1an

[?Umlaut]‑a0a1an

+

[?Umlaut]-

*a0a1an

[?CutEA]‑a0a1an

*

[?CutEA]‑

~a0a1an

[?CutELNR]‑a0a1an

~

[?CutELNR]‑

^a0a1an

[?CutA][?CutMN]‑a0a1an

^

[?CutA][?CutMN]‑

 

 

3. Техническое описание библиотеки GeInstr.lib

 

Библиотека GeInstr.lib была реализована на языке программирования Borland C++ Builder версии 5 и откомпилирована для использования в программах, работающих на процессорах i486 и выше. В ней имеются следующие функции, работающие с языками GeInstrDE и GeInstrSV: функция моделирования СМП, описанного на данном GeInstrXX, функция проверки корректности записи на GeInstrXX без моделирования СМП и функция для подробного парсинга инструкций. Помимо этого, в библиотеке имеются модули генерации отчёта о применении инструкций и анализа ошибок в записи на GeInstrXX. Подробную техническую документацию по данной библиотеке можно получить у автора.

Стремление к эффективности функций библиотеки нашло отражение, в частности, в следующих моментах.

  • Из предопределённых типов данных C++ в библиотеке используются только стандартные, все остальные определялись автором самостоятельно (т.е. никакие предопределённые сложные типы данных, как, например, AnsiString и т.п. при написании библиотеки не использовались).
  • В библиотеке нигде, кроме модуля анализа ошибок в записи задания, который подключается только в случае обнаружения таких ошибок, и отключаемого по желанию пользователя модуля генерации отчёта о реализации задания на моделирование СМП, не используются явным образом функции и переменные стандартных библиотек C++. (В двух вышеуказанных модулях использовано исключениеstd::bad_alloc, описанное в стандартном файле заголовков new.h).
  • Библиотека позволяет работать с исходными данными практически произвольной длины, это касается как исходных сегментных последовательностей, так и записей заданий на реализацию СМП.
  • Ни в одной из используемых внутри библиотеки функций не применяется динамическое выделение памяти и, как следствие, нигде не используется копирование промежуточных строковых результатов из буфера в буфер. (Динамическое выделение памяти при помощи оператора new производится только в двух вышеуказанных вспомогательных модулях.)
  • Все процедуры реализованы так, что они могут осуществлять изменения как в самой подаваемой на вход последовательности сегментов, если в качестве ссылки на строку-результат процедуре передаётся NULL, так и копировать изменённую последовательность по другому адресу, если он не NULL, оставляя исходную последовательность без изменения.

 

 

 

A formalism for the description of the segmental morphological processes in the germanic languages and its software implementation

A. A. Perekrestenko

 

 

Key words: computational morphology, morphological analysis, morphological synthesis, Germanic languages, German, Swedish

 

 

As a part of the work to develop a morphological analysis system for German and Swedish the author has suggested a simple formalism for describing segmental morphological processes and graphematic alternations occurring in the written Germanic languages, and implemented subsets of this formalism for German and Swedish as a static-link C++ library. The core of the library is a function that makes it possible to model all the morphological processes involved in the creation of words with a certain root morph and to check the applicability of processes or sequences of processes on different classes of morphs.