Inform 6 : Parseur idiot

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

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 »)

Une solution possible :

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 :slight_smile:

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 !!

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 :slight_smile:

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

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. 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.

Hello,

Bon j’espère que JL boude pas suite à ma petite remarque… :wink:

Voici le code :


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 ?

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 :wink:

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

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.

> 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.

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

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

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

JB

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.

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 :

et un peu similaire quoique légèrement moins grave (mais tout de même génant) :

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 :wink:

JB

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…)

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.

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 :

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 ?

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)

      ! 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)

!      '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à.

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 :

    !  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 :

    !  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) :

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.