IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Schon wieder: Präpositionen parsen
AntwortenNeues ThemaNeue Umfrage

Schon wieder: Präpositionen parsen

Geschrieben um 08:04 am 22.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hallo zusammen!

Ich will eine Wand, die einen Hof im Süden abriegelt, von der Hauswand unterschieden und versuche gerade, das erweitere Parsen einzubinden, das Martin hier beschrieben hat.

Problem: Der Compiler beschwert sich, dass die Property parse_ref nicht definiert ist; wenn ich das nachhole (global oder als individuelle Prop), stürzt Glulx nach der ersten Eingabe ab.

Schade auch, aber nicht dramatisch, denn es muss ja auch mit parse_name gehen. Das gab's im Forum auch schon und müsste etwa so aussehen:


Object -> mauer "Steinmauer"

with   description "Eine gut 2 m hohe aus Betonziegeln gemauerte

            Steinwand umgibt den Hof.",      

    name 'wand' 'steinmauer' 'mauer' 'steinwand' 'hofmauer'

            'betonwand' 'in' 'im' 'sueden',

         parse_name [ n wd;

           wd = NextWord();

           while (WordInProperty(wd, self, name)) {

             wd = NextWord();

             n++;

           }

           return n;     

         ],

has   female scenery;

Da ist bestimmt noch ein bisschen Schrott und/oder Redundanz drin, aber mein Problem liegt im der Unterscheidung von "in" und "im", das auch bei anderen vielleicht umständlicheren parse_name-Props auftaucht:

Zitat:

u wand

Was meinst du, die Steinmauer oder die Hauswand?

u wand im süden

Ich habe nur Folgendes verstanden: die Steinmauer betrachten.

u wand in süden

Eine gut 2 m hohe aus Betonziegeln gemauerte Steinwand umgibt den Hof.

Wie kann ich den Parser dazu bringen, die kontrahierte Form 'im' als einfache Präposition anzusehen? Ich glaube, dann müsste es gehen.

Schöne Grüße,

Christof

Geschrieben um 10:41 am 22.04.2011 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Um Martins erweiterte Parser-Möglichkeiten zu nutzen, musst du zunächst eine Konstante definieren; damit schaltest Du die experimentellen Features frei:

Constant EXTENDED_PARSER;

Dann kanst du


parse_ref s_obj,```

bei der Wand definieren und sie sollte als WAND IM SÜDEN angesprochen werden können.

Wenig bekannt, aber immens wichtig:

**Die Verschmelzung von Präposition und Artikel (IM, AM, ZUM usw.) können niemals vom deform-Parser verstanden werden, weil vor dem Parsen das Wort in der Spieleringabe aufgelöst  wird; aus IM wird IN DEM, aus AM wird AN DEM usw.** Deshalb brauchst Du nur 'in' zu definieren. DEM wird als Deskriptor überlesen (ignoriert). Das ist im deutschen Inform 7 übrigens genauso.

(Das wäre vielleicht auch noch mal ein Fall für den Libchecker.)

Hier mal die komplette Liste der (einzelnen) Vokabeln, die umgewandelt werden (aus German.h):

```Array LanguageSynonyms table

    'am'        "an dem"

    'ans'       "an das"

    'aufs'      "auf das"

    'beim'      "bei dem"

    'durchs'    "durch das"

    'hinterm'   "hinter dem"

    'hinters'   "hinter das"

    'im'        "in dem"

    'ins'       "in das"

    'nebens'    "neben das"

    'uebers'    "ueber das"

    'ueberm'    "ueber dem"

    'unters'    "unter das"

    'unterm'    "unter dem"

    'vom'       "von dem"

    'vors'      "vor das"

    'vorm'      "vor dem"

    'zum'       "zu dem"

    'zur'       "zu der"

    'darin'     "in ihm/r"

    'damit'     "mit ihm/r"

    ;

Viele Grüße,

Christian

Geschrieben um 18:09 am 22.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hi Christian, vielen Dank für die fixe Antwort!

Die Konstante hatte ich definiert und zwar am Angfang mit den anderen Konstanten vor den Globals. Ohne sie kann der Parser mit parse_ref doch gar nichts anfangen, oder? Wenn ich sie aber definiere, stürzt Glulx ab und Frotz hängt sich auf.

Das mit der Umdeutung von 'im' zu 'in' 'dem' habe ich mir im Prinzip gedacht, aber ich werde nicht ganz schlau aus dem, was mit der NextWord-Funktion (Routine? Variable?) passiert. Wäre dann 'dem' das nächste NextWord nach 'in'? Ich vermute, es wäre nicht, denn dann müsste ja Folgendes funktionieren:


parse_name [w1 w2 w3;

  if (NextWord() ~= 'wand' or 'mauer') return 0;

  w1 = NextWord();

  w2 = NextWord();

  w3 = NextWord();

  if (w1 == 'in' && w2 == 'dem' && w3 == 'sueden') return 3;

  return 1;

],

Tut es aber nicht.

Stattdessen habe ich es mit einem Befehl versucht, den ich hier gefunden habe, und meine parse_name erweitert:


  wd = NextWord();

  while (WordInProperty(wd, self, name)) {

    wd = NextWord();

     if (wd == 'in') Descriptors();

     n++;

   }

   return n;

],

Auch das klappt nicht. Muss ich Descriptors() an anderer Stelle einbauen?

Schöne Grüße,

Christof

Geschrieben um 18:42 am 22.04.2011 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

C++:

Wenn ich sie aber definiere, stürzt Glulx ab und Frotz hängt sich auf.

Seltsam. Bei mir funktioniert das mit dem erweiterten Parsen alles super. Ich habe das auch schon in längerem Code (Z) verwendet ohne dass irgendwas abgestürzt ist. Vielleicht magst Du mir mal Deinen Code schicken; möglicherweise entdecke ich ja, was nicht stimmt.

Edit:

Mein Testcode:


Constant Headline "^Ein interaktiver Probelauf^";

Constant EXTENDED_PARSER;

Include "Parser";

Include "VerbLib";

Object Testraum "Testraum"

  with

    description "Hier wird getestet.",

  has light;

   

Object "Tor im Süden" Testraum

  with  name 'tor',

        prep 'in',

        parse_ref s_obj,

   has  neuter;

[ Initialise;

    location = Testraum;

    print "^^^";

];

Include "GermanG";

Ergibt:

Mein I6-Testspiel:

Testspiel

Ein interaktiver Probelauf

Release 1 / Serial number 110422 / Inform v6.32 Library 6/11 SD

Testraum

Hier wird getestet.

Du siehst hier ein Tor im Süden.

echo

[Echo on.]

u tor im süden

[Echo: "u tor in dem sueden"]

Du siehst nichts Besonderes an dem Tor im Süden.

Alles tipptopp. Hast Du dran gedacht, dass parse_ref ein Objekt enthalten muss? (Vielleicht statt s_obj die Vokabel 'sueden' eingetragen oder s_obj mit s_to verwechselt? ;-))

Schöne Ostern,

Christian

Geschrieben um 23:20 am 22.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hi!

ChristianB:

Vielleicht magst Du mir mal Deinen Code schicken; möglicherweise entdecke ich ja, was nicht stimmt.

Mach ich, aber wohl erst nach Ostern. Danke für das Angebot.

Zitat:

(Vielleicht statt s_obj die Vokabel 'sueden' eingetragen oder s_obj mit s_to verwechselt? ;-))

Knurrr! Als wenn ICH... Frechheit!

Schöne Grüße,

Christof

Geschrieben um 15:51 am 26.04.2011 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Also jetzt für alle, die es wissen wollen:

Constant EXTENDED_PARSER definieren;

im entsprechenden Objekt die Properties parse_ref und prep definieren;

die Parserroutine parse_name wird nicht benötigt;

die Entry Point-Routine parse_noun darf nicht verwendet werden - die Kombo mit parse_ref führt zum Absturz.

Danke an Christian für die Fehlersuche.

Christof

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz