Нашёл две ошибки в библиотеках. Одну серьёзную (фактически, блок) и одну мелкую косметическую.
1. Модуль advr.t, функция parseNounPhrase.
if (objs!=[] and (wasadjafn || specifed)) return [(i+1)]+objs;
+1
в этом выражении, как оказалось лишнее, т.к. i
инкрементируется двумя строчками выше. Ошибка приводила к тому, что на фразу, скажем, "воткнуть булавку в подушечку" парсер отвечал "Я не понимаю это предложение".
2. Модуль errorru.t, функция parseError2.
if (p=inPrep) {p.sdesc;" ";i.vdesc;} else
p.sdesc;" ";
тут лишнее, т.к. уже выводилось на экран четырьмя строчками выше. Ошибка приводила к тому, что сообщение об ошибке выглядело как "Я не знаю как воткнуть булавку в в подушечку". Т.е. предлог дублировался.
Неактивен
Спасибо за выявленную и исправленную ошибку. Протестировал, побочных эффектов не обнаружил. Внес в библиотеки. Попутно решилась следующая, давно волновавшая проблема:
>взять кирку с трупа
Кирка не на трупе гоблина! У тебя уже есть кирка!
>взять кирку с трупа
Я не понимаю это предложение.
теперь:
>взять кирку с трупа
Взята.
>взять кирку с трупа
Кирка не на трупе гоблина! У тебя уже есть кирка!
Неактивен
Вылезла маленькая проблемка, которую пока не знаю как решить.
>положить подушечку в иголку подушечки
Я не вижу здесь объект "подушечку of иголки".
Просьба протестировать комбинации сущ+прилагательное
Обновленные библиотеки: hhtp://www.rtads.org/libr26pre.rar. Там есть ещё одна небольшая доработка генератора.
Неактивен
примерно 7370 строка адвр.т. Что сделал, сам толком не понял, так что хорошо протестите
// прилагательное if (((typelist[i] & PRSTYP_ADJ) != 0)) { local tobjs2; tobjs:=parserDictLookup([(wordlist[i])], [PRSTYP_ADJ]); if (objs!=[]) tobjs2:=intersect( objs, tobjs ); else objs:=tobjs; if (lasttype & PRSTYP_NOUN) wasadjafn:=true; // если было сущ + прил и они между собой не вяжутся if (wasadjafn && tobjs2=[]) return [i]+objs; // пересечение, видимо, годится if (tobjs2) objs:=tobjs2; } // существительное // нужно разобрать случай, сущ + прил + сущ, и прилагательное подходит ко всем! // видимо, просто уточнит, ничего страшного if (((typelist[i] & PRSTYP_NOUN) != 0)) { local tobjs2; tobjs:=parserDictLookup([(wordlist[i])], [PRSTYP_NOUN]); if (objs!=[]) tobjs2:=intersect( objs, tobjs ); else objs:=tobjs; // если цепочка увязки прервалась if (tobjs2=[]) return [i]+objs; // пересечение, видимо, годится if (tobjs2) objs:=tobjs2;
результат:
>дать белке большой орех
Ты не несёшь ореха.
>взять белку большого
Я не понимаю это предложение.
>взять белку для большого
Я не понимаю это предложение.
>взять белку большую
Ты не можешь взять белку.
А правильно должно быть "Я не вижу здесь объект "белку of большого""
НО!!!
>дать большой белке большой орех
Я не понимаю это предложение.
потому как "дать to большой to белке большой орех"
Очевидно, подобный анализ нужно делать и в предпарсе...
Неактивен
Указанные баги уже исправил. В приложении
второе - не обезъЁживались прилагательные. С существительными был порядок.
"Горыныч" должен быть прилагательным, по логике системы. Кстати, спасибо что напомнил, нужно доработать склонение отчеств.
Неактивен
Антон помог диагностировать ещё одну проблему.
Введена команда типа: положить яблоко в корзину
в игре есть несколько яблок
Парсер начинает разбор, выясняет, что "яблоко" требует уточнения и откладывает его на поздний этап анализа.
Затем проходят все стандартные фазы разбора и приходит черед замены specialWords на системные значения. В текущей версии РТАДС 'of'='в'='на'='из', что приводит к тому, что после неоднозначности все команды типа "глагол + неодназначное сущ. + в/на/из + сущ." трактуются как "глагол + уточненное сущ. of сущ.".
Результат:
(в корзину)
Я не вижу здесь объект "яблоко of корзину".
Остается либо удалить эти предлоги из списка специальных слов и лишится возможности оперировать "салом в шоколаде", "статуэткой из папье-маше", "торбой на круче". Либо ещё больше усложнить код и пытаться заменять эти предлоги на "in", "on", "from" во избежание...
Неактивен
Фикс в приложении.
uux, извини, на письмо отвечу
Неактивен
Достаточно пополнить свойство verb в глаголе inVerb следующей лексемой: 'зайти в'
Неактивен