Forum moved to if-forum.org
Autor Nachricht
<  Schon wieder: Präpositionen parsen
C++
BeitragVerfasst am: Fr, 22 Apr 2011 - 7:04  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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:

Code:

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Fr, 22 Apr 2011 - 9:41  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

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

Code:
Constant EXTENDED_PARSER;


Dann kanst du

Code:
prep 'in',
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):

Code:
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
_________________
Worichtung willst du ingehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Fr, 22 Apr 2011 - 17:09  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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:

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

Code:
parse_name [ n wd;

  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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Fr, 22 Apr 2011 - 17:42  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

C++ hat folgendes geschrieben:
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:

Code:
Constant Story "Testspiel";
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 hat folgendes geschrieben:
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
_________________
Worichtung willst du ingehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Fr, 22 Apr 2011 - 22:20  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

Hi!

ChristianB hat folgendes geschrieben:
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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
C++
BeitragVerfasst am: Di, 26 Apr 2011 - 14:51  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  Inform & Glulx

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05