В феврале, как вы помните (если помните), я защитил диплом по компьютерной лингвистике. В процессе написания той программы для анализа языка было допущено множество разных неудачных и странных решений, но необходимый опыт я всё-таки получил. Тогда же примерно у меня возникла идея переписать всё это иначе, без привязки алгоритмов к русскому языку. Тогда такая система смогла бы анализировать и другие языки, а помимо естественных - и машинные.
В то же время основная работа шла на создание Цирцеи, и создание преобразователя началось только осенью. Это пошло ему на пользу: за это время я обдумал и отменил кучу идей, а основная концепция успела "выкристаллизоваться" и приобрести достаточно стройную форму (впрочем,в процессе написания самой проги, как обычно, кое-что пришлось менять в проекте на ходу).
Так вот, за пару месяцев мне удалось создать dll-ку, работающую с произвольными языками. Правила конкретного языка просто описываются в отдельном файле; внутренние же алгоритмы преобразования достаточно универсальны.
Теперь, к примеру, в файле описания русского языка достаточно описать что-то типа этого:
:= а|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|А|Б|В|Г|Д|Е|Ё|Ж|З|И|Й|К|Л|М|Н|О|П|Р|С|Т|У|Ф|Х|Ц|Ч|Ш|Щ|Ъ|Ы|Ь|Э|Ю|Я|''|'-|0|1|2|3|4|5|6|7|8|9
:= '-|'/|'+|'%|'*|'=|'^|',|'.|'?|'!|'…|':|';|'«|'»|'"|'„|'“|'(|')|'[|']|'{|'}|'<|'>|
:= (.&!)+
:= +
:= ||
[T=] => [T]
Это и есть описание того, как строятся лексемы (отдельные смысловые единицы) языка. В программе достаточно написать:
var language = Language.Load(@"Langs\Ru\Main.xml");
var tokenizer = new Tokenizer(language);
var text = "Каждый охотник желает знать, где сидит фазан.";
var tokens = tokenizer.Analyze(text);
И в итоге в tokens мы получим набор элементов "Каждый", "охотник", "желает", "знать", ",", "где", "сидит", "фазан", ".".
Таким образом, лексический анализатор был полностью переведён на новую технологию. С его помощью можно анализировать и преобразовывать произвольные тексты, осуществляя в них сколь угодно сложные локальные замены и поиск.
На этой же технологии будет построен новый конвертер вопросов СИ, извлекающий из текстового файла описания вопросов, ответов, тем и пр.
Впереди также обновление лексического синтезатора, а потом морфология и синтаксис.
Как это работает и как это можно будет использовать для своих задач, расскажу чуть позже :)
Вопросы, предложения - приветствуются!