Autor |
Nachricht |
< I6/I7: Artikel vor [topic]-Token überlesen |
|
Verfasst am:
Do, 12 Aug 2010 - 19:46
|
|
|
Experte

Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
In deform wird das erste Wort eines topics überlesen, wenn es ein Artikel ist.
In ParseToken() heißt es für ein TOPIC TOKEN:
Code: | ...
if (consult_words > 1) {
Descriptors();
if (wn > consult_from && wn < consult_from + consult_words)
parsed_number=NextWord();
}
... |
Diese Methode reicht für Inform 7 leider nicht aus, denn ein Topic (in I7 heißt das [text]) wird in einer eigens für das Topic erzeugten Routine geprüft:
Code: | [ Consult_Grammar_290
range_from ! call parameter: word number of snippet start
range_words ! call parameter: snippet length
original_wn ! first word of text parsed
group_wn ! first word matched against A/B/C/... disjunction
w ! for use by individual grammar lines
rv ! for use by individual grammar lines
;
wn = range_from; original_wn = wn; rv = GPR_PREPOSITION;
group_wn = wn;
.group_632_1_1; wn = group_wn;
if (NextWordStopped() ~= 'tresen') jump group_632_1_2;
jump group_632_1_end;
.group_632_1_2; wn = group_wn;
if (NextWordStopped() ~= 'bar') jump Fail_1;
.group_632_1_end;
if ((range_words==0) || (wn-range_from==range_words)) return rv;
.Fail_1; rv = GPR_PREPOSITION; wn = original_wn;
return GPR_FAIL;
]; |
Die Routine wird aufgerufen mit consult_from und consult_words als ersten bzw. zweiten Parameter.
Ich habe schon allerhand probiert, consult_from und consult_words nach dem Überlesen der Deskriptoren (in ParseToken) anzupassen, aber es funktioniert einfach nicht. Wie kann man prüfen, ob und wieviele Deskriptoren überlesen wurden? Und wie muss ich dann consult_from und consult_words nachjustieren? Oder denke ich in eine völlig falsche Richtung?
Wenn einer helfen kann, dann bestimmt Martin ;-) |
|
|
|
 |
|
Verfasst am:
Fr, 13 Aug 2010 - 11:12
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
ChristianB hat folgendes geschrieben: | Wenn einer helfen kann, dann bestimmt Martin ;-) |
Na gut, dann will ich mir mal den Hut von I6-Repair-Man aufsetzen. (Natürlich muss ich dazu erst mal den Staub runterkopfen.)
Der Code-Abschnitt, den Du da gepostet hast, wird nur aufgerufen, wenn eine der Aktionen Ask, Answer oder Tell ist. Für allgemeine Topic-Token werden die Deskriptoren also auch in I6-deform nicht überlesen.
Ich habe jetzt einfach das Überlesen der Deskriptoren an den Anfang gestellt, bevor der Wortmarker wn gesetzt wird. Die Topic-Variablen consult_word und consult_from werden erst danach belegt, wenn also wn eventuell schon durch das Überlesen von Artikeln weitergerückt ist:
Code: |
5720: TOPIC_TOKEN:
5721: Descriptors();
5722: consult_from = wn;
|
Das klappt bei mir, macht aber das Überlesen später überflüssig. (Da es aber nicht mehr zum Überlesen gibt, macht das nichts.) Dass nun bei jedem Topic die Deskriptoren ignoriert werden, finde ich sogar gut.
Ich habe es mit einem einfachen Beispiel, in dem Topics in einem Table abgelegt waren, ähnlich dem sybillinischen Beispiel in Kapitel 15.13 I7-Manual, getestet. _________________ Every silver lining has a cloud. |
|
|
|
 |
|
Verfasst am:
Sa, 14 Aug 2010 - 0:32
|
|
|
Experte

Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Danke, Martin! Das klappt perfekt und macht auch diese Abteilung wieder ein Stück besser.
Ich war zum Schluss der Lösung einigermaßen nahe gekommen, indem ich ein [descriptors]-Token definiert habe, das nichts weiter machte als Descriptors() aufzurufen und das jedem [text]-Token in der Verbendefinition vorangestellt wurde. Damit war am Ende im Grunde das erreicht, was Du vorgeschlagen hast -- nur dass es den Umweg von I7 nach I6, dann zurück nach I7 und wieder nach I6 nahm.
Dass mir der direkte Weg nicht einfallen wollte, lag wohl daran, dass ich keinen I6-Repair-Man-Hut habe.
Chapeau und Danke! |
|
|
|
 |
|
|
Alle Zeiten sind GMT + 1 Stunde (MEZ) |
|
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.
|
|