Модуль реализован в виде динамической библиотеки Win32, содержит словари в виде ресурсов и экспортирует функции в C-стиле (то есть для их вызова требуется декларация extern “C”).
Модуль работает с ASCIIZ-строками, то есть строками, где один символ кодируется одним байтом, а нулевой символ обозначает конец строки, и подразумевает, что строки на вход ему подаются в кодировке 1251 (Windows Cyrillic).
Словарь модуля объемом около 120000 слов при генерации разбивается на страницы размером менее 64К, что позволяет оптимально организовать работу с памятью и использовать короткое слово (16 бит) для адресации внутри страницы с другой. Алгоритм модуля предельно прост и представляет собой интерпретатор таблиц переходов конечного автомата, в то время как страницы словаря являются этими самыми таблицами.
Благодаря этим решениям словарь модуля не превышает размером один мегабайт, устойчиво работает при объеме доступной памяти около 200К, а при наличии свободного мегабайта оперативной памяти загружает все страницы и выходит на максимальную производительность не менее (а реально более) 10000 слов в секунду (в режиме проверки правописания, процессор Pentium 100). Производительность модуля в режиме лемматизации (построения текстов нормальных форм слова) несколько ниже, так как приходится просматривать весь словарь, и составляет не менее 2000 слов в секунду (в тех же условиях).
| wInfo & 0x3F | Мнемоника | Часть речи украинская |
|---|---|---|
| ' . $pspkey . ' | ' . $psparr[0] . ' | ' . $psparr[1] . ' |
Ниже приведены мнемоники из файла прототипов со значениями и толкованиями каждого из них:
| Признак | Значение | Толкование | Встречается у | ' . $grinfo[0] . ' | 0x' . sprintf( "%04X", $grinfo[1] ) . ' | ' . $grinfo[2] . ' | ' . $grinfo[3] . ' | ' . "\n"; ?>
|---|
| Признак | Значение | Толкование |
|---|---|---|
| afAnimated | 0x01 | Данная форма прилагательного или причастия согласуется только с одушевленными существительными |
| afNotAlive | 0x02 | Данная форма прилагательного или причастия согласуется только с неодушевленными существительными |
| afHardForm | 0x04 | Затрудненная форма, отождествление которой возможно лишь в режиме распознавания затрудненных форм слов |
| Часть речи | FID | Толкование | ||||
|---|---|---|---|---|---|---|
| существительное | 0 | ед. | именительный падеж | |||
| 1 | родительный падеж | |||||
| 2 | дательный падеж | |||||
| 3 | винительный падеж | |||||
| 5 | творительный падеж | |||||
| 6 | предложный падеж | |||||
| 7 | звательный падеж | |||||
| 10 | мн. | именительный падеж | ||||
| 11 | родительный падеж | |||||
| 12 | дательный падеж | |||||
| 13 | винительный падеж | |||||
| 15 | творительный падеж | |||||
| 16 | предложный падеж | |||||
| 17 | звательный падеж | |||||
| прилагательное | 0 | муж. | именительный падеж | |||
| 1 | родительный падеж | |||||
| 2 | дательный падеж | |||||
| 3 | винительный падеж, неодушевлённый | |||||
| 4 | винительный падеж, одушевлённый | |||||
| 5 | творительный падеж | |||||
| 6 | предложный падеж | |||||
| 8-13 | жен. | см. мужской род, формы 0 - 6 | ||||
| 16-22 | ср. | |||||
| 24-30 | мн. | |||||
| глагол | 0 | инфинитив | регулярная форма | |||
| 1 | возвратная форма | |||||
| 2 | повелительное | невозвратный | ед. | |||
| 3 | мн. | |||||
| 4 | возвратный | ед. | ||||
| 5 | мн. | |||||
| 6 | буд. | 1-е лицо | невозвратная | ед. | ||
| 7 | мн. | |||||
| 8 | возвратная | ед. | ||||
| 9 | мн. | |||||
| 10 | 2-е лицо | невозвратная | ед. | |||
| 11 | мн. | |||||
| 12 | возвратная | ед. | ||||
| 13 | мн. | |||||
| 14 | 3-е лицо | невозвратная | ед. | |||
| 15 | мн. | |||||
| 16 | возвратная | ед. | ||||
| 17 | мн. | |||||
| 18 | наст. | 1-е лицо | невозвратная | ед. | ||
| 19 | мн. | |||||
| 20 | возвратная | ед. | ||||
| 21 | мн. | |||||
| 22 | 2-е лицо | невозвратная | ед. | |||
| 23 | мн. | |||||
| 24 | возвратная | ед. | ||||
| 25 | мн. | |||||
| 26 | 3-е лицо | невозвратная | ед. | |||
| 27 | мн. | |||||
| 28 | возвратная | ед. | ||||
| 29 | мн. | |||||
| 30-61 | причастие | действительное | невозвратное | словоизменение по схеме прилагательного | ||
| 62-93 | возвратное | |||||
| 94-125 | страдательное | |||||
| 126 | деепричастие | невозвратное | ||||
| 127 | возвратное | |||||
| 128 | прош. | невозвратные | муж. | |||
| 129 | жен. | |||||
| 130 | ср. | |||||
| 131 | мн. | |||||
| 132 | возвратные | муж. | ||||
| 133 | жен. | |||||
| 134 | ср. | |||||
| 135 | мн. | |||||
| 136-167 | причастие | действительное | невозвратное | словоизменение по схеме прилагательного | ||
| 168-199 | возвратное | |||||
| 200-231 | страдательное | |||||
| 232 | деепричастие | невозвратное | ||||
| 233 | возвратное | |||||
| Код ошибки | Значение | Толкование |
|---|---|---|
LEMMBUFF_FAILED | -1 | При лемматизации переполнился массив нормальных форм |
LIDSBUFF_FAILED | -2 | При лемматизации переполнился массив идентификаторов лексем |
GRAMBUFF_FAILED | -3 | При лемматизации переполнился массив грамматических описаний |
WORDBUFF_FAILED | -4 | Слишком длинное исходное слово |
PAGELOAD_FAILED | -5 | Не удалась загрузка страницы словаря |
PAGELOCK_FAILED | -6 |
| Настройка | Значение | Толкование |
|---|---|---|
sfStopAfterFirst | 0x0001 | Достаточно одного отождествления |
sfIgnoreCapitals | 0x0002 | Игнорировать корректность капитализации |
sfHardForms | 0x0004 | Разрешать затрудненные словоформы |
Аргументы: 'ASCIIZ-строка, украинское слово, правописание которого следует проверить;', 'options' => 'настройки морфологического анализатора.' ) ); ?>
Функция возвращает 0, если слово не опознано, 1 – если слово написано правильно или отрицательный код ошибки.
'ASCIIZ-строка, слово, которое следует проанализировать;', 'options' => 'настройки морфологического анализатора;', 'lpLemm' => 'указатель на массив, принимающий нормальные формы слов, или NULL, если тексты нормальных форм не требуются;', 'lpLIDs' => 'указатель на массив, принимающий идентификаторы лексем, или NULL, если идентификаторы лексем не требуются;', 'lpGram' => 'указатель на массив, принимающий грамматические описания, или NULL, если они не требуются;', 'ccLemm' => 'размерность массива lpLemm в байтах;', 'cdwLID' => 'размерность массива lpLIDs в двойных словах;', 'cbGram' => 'размерность массива lpGram в байтах.' ) ); ?>
Тексты нормальных форм восстанавливаются в минимально допустимой степени капитализации, то есть если слово может быть написано всеми строчными буквами, оно восстанавливается всеми строчными, если только с заглавной буквы - то с заглавной, и т. д.
Грамматические описания восстанавливаются в “плавающем” формате. После отождествления массив psGInfo содержит количество блоков грамматических описаний, равное количеству нормальных форм. При этом каждый блок грамматического описания в начале содержит байт, указывающий количество структур SGramInfo, лежащих сразу после него.
Аргументы: 'ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы;', 'dwLexId' => 'идентификатор лексемы слова или 0, если построение формы идет по ключу – строке;', 'options' => 'настройки морфологического анализатора;', 'idForm' => 'идентификатор требуемой формы слова;', 'lpDest' => 'указатель на массив, принимающий построенные формы;', 'ccDest' => 'размерность массива lpDest в байтах.' ) ); ?>
Аргументы: 'ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы;', 'dwLexId' => 'идентификатор лексемы слова или 0, если построение формы идет по ключу – строке;', 'options' => 'настройки морфологического анализатора;', 'grInfo' => 'расширенное грамматическое описание требуемой формы слова;', 'bflags' => 'дополнительные грамматические флажки;', 'lpDest' => 'указатель на массив, принимающий построенные формы;', 'ccDest' => 'размерность массива lpDest в байтах.' ) ); ?>
Аргументы:
'адрес функции обработки лексемы;', 'lpv' => 'пользовательский параметр, передаваемый функции enumproc.' ) ); ?>
Прототип callback-функции перебора лексем:
Аргументы:
'идентификатор лексемы;', 'lpv' => 'параметр, переданный пользователем функции mlmaukEnumWords.' ) ); ?>
Аргументы:
'идентификатор лексемы слова;', 'wdinfo' => 'указатель на байт, получающий часть речи.' ) ); ?>| ' . sprintf( '%02X', $i ) . ''; ?> | ' . sprintf( '%02X', $i * 0x10 ) . ' | '; for ( $j = 0; $j < 16; ++$j ) echo (strstr( $uchars, chr($i * 16 + $j) ) ? '' . chr($i * 16 + $j) : ' | ') . ' | '; echo '' . "\n"; } ?>
|---|