Информация устарела!
Словарь больше не является плагином, и работает как обязательная составная часть платформы.
В остальном всё более-менее соответствует текущему положению.
ТОМ2 - платформа для парсерных игр |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » ТОМ2 - платформа для парсерных игр » ТОМ 2 » Пример реализации словаря для 2го ТОМа
Информация устарела!
Словарь больше не является плагином, и работает как обязательная составная часть платформы.
В остальном всё более-менее соответствует текущему положению.
Словарь работает как обычный плагин, тут ничего не поменялось.
Парсер, встретив неизвестное слово, обращается к словарю. Если эта словоформа есть в словаре, словарь должен вернуть код, формирующий это слово.
Хмм... надо уточнить несколько моментов. В плагин могут посылаться слова не в начальной форме? Что будет, если несколько плагинов зарегистрируют функцию getword? Как быть с синонимами? Когда вызывается функция getword: в момент парсинга очередной команды или один раз при первом проходе по программе? Т.е. можно ли подстроить так, чтобы первый раз на слово выдавалась одна лексема, а в следующий раз на него-же уже другая? Спрашиваю потому что думаю о динамическом редактировании и отладке словаря без перезапуска ТОМа.
И ещё подумал, что при такой гибкости можно исправлять опечатки пользователя прямо в плагине. Например, на слово "сафлетка" возвращать нормальную лексему для салфетки.
В плагин могут посылаться слова не в начальной форме?
Да, любое встреченное в команде слово.
Что будет, если несколько плагинов зарегистрируют функцию getword?
Работать будет тот, который зарегистрировал свою функцию последним.
Как быть с синонимами?
Пока никак. Можно считать что их нет.
Скоро появятся механизмы для указания синонимов, и 99% что они потребуют поддержку на уровне словаря.
Но пока этих механизмов нет, говорить об этом рано.
Когда вызывается функция getword: в момент парсинга очередной команды, или...
В самом начале парсинга очередной команды. Каждое слово запрашивается только один раз, после чего хранится в памяти платформы.
можно ли подстроить так, чтобы первый раз на слово выдавалась одна лексема, а в следующий раз на него-же уже другая?
Нет, так не получится. Если словоформа входит в несколько лексем (слово "пила") то словарь должен выдать все слова за один раз:
слово пила пила.ключ = ЖрНд пила.форма ИпЕч = пила пила.форма РпЕч = пилы ... слово пить пить.ключ = Нг //несовершённый глагол пить.форма ПвМрЕч = пил пить.форма ПвЖрЕч = пила пить.форма ПвСрЕч = пило пить.форма ПвМч = пили ...
можно исправлять опечатки пользователя прямо в плагине
Теоретически можно, только нужно продумать как словарь будет сообщать парсеру на что он исправил это слово.
В текущей реализации это приведёт к ошибке.
Работать будет тот, который зарегистрировал свою функцию последним.
Эх. Несколько плагинов-словарей разных производителей уже не подключить. Что-ж, придётся делать какой-то универсальный плагин, который будет работать с более-менее стандартизированными словарями. (Кстати, с SQL я не дружу).
Скоро появятся механизмы для указания синонимов, и 99% что они потребуют поддержку на уровне словаря.
Интригующе. Жду с нетерпением
Каждое слово запрашивается только один раз, после чего хранится в памяти платформы.
Надеюсь тут не будет проблем с такими случаями: платформа запрашивает слово "пилы" и получает одну лексему для существительного "пила". А затем, зная слово "пила" и не спрашивая словарь повторно ошибочно распознаёт глагол как существительное. Запоминаются только точные словоформы и слово в другой форме запрашивается повторно?
Теоретически можно, только нужно продумать как словарь будет сообщать парсеру на что он исправил это слово.
Например, в первой строке указывать опечатку:
опечатка салфеткой слово салфетка салфетка.ключ = ЖрНд салфетка.форма ИпЕч = салфетка салфетка.форма РпЕч = салфетки ...
платформа запрашивает слово "пилы" и получает одну лексему для существительного "пила". А затем, зная слово "пила" и не спрашивая словарь повторно ошибочно распознаёт глагол как существительное.
Кстати да, такие ошибки возможны. Надо подумать...
Например, в первой строке указывать опечатку:
Я тоже что-то подобное себе представлял. Надо подумать...
Кстати, с SQL я не дружу
SQL не сложнее паскаля. Потом всяко пригодится.
Вынес словарь в плагин. При намеренной ошибке "заложь рюмку за воротник" парсер не спрашивает у плагина слово "заложь". Почему? Откуда он знает, что этого слова нет в словаре? Если набрать "заложи рюмку за воротник", то всё прекрасно запрашивается. Но как? Он что, телепат?
Отредактировано Alexandr (2011-06-10 11:51:42)
Он что, телепат?
Прошу прощения. Это у меня в плагине глюки.
Нада-же, как он словарь мучает. Столько всего запрашивает: класс, свойство, описание, нет, да... кошмар! Вот зачем нужна скорость у словаря.
Отредактировано Alexandr (2011-06-10 12:03:18)
Нада-же, как он словарь мучает. Столько всего запрашивает: класс, свойство, описание, нет, да... кошмар!
Да, сейчас парсер запрашивает даже то что заведомо не является словом, например xy32 или генерал_майор.
Такие литералы надо будет сразу отбрасывать.
Обновил код плагина.
Изменения небольшие:
typedef int __stdcall (*wcsRegFn)(const wchar_t*,wcsFn,int,int);
enum{ FnInput=1, FnOutput=2, FnOther=3, FnCommand=4 };
RegFunction(L"getword",GetWord,FnOther,1);
И зачем же нужна эта FnCommand и четвёртый параметр функции RegFunction ?
И зачем же нужна эта FnCommand и четвёртый параметр функции RegFunction ?
Четвёртый параметр функции RegFunction передаёт количество аргументов регистрируемой функции. Может быть 0, 1 или 2.
FnCommand - это тип функций, доступных игроку из командной строки в игровом режиме. Все остальные недоступны. (В словаре этот тип не используется).
Вы здесь » ТОМ2 - платформа для парсерных игр » ТОМ 2 » Пример реализации словаря для 2го ТОМа