Inform 6 : Parseur idiot

Pour discuter des langages que nous utilisons pour réaliser nos jeux : problèmes, solutions, suggestions...

Modérateurs: Stormi, Otto Grimwald

Inform 6 : Parseur idiot

Messagepar JB le Mer Mai 03, 2006 11:19 pm

Oui ok, inform 7 est à la mode, mais moi, j'ai écrit la moitié d'un jeu en inform 6, alors j'ai une question.

Suite aux retours de stormi sur Ek, voici un problème de "fond" pour nos amis traducteurs de bibliothèques.

Imaginons que j'ai un object coffre et un object julie.

Si je fais :

> ouvrir malle

J'ai la réponse :

"Je n'ai compris que : ouvrir julie".

Il peut pas me dire quelque chose de plus sympa comme "Désolé, il n'y a pas de malle dans le coin ?"

Ca permet d'éviter des ambiguités malheureuses...

Merci de votre aide.

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar JL le Jeu Mai 04, 2006 10:23 pm

C'est regrettable en effet.

Quels sont les propriétés name des deux objets ? Ont-ils des mots communs ? (du style "malle" "de" "julie")
JL
Grand Ancien
 
Messages: 287
Inscription: Mer Aoû 25, 2004 9:13 pm

Messagepar Otto Grimwald le Jeu Mai 04, 2006 11:27 pm

Une solution possible :

Code: Tout sélectionner
A malle is a kind of container.
A Julie is a kind of female living.
Instead of stupidly examining the Julie when looking at the malle (is the player not attrated by female living being ?):
    say "Désolé, il n'y a pas de malle dans le coin ?".


Ne me remercie pas :)

Pour ton problème, avec le code et le contexte cela irait mieux. Le coup c'est qu'il y a ou pas une malle ? (mais que tu as seulement indiqué coffre ? cf la fin de ton message)

Quoi qu'il en soit, j'ai vu dans tes différents codes que tu avais tendance à créer des objets qui ne sont pas spécifiquement des lieux (avec des attributs d'objets comme container, il me semble), et que tu plaçais des choses dedans comme si c'était une pièce. J'ai l'impression que cela perturbe inform et que cela donne ce genre de message. Mais peut être que je me trompe... Je n'ai pas souvenir d'avoir eu ce genre de bug dans mes propres jeux, et pourtant il y en a des bugs !!
Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar JB le Ven Mai 05, 2006 5:40 pm

JL a écrit:C'est regrettable en effet.


Nous nous sommes permis Pauline et moi d'élire ce post comme le plus utile de l'histoire d'internet.

En petite forme, le JL, va falloir arreter world of warcraft :-)

Non, plus sérieusement je vous posterai un exemple de code précis, c'est ma faute, toujours est il qu'en fait effectivement le parseur "désambiguitateur" a un comportement curieux et différent de la précédente version d'inform.

Dans mon exemple, "malle" n'existait pas même pas en alias. Dans Filaments, par exemple, une telle situation aurait fait répondre "je ne vois pas de malle ici". Là, le parseur essaie poussivement de suggerer quelque chose et ca foire à 100%, pire, il suggére parfois des objets vaguement dissimulés à coups d'attributs scenery et gachent la découverte progressive du jeu.

Sinon, Eric je pense que sauf erreur de ma part, tu dois confondre. Ce n'est qu'exceptionnellement que j'utilise des lieux container mais parce que je n'ai pas le choix, par exemple avec le bateau sur l'Arno.

Merci pour votre aide.

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar Otto Grimwald le Ven Mai 05, 2006 7:03 pm

une autre piste (qui me semble plus probable vu la teneur de l'erreur, puisqu'il n'a pas compris ton verbe) : as tu trifouillé la bibliothèque ou changé le verbe "ouvrir", comme s'il ne reconnaissait pas la façon normale de procéder. On a la même bibliothèque (en théorie), la 6/11, et sur mon jeu pour un objet qui n'est pas dans le champs de vision ou inexistant, j'ai systématiquement "vous ne pouvez voir une telle chose"

cf. http://anamnese.online.fr/if/jtemple.html

La définition est normalement :

Verb 'ouvrir'
* noun -> Open
* noun 'avec' held -> Unlock;

tu n'aurais pas changé le premier "noun" par quelque chose d'autre ? Ou remplacé le verbe ouvrir sans garder cette partie ?

En général lorsque l'on fait des modifications de verbe dans son code, il vaut mieux faire :

Extend "verb" first

et tes modifications arriverons en premier. Mais si tu fais quelque chose d'incompatible qui est pris en compte en premier, cela te donnera des erreurs.

et désolé pour ma première suggestion, je dois effectivement confondre.
Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar JB le Sam Mai 06, 2006 9:40 am

Hello,

Bon j'espère que JL boude pas suite à ma petite remarque... ;-)

Voici le code :

Code: Tout sélectionner

Object entrance2 "Devant le portail de la Villa Nouée"
with description [;
Affiche(79);
print "^Ce petit promontoire donne une vue imprenable sur la Méditerannée.^^L'escalier débouche sur un portail
en fer forgé derrière lequel s'étend un autre jardin, mieux entretenu que celui qui mène à la route. ^";
if (self.vu==0) {RencontreGalina();}],
               cant_go "^Je peux redescendre l'escalier vers le sud, ou entrer pour passer le portail - s'il est ouvert,
               bien entendu. ^",
               n_to [;if (herse has ~open) {print "^Volontiers, mais une herse de bronze me bloque le passage.
               Vraiment le type de bibelots qui ruine une visite.^";return 1;} else {return jardin1;}],
          u_to entrance2,
          d_to entrance1,
          s_to entrance1,
          vu 0,
               has scenery jardin; 

Object herse "grille" entrance2
    with name 'grille' 'herse' 'porte' 'bronze',
         description "^Une grille métallique aux barreaux épais bloque l'entrée dans la villa.^^Au delà, je devine un grand
         jardin où serpente un sentier de gravier.^^Près de la grille, encastrée dans le mur de pierre, je remarque
         une pierre saillante, comme descellée. ^ ",         
         has static female openable lockable locked scenery;

Object galina "Galina"
  with name "galina" "femme" "russe" "fille" "slave",
  description [;Affiche(96);print "^Une femme étrange, vive de mouvements et d'esprit, d'une finesse et d'une
  habileté intellectuelle bouillonante que l'on devine dans l'expression de son visage ou même dans son regard.^^";],
     life [;Answer,Ask,Tell: Affiche(96); print "^Elle parle déjà assez comme cela, merci !^";return 2;
     Give : print "^Galina s'exclame : ~Hé, joli truc ! Vous voulez me le donner ?~^^Euh, non, finalement,
     je vais le garder pour moi. ";return 2;
     Kiss : print "^Malheur de malheur. Ce serait le début de la fin. ^";return 2;
     Attack : print "^Non, elle ne le mérite pas. ^";return 2;
          ],     
          each_turn [;AnimGalina();],       
          found_in [;if (entrance2.vu==1) {return location;}],
          k 0,
          stop 0,
has animate proper scenery;


Bon, alors quand on fait :

> ouvrir portail
Ben, je ne vois rien de tel par ici

(ok, ca c'est cool, ca me va)

Mais si on fait :

> ouvrir le portail
Je n'ai compris que : ouvrir Galina

(ce qui est moins cool)

Dans le fond, je comprends le parseur : quand on écrit le portail, il trouve pas portail alors il se demande quoi chercher, il trouve la herse mais il s'apercoit que c'est un female, donc ca peut pas etre le, alors il choisit Galina qui a rien de spécifié.

Mais on ne peut pas uniquement ouvrir des choses qui ont l'attribut openable ?
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar Otto Grimwald le Sam Mai 06, 2006 12:05 pm

je pense que tu as raison, j'ai testé dans un de mes jeux, en incluant ton code, et cela fait pareil, par contre pourquoi ne veux-tu pas mieux caractériser tes objets /personnes ? Si Galina est une femme, pourquoi ne pas lui donner le bon attribut?
Il est possible que cela soit une limitation du parseur (en plus en anglais il n'y a pas ce problème de genre), il faudrait voir dans les autres langues comment cela se passe. Personnellement je ne m'en étais jamais rendu compte car je ne tape jamais les articles : "ouvrir portail" etc.
Une solution pour ton code est d'ajouter les articles le et la dans la propriété name pour les objets les plus importants, ainsi tu es certains qu'ils apparaitront en premier si le joueur tape un article.

Je viens de voir que c'était la même chose avec inform7 bien entendu, et que l'on retrouvait aussi ce problème cité "regarder dfzerfsdfs" (dans la boite) Vous ne trouvez rien dans la boite".

Peut-être que cela vaudrait le coup de supprimer l'analyse des articles, si c'est possible, pour éviter ce genre d'erreur Mais cela dépasse mes compétences.

Désolé pour t'avoir accusé d'avoir hacké la bibliothèque ;)
Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar JB le Sam Mai 06, 2006 1:04 pm

Bah, ca va en fait j'ai bien été obligé de transformer la bibliothèque pour avoir des messages par défaut à la 1ere personne, et même dans La Mort...j'ai du modifier la barre de statut pour qu'elle indique les jours passés.

Mais par contre étant donné que JLP et toi avez traduit les bibliothèques, ce serait pas trop compliqué de faire les petites modifs pour ces deux problèmes, non ?

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar Otto Grimwald le Sam Mai 06, 2006 2:09 pm

rendons à César...

c'est JL qui a traduit et adapté la première version de la bibliothèque. Ensuite avec la version suivante d'Inform on a un peu vu cela ensemble, mais il a encore fait le plus gros travail.

J'ai été examiner la bibliothèque au sujet de ce dont tu parles, mais je ne sais pas ce que l'on peut y faire.

Code: Tout sélectionner
> examiner bibliothèque toute cassée
 
je ne vois pas de biblioth@|~`eque ici.

> examiner la bibliotheque toute cassee

(dans la Russe)
Vous ne trouvez rien d'intéressant dans la Russe. Essayez plutôt de l'ouvrir à la place.

>merde
Les vrais aventuriers n'emploient pas un tel langage.

> reparer bibliotheque

désolé, vous n'avez pas des capacités d'analyse suffisantes pour résoudre ce problème insoluble.
Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar JB le Sam Mai 06, 2006 2:16 pm

Bon, c'est certainement lié à :

I: Print best possible error message

ligne 1988 de parserm.h

plus précisement la ligne 1998 puisque le message en question est le miscelleanous #28

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar JB le Sam Mai 06, 2006 2:20 pm

Bon, ok le 1er probléme est résolu,

Solution :

Ligne 1039 de French.h, remplacer le message 28 par qq chose du style "Il n'y a rien de tel ici".

Et mettre un ! devant les lignes 2000 et 2001 de parserm.h, soit :

! for (m=0 : m<32 : m++) pattern-->m = pattern2-->m;
! pcount = pcount2; PrintCommand(0); L__M(##Miscellany, 56);

Ca résout le problème d'ouvrir galina.

Maintenant l'autre...

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar JB le Sam Mai 06, 2006 2:22 pm

Euh, en fait apparamment, ca résoud aussi le deuxième problème sauf erreur de ma part...

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar Otto Grimwald le Sam Mai 06, 2006 3:34 pm

tant mieux alors, mais il faudrait être certain que cela ne risque pas de poser des pb par derrière, et trouver un moyen pour modifier cette entrée dans parserm.h depuis french.h, sans toucher au fichier original.
Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar Stormi le Ven Nov 10, 2006 12:25 pm

Bon, ce(s) problème(s) est(sont) récurrent(s) dans tous les jeux récents utilisant la bibliothèque (premières beta d'ekphrasis, sarvegne, la cité des eaux)

JB, ta correction fonctionne bien, avec le recul du temps ? Cela n'a rien soulevé comme problème ?

JL, Otto, vous voyez d'où vient le problème et comment on pourrait le corriger durablement dans la bibliothèque ?


Exemples :
>regarder le fjdsjfl
Je n'ai compris que : regarder le Cabinet de dentiste.

>fouiller la fdfsf
Vous ne pouvez voir "la" (la barricade) pour l'instant.

>regarder les ordures
Vous ne pouvez voir "les" (les urinoirs) pour l'instant.


et un peu similaire quoique légèrement moins grave (mais tout de même génant) :
>casser barricade avec pierre
Je n'ai compris que "casser la barricade"
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1205
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Messagepar JB le Ven Nov 10, 2006 2:39 pm

Je confirme que ca résoud le problème à long terme.

C'est ca qu'est cool avec les programmes d'ailleurs, contrairement aux maisons, ils se fissurent pas avec le temps ;-)

JB
Avatar de l’utilisateur
JB
Grand Ancien
 
Messages: 510
Inscription: Mar Aoû 24, 2004 11:00 am
Localisation: Paris

Messagepar Otto Grimwald le Ven Nov 10, 2006 5:32 pm

non, j'avoue ne pas assez bien connaitre le langage pour cela. Par contre c'est lourd qu'il faille corriger cela dans parserm.h du coup on ne peut pas vraiment le corriger juste dans nos fichiers de langue. On a vu également avec le groupe rakontointeraktiva, qu'il y avait quelques parties de parserm je crois, qui contiennent des phrases en anglais destinées au joueur, et ça c'est pas très bon non plus.

Il faudrait déjà voir comment cela réagit en anglais, et dans les autres langues (italien, espagnol...)

Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3028
Inscription: Mar Aoû 24, 2004 12:02 pm

Messagepar Stormi le Mer Nov 22, 2006 5:19 pm

Je vais essayer de résoudre le problème en une ligne de code ce soir, sans toucher à parserm.h, mais j'ai de gros doutes sur mes chances de réussite.
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1205
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Messagepar Stormi le Mer Nov 22, 2006 9:29 pm

Bon, comme prévu c'était une bêtise... Je cherche un autre moyen de modifier les choses dans French.h ou FrenchG.h.

Note : pour le problème récurrent de ce style :
>regarder les fsdjfjms
je n'ai compris que : regarder les poireaux

Le problème vient du fait que "les" peut être à la fois un article (the) ou un pronom (them) qui fait référence à un objet (ici : les poireaux).
C'est "les" comme dans "regarde-les" ou "les regarder".
Dans le cas présent, les est un article pour moi qui le tape, mais pour le parser le considérer comme un pronom lui donne un meilleur score.

Si on pouvait faire en sorte que le pronom les n'en soit un que lorsqu'il n'est pas suivi d'autres mots, cela pourrait aider.

Par ailleurs "regarde les" a un sens mais "regarder les" non. C'est sûrement très difficilement faisable, mais dans le cas où le verbe est n'est pas un impératif "les" ne devrait être considéré comme pronom que s'il est placé devant le verbe.

Est-ce qu'il faudrait utiliser "-les" comme identifiant pour le pronom "les" pour essayer de dépêtrer le parseur de ce problème ?

Otto, JL, JB, Adrien, vous auriez une opinion sur le sujet ?
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1205
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Messagepar Stormi le Mer Nov 22, 2006 9:56 pm

Voilà une correction imparfaite et un peu violente : j'ai tout simplement viré le la les de la définition des pronoms (j'ai remis -la, -les -le à la place).

D'abord (ligne 148 environ)
Code: Tout sélectionner
      ! Object pronouns
      '-le'    $$100000100000                    NULL
      '-la'    $$010000010000                    NULL
      '-les'   $$000110000110                    NULL
!      '-lui'   $$110000110000                    NULL
!      '-leur'  $$000110000110                    NULL   ! tirets enlevés
!      'le'    $$100000100000                    NULL   ! en espérant que l'article le/la/les ne vienne pas interférer
!      'la'    $$010000010000                    NULL   ! (Le parser a l'air de se débrouiller.)
!      'les'   $$000110000110                    NULL
      'lui'   $$110000110000                    NULL ! dans "donne-lui", "lui" est m ou f
      'leur'  $$000110000110                    NULL


Et plus loin (ligne 185 environ)
Code: Tout sélectionner
!      'son'    $$100000100000    POSSESS_PK      '-lui'
!      'sa'     $$010000010000    POSSESS_PK      '-lui'
!      'ses'    $$000110000110    POSSESS_PK      '-lui'
      'leur'   $$110000110000    POSSESS_PK      '-les'
      'leurs'  $$000110000110    POSSESS_PK      '-les'   ! tirets enlevés
      'son'    $$100000100000    POSSESS_PK      'lui'
      'sa'     $$010000010000    POSSESS_PK      'lui' !*! remplacer par "luy" ?
      'ses'    $$000110000110    POSSESS_PK      'lui' !*! 2e colonne : mettre m et f ?
!      'leur'   $$110000110000    POSSESS_PK      'les'
!      'leurs'  $$000110000110    POSSESS_PK      'les'


Grâce aux traitements de la fonction LanguageToInformese, une commande comme "le prendre" fonctionne toujours car transformée en "regarder lui".

En revanche "regarde-le" ne fonctionne pas encore. Il faudrait un traitement spécifique pour ces cas là.
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1205
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Messagepar Stormi le Mer Nov 22, 2006 11:10 pm

Je suis allé plus loin que je ne le pensais dans mes modifications et j'ai également modifié la fonction LanguageToInformese. J'espère ne pas avoir fait de grosse boulette.

J'ai remplacé ceci :
Code: Tout sélectionner
    !  jadis, insertion d'un espace avant chaque tiret et après chaque apostrophe
    !  depuis la 2.1, suppression des tirets et insertion d'un espace après chaque apostrophe
    for (i=WORDSIZE:i<WORDSIZE+NbChars():i++) {
         if (buffer->i == '-') buffer->i=' ';
         if (buffer->i == ''') LTI_Insert(i+1, ' ');
    }
    Tokenise__(buffer,parse);


par cela :
Code: Tout sélectionner
    !  Si le dernier mot de la phrase est "le" ou "la" ou "les",
    ! les remplacer par "-le" ou "-la" ou "-les"
    ! (en espérant que la condition n'est pas trop "large")
    i = NbMots()-1;
    at = PositionMot(i); ! position du mot numéro i dans buffer
    if (Mot(i) == 'les') LTI_Insert(at, '-');
    if (Mot(i) == 'le') LTI_Insert(at, '-');
    if (Mot(i) == 'la') LTI_Insert(at, '-');
    Tokenise__(buffer,parse);

    !  Premier passage : insertion d'un espace avant chaque tiret et après chaque apostrophe
    for (i=WORDSIZE:i<WORDSIZE+NbChars():i++)
    {
        if (buffer->i == '-') LTI_Insert(i++, ' ');
        if (buffer->i == ''') LTI_Insert(i+1, ' ');
    }
    Tokenise__(buffer,parse);

    ! Deuxième passage
    ! Suppression des tirets en début de mot, sauf pour les mots
    ! -les, -la et -le
    ! problème : il va rester 2 espaces entre deux mots si un tiret est viré (c'est grave ?)
    for (i=0:i<NbMots():i++)
    {
        word = Mot(i);
        at = PositionMot(i); ! position du mot numéro i dans buffer
        if (buffer->at == '-')
        {
            if (word~='-les' && word~='-le' && word~='-la')
            {
                buffer->at = ' ';
            }
        }
    }
    Tokenise__(buffer,parse);


Maintenant :
- regarde-le (ou -la ou -les) fonctionne
- regarde le (ou la ou les) aussi à condition que le/la/les soit le dernier mot de la phrase.
- une phrase comme "prends la pomme puis mets-la dans le sac" est OK, mais s'il manque le tiret de "-la" mon implémentation ne suffira pas car elle n'est pas en bout de phrase et 'la' restera un article et non un pronom. Il faudrait en fait ajouter le tiret devant le/la/les si le mot est en fin de groupe nominal (c'est ça le terme exact ?) mais je ne sais pas faire.
- dans les messages d'erreur, on a droit à ça par exemple (améliorable, donc) :
>regarde la
Je ne suis pas sûr de ce à quoi "-la" se réfère.


J'attends vos remarques, pour me dire que j'ai tout cassé, que j'ai fait trop compliqué ou que cela vous semble aller dans le bon sens.
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1205
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Suivante

Retourner vers Questions techniques et aide pour votre code

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron