Нашёл две ошибки в библиотеках. Одну серьёзную (фактически, блок) и одну мелкую косметическую.
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. Там есть ещё одна небольшая доработка генератора.
Неактивен
Вылезла маленькая проблемка, которую пока не знаю как решить.
Я так понимаю, там всё дело в parseNounPhrase, которая неправильно распознаёт принадлежность слова тому или иному объекту. Надо будет как-нибудь посмотреть на неё.
Неактивен
Ещё одна гадкая ошибка.
"дать большой орех белке" - работает
"дать белке большой орех" - парсеру сносит крышу напрочь.
Как результат, в моей игре на КРИЛ нельзя будет использовать вторую форму, полностью корректную с т.з. русского языка.
Если только Андрей не разберется. Я что-то не смог. Андрей?
Неактивен
примерно 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 белке большой орех"
Очевидно, подобный анализ нужно делать и в предпарсе...
Неактивен
Спасибо огромное, Андрей! Чтоб я без тебя делал!
Я проверил, вроде нормально работает.
Скажи, а если я определяю предмет двумя существительными:
zmey: Actor location = startroom desc = 'Змей/муо Горыныч/муо' noun = 'дракон/мо' ... ;
то игра обламывается при попытке дать предмет Змею Горынычу
.
Я пока решил проблему тем, что сделал слово "Горыныч" прилагательным. Не уверен, что это правильно, но так, вроде, работает. Это вообще, как?
И еще. Если в определении существительного или прилагательного попадётся буква "ё", то это слово навсегда выпадает из поля зрения парсера. Т.е. не получится сделать desc = 'Ёжик/му'
- этого ёжика потом в игре не найти.
Отредактировано fireton (20.11.2009 11:27)
Неактивен
Указанные баги уже исправил. В приложении
второе - не обезъЁживались прилагательные. С существительными был порядок.
"Горыныч" должен быть прилагательным, по логике системы. Кстати, спасибо что напомнил, нужно доработать склонение отчеств.
Неактивен
Антон помог диагностировать ещё одну проблему.
Введена команда типа: положить яблоко в корзину
в игре есть несколько яблок
Парсер начинает разбор, выясняет, что "яблоко" требует уточнения и откладывает его на поздний этап анализа.
Затем проходят все стандартные фазы разбора и приходит черед замены specialWords на системные значения. В текущей версии РТАДС 'of'='в'='на'='из', что приводит к тому, что после неоднозначности все команды типа "глагол + неодназначное сущ. + в/на/из + сущ." трактуются как "глагол + уточненное сущ. of сущ.".
Результат:
(в корзину)
Я не вижу здесь объект "яблоко of корзину".
Остается либо удалить эти предлоги из списка специальных слов и лишится возможности оперировать "салом в шоколаде", "статуэткой из папье-маше", "торбой на круче". Либо ещё больше усложнить код и пытаться заменять эти предлоги на "in", "on", "from" во избежание...
Неактивен
И какие планы? Какое решение ты предпочёл?
Мне кажется, надо усложнять.
Доточим RTADS до невиданных высот!
У меня в конкурсной игре эта ошибка, кстати, проявляется самым неприятным образом.
Выход для игрока, чтобы обойти проблему - использовать краткую форму.
Например:>положить орех
Куда вы хотите положить это?
>в корзину
Готово.
Но, конечно, это не дело. Надеюсь, всё будет исправлено и я выпущу послеконкурсную версию игры без этого гадкого бага.
Отредактировано fireton (24.11.2009 08:56)
Неактивен
И еще одна ошибка:
Gayka: item noun='гайка/1ж' location=startroom ; Vint: item noun='винт/1м' location=startroom ;
>присоединить винт к гайке
Я не понимаю это предложение.
"присоединить винт к гайка" (или любой другой падеж, кроме дательного) - работает.
Неактивен
Фикс в приложении.
uux, извини, на письмо отвечу
Неактивен
И еще один глючок:
>войти в пещеру Ведущий внутрь пещеры проход слишком узок. >зайти в пещеру Во что ты хочешь войти? >пещеру Я не знаю как войти в пещеру.
Правда, пока выкрутился, применив compoundWord...
Отредактировано uux (25.03.2010 05:41)
Неактивен
GrAndrey написал:
Достаточно пополнить свойство verb в глаголе inVerb следующей лексемой: 'зайти в'
В моем случае почему-то не помогло:( - сам удивляюсь, почему. Правда, как уже сказано, обошел проблему при помощи compoundWord.
UPD: был неправ - действительно помогает. Видимо, забыл перекомпилировать игру.
Отредактировано uux (26.03.2010 05:48)
Неактивен