Syntax mit PC-PATR
Debugging - Fehlersuche
WAS MAN ALLES FALSCH MACHEN KANN, WIE MAN ES HERAUSFINDET, UND WIE MAN ES
REPARIERT!
Syntax und Semantik formaler Sprachen
Wie bei natürlichen Sprachen unterscheidet man auch bei formalen Sprachen und
Programmiersprachen zwischen der Syntax und der Semantik von Ausdrücken
(Sätzen, Texten, Programmen). Die Syntax einer Sprache legt durch die
Regeln fest, wie die Ausdrücke der Sprache gebildet werden können. Die Semantik
legt die Bedeutung oder Funktion der Ausdrücke fest.
Voraussetzung für die sinnvolle Verarbeitung eines Programmes ist seine syntaktische
Korrektheit. Falls ein Ausdruck gegen eine Regel oder mehrere Regeln verstößt,
kann er nicht weiterverarbeitet werden, d.h. ihm kann keine Bedeutung oder Funktion
zugeordnet werden. Dies gilt für natürliche Sprachen wie Englisch oder Deutsch
genauso wie für formale, z.B. für die Prädikatenlogik erster Stufe oder für
PATR-Grammatiken.
Ein Programm (eine Grammatik) ist semantisch korrekt, wenn es das tut,
was es tun soll. Die syntaktische Korrektheit ist eine notwendige jedoch keine
hinreichende Bedingung für die semantische Korrektheit eines Programmes (einer
Grammatik). Mit anderen Worten, ein syntaktisch korrektes Programm kann semantisch
abweichend sein.
Syntaxfehler
Die syntaktische Korrektheit von
Grammatikdateien wird bereits beim Laden überprüft. Weist eine Grammatikdatei
einen syntaktischen Fehler auf, erscheint die nebenstehende Fehlermeldung. Man
erhält jedoch keinen Hinweis darüber, wo der Fehler zu suchen ist oder von welcher
Art er ist. Fehler können unter Umständen von sehr subtiler Art sein.
- Übung 1.
- Versuchen Sie die Datei f01.grm in WinPatr zu laden. Sie werden feststellen,
dass das nicht geht. Öffnen Sie die Datei im Editor, überprüfen Sie sie auf
Fehler, nehmen Sie die notwendigen Korrekturen vor und versuchen sie es erneut.
Wiederholen Sie diese Prozedur solange, bis die Datei problemlos geladen werden
kann.
- Übung 2.
Syntaktisch fehlerhafte Lexikondateien
werden problemlos geöffnet, die Fehler machen sich daher erst bei der Anwendung
bemerkbar. Öffnen Sie zusätzlich zur inzwischen korrigierten Grammatikdatei
f01.grm die Lexikondatei f01.lex. Versuchen Sie jetzt den Satz the boy
cried zu analysieren. Es erscheint die nebenstehende Fehlermeldung. Sie
kommt immer dann, wenn ein Wort in der Eingabekette im Lexikon nicht gefunden
wird. Überprüfen Sie die Lexikon auf Fehler und nehmen Sie die notwendigen
Korrekturen vor, solange bis der Eingabesatz korrekt analysiert wird. Überprüfen
Sie auch den Satz John cried.
Grundsätzliches zur Syntax von PATR
Trennzeichen
Die einzelnen Elemente einer Grammatik (Schlüsselwörter, Symbole wie S, NP,
VP, der Pfeil -> etc.) müssen durch Leerzeilen, Leerzeichen, oder Tabulatoren
voneinander getrennt werden (engl. white space). Diese Trennzeichen werden
ansonsten aber ignoriert. Wenn man zwischen vor oder nach dem Pfeil -> das
Trennzeichen vergißt, wird es zum Bestandteil des vorangehenden oder nachfolgenden
Symbols: NP -> besteht aus den Symbolen NP und ->, NP-> hingegen ist
nur ein Symbol.
Kommentare
Textelemente, die nicht zur Grammatik selbst gehören, müssen syntaktisch als
Kommentare ausgewiesen sein. Dies kann auf zweierlei Weise geschehen:
- Einzeilige Kommentare werden durch ein Kommentarzeichen eingeleitet
und erstrecken sich nur über eine Zeile. Das Standard-Kommentarzeichen ist
das Semikolon (';'). Beispiel:
Rule S -> NP VP. ;der Punkt signalisiert das Ende einer
Regel.
- Mehrzeilige Kommentare sind entweder eine Folge von einzeiligen Kommentaren
oder ein mehrzeiliger Text, der durch das Schlüsselwort comment eingeleitet
wird. Der Geltungsbereich von comment reicht bis zum nächsten Schlüsselwort.
Beispiel:
Comment
Kommentare, die mit dem Schlüsselwort "comment" beginnen können
sich ohne zusätzliche syntaktische Mittel über mehrere Zeilen erstrecken.
Der Kommentar endet mit dem nächsten Schlüsselwort (außer comment selbst
natürlich).
End ;"End" ist ein Schlüsselwort, alles was auf
"End" folgt wird ignoriert.
Regeln
Eine Grammatik-Regel in PC-PATR ohne Merkmalsgleichungen (dazu später
mehr), besteht aus folgenden Teilen (in der angegebenen Reihenfolge):
- dem Schlüsselwort Rule
- einem optionalen Regelnamen, der in geschweifte Klammern eingeschlossen
wird ({})
- einer Phrasenstruktur-Regel aus folgenden Elementen:
- dem zu expandierenden nicht-terminalen Symbol als Kopf (z.B. NP)
- einem Pfeil (->) oder Gleichheitszeichen (=)
- dem Rumpf, der entweder leer ist oder aus einem oder mehreren terminalen
oder nicht-terminalen Symbolen besteht, die ggf. als alternative oder optionale
Konstituenten markiert sind
- einem optionalen Doppelpunkt (:), der nur zu stehen braucht, wenn Merkmalsgleichungen
folgen;
- einem optionalen Punkt (.)
- Hinweis:
-
Benutzen
Sie die Hilfefunktion von WinPatr. Sie beinhaltet das gesamte WinPatr-Handbuch
und bezieht sich nicht nur auf rein technische Aspekte.
Semantikfehler
Unvollständiges Lexikon
Wenn sich ein Satz bei vermutlich
fehlerfreier und vollständiger Grammatik nicht analysieren läßt, dann muss es
am Lexikon liegen. Ein häufiger Fehler ist, daß das Lexikon, so wie es nach
dem Einlesen der Lexikondatei dem Programm verfügbar ist, unvollständig
ist. In diesem Fall wird bei einem Analyseversuch eine Fehlermeldung angezeigt.
Dafür kann es zwei Gründe geben:
- Der Lexikoneintrag fehlt tatsächlich, ist also in der Lexikondatei nicht
vorhanden. In diesem Fall muss er entsprechend ergänzt werden.
- Die Lexikondatei ist syntaktisch fehlerhaft (Schrägstrich (slash)
/ statt "Backslash" (\), oder falsche Markierungen (z.B. \l oder
etwas anderes statt \w oder \c). Dann müssen diese Fehler beseitigt werden.
Das Lexikon kann aber auch "semantisch" falsch sein, insofern beispielsweise
die Wörter falschen Kategrien zugeordnet werden. Der folgende Lexikoneintrag
ist vermutlich falsch (boy kann normalerweise nicht als Verb verwendet
werden):
\w boy
\c V
Leider sind solche Fehler nur dadurch erkennbar, das gar nichts mehr geht.
Was dann zu tun ist, soll im folgenden gezeigt werden.
Fehlerhafte Grammatik
Wenn die Grammatik (inklsive Lexikon) fehlerhaft ist, dann scheitert die Analyse
der zu beschreibenden Ausgangsdaten oder liefert falsche Beschreibungen. Das
kann folgende Gründe haben:
- die Grammatik ist unvollständig
- die Grammatik enthält falsche Regeln
- Grammatik und Lexikon harmonieren nicht
Das Programm ist so voreingestellt,
dass nur dann ein Ergebnis angezeigt wird, wenn es wenigstens eine erfolgreiche
Analyse gibt. Das ist natürlich für die Fehlersuche nicht besonders hilfreich.
Man kann diese Einstellung jedoch ändern.
Wählen Sie im Menü Settings die Option Program Variables. In
der sich öffnenden Karteikarte aktivieren Sie die Option Partial Results
for Failures. Das bewirkt, dass bei einem Scheitern der Analyse zumindest
die bisher erreichten Zwischenergebnisse angezeigt werden, was ggf. wichtige
Hinweise für die Verbesserung der Grammatik liefert.
Wir wollen im folgenden diese drei Punkte im Detail abhandeln. Wir verwenden
dabei eine als korrekt angenommene Lexikondatei, die im wesentlichen der der
Hausaufgabe entspricht.
1. Die Grammatik ist unvollständig
- Schritt 1.
- Öffnen Sie die Lexikondatei f02.lex in WinPatr (File ® Load Lexicon)
und die rudimentäre Grammatikdatei f02.grm.
- Schritt 2.
- Versuchen Sie mit dieser Grammatik den Satz the boy gave the girl a present
zu analysieren.
Sie erhalten ein partielles Analyseergebnis, das auch einen Hinweis
darauf gibt, wie das Programm arbeitet. Die Wörter in der Eingabekette werden
mit Informationen aus dem Lexikon identifiziert und lexikalischen Kategorien
zugeordnet. Das Programm versucht dann, Wortgruppen zu Konstituenten zusammenzufassen
und syntaktischen Kategorien (NP, VP) zuzuweisen, findet dafür aber keine geeigneten
Regeln in der Grammatik; daher das Fragezeichen.
- Schritt 3.
- Ergänzen Sie zunächst die Grammatik um eine Regel für NP, die Det und N
zu einer Kategorie zusammenfaßt. Analysieren Sie jetzt den gleichen Satz mit
der erweiterten Grammatik.
Das Ergebnis sieht jetzt schon sehr viel besser aus. Es wird jedoch die Beziehung
zwischen dem Verb und seinen Ergänzungen noch nicht ausgedrückt, wir brauchen
also eine Regel, die das Verb (hier Vt2) und seine beiden Objekte zu einer Konstituente
(VP) zusammenfaßt.
- Schritt 4.
- Ergänzen Sie die Grammatik um diese Regel und analysieren Sie den gleichen
Satz erneut.
Siehe da! Der Satz kann jetzt vollständig analysiert werden.
2. Die Grammatik enthält falsche Regeln
Falsche Regeln führen nicht unbedingt dazu, dass die Analyse scheitert, sondern
ergeben meist eine falsche Strukturbeschreibung. Falsche Regeln, die bei unseren
Daten ein Scheitern herbeiführen würden, wären z.B.
Rule VP -> Vtp PP NP ; die Reihenfolge von PP und NP ist falsch
Rule Vp -> Vi ; das Symbol Vp ist falsch und muss zu VP korrigert
; werden
- Wichtiges Grundprinzip:
- Eine korrekte Grammatik muss alle grammatischen Sätze erfassen und
alle ungrammatischen ausschließen. Wenn Sie eine Grammatik erstellt
haben, muss diese zunächst an allen Ausgangsdaten überprüft werden.
Bei vielen Daten wäre es eine lästige Angelegenheit, die zu analysierenden
Daten immer wieder neu eingeben zu müssen. Das Programm WinPatr bietet daher
eine Möglichkeit, Sätze in einem ‘Stapel’ zu verarbeiten. Dazu muss eine Textdatei
angelegt werden, in der alle zu analysierenden Sätze enthalten sind:
- Schritt 5.
- Öffnen Sie die Grammatik G4(f04.grm, f04.lex), die der Lösung der Hausaufgabe
entspricht.
- Schritt 6.
- Erstellen Sie im Editor eine Satz-Datei mit den Ausgangsdaten für die Hausaufgabe
und speichern Sie diese unter dem Namen f04.sen ab:
the boy ran
the boy admired the girl
*the boy admired
the student put the book on the table
*the student put the book
*the student put on the table
*the student put
Mary gave John a present
*Mary gave John
?Mary gave a present
*Mary gave
the professor lived in a village
*the professor lived
- Achtung:
-
In
der Satzdatei müssen die Markierungen für ungrammatische ('*') und fragwürdige
Sätze ('?') natürlich fehlen!
- Schritt 7.
Der Befehl Parse File
bietet die Möglichkeit, eine Liste von Sätzen, die in einer separaten Satzdatei
enthalten sind, mit einem Befehl zu analysieren und sie in eine Ergebnisdatei
abzuspeichern. Wählt man den Menüpunkt Parse File öffnet sich das Fenster
zum Öffnen von Dateien, wobei allerdings nur Sentence files mit der
Dateityp-Erweiterung .sen gewählt werden können. Wählen Sie die Datei
f04.sen aus.
- Eine Satzdatei besteht wie gesagt aus einer Liste von Sätzen, die jeweils
auf einer Zeile stehen müssen. Wie bei den Grammatik- und Lexikondateien handelt
es sich um reine Textdateien.
- Hat man eine Satzdatei ausgewählt, öffnet sich sofort erneut das Dialogfenster
zum Öffnen von Dateien.
Diesmal geht es darum, den
Namen einer Datei zu bestimmen, in die die Analyseergebnisse ausgegeben werden
sollen. Es handelt sich ebenfalls um reine Textdateien. Die Standard-Dateityp-Erweiterung
ist .par.
- Geben Sie als Namen f04.par an. Es handelt sich hierbei um eine sog. Stapelverarbeitung:
die Sätze in der Satzdatei werden nacheinander analysiert, und die Analyseergebnisse
– falls erfolgreich – werden nacheinander in die Ausgabedatei (z.B. f04.par)
geschrieben. Es ergolgt keine Ausgabe auf dem Bildschirm!
- Sehr wichtig:
-
Im
Gegensatz zur interaktiven Analyse wird bei der Stapelverarbeitung auch
protokolliert, warum eine Analyse fehlgeschlagen ist.
- Schritt 8.
- Öffnen Sie im Editor die soeben von WinPatr erzeugte Analysedatei f04.par
und sehen Sie sich das Ergebnis genau an.
3. Grammatik und Lexikon harmonieren nicht
- Schritt 9.
- Öffnen Sie die Grammatik G(f03.grm, f02.grm) in WinPatr und versuchen Sie,
bei gleichbleibendem Lexikon, unseren Beispielsatz zu analysieren. Sie werden
feststellen, dass die Analyse wieder scheitert. Es werden offensichtlich keine
Regeln für die VP gefunden. Ist wirklich keine vorhanden? Überprüfen Sie das!
- Lexikon und Grammatik stehen über die terminalen Symbole in den Regeln einerseits
und den Angaben über die lexikalischen Kategorien (im Feld \c im Lexikon)
miteinander in Beziehung. Terminale Symbole sind solche, die nur auf der rechten
Seite einer Regel vorkommen und für die es daher keine syntaktischen Regeln
gibt, die sie weiter expandieren. In unserer Beispielgrammatik sind also Name,
Det, N, V, P terminale Symbole. Terminale Symbole in den Grammatikregeln und
lexikalische Kategorien in den Lexikoneinträgen müssen korrespondieren und
sich entweder direkt entsprechen oder durch besondere lexikalische Regeln
miteinander in Beziehung gesetzt werden. Dazu später mehr, wenn es um Merkmalstrukturen
geht.