|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--LingDaten
Die Klasse LingDaten ist eine der beiden Hauptklassen des Projektes (die andere ist ShiftReduceParser).
Hier werden alle linguistischen Daten gespeichert:
ShiftReduceParser
,
erzeugeTabellen()
,
erzeugeZustaende()
Field Summary | |
java.lang.String[][] |
aktionstabelle
Aktionstabelle, die durch die Methode 'erzeugeTabellen' erzeugt wird. |
private java.util.Vector |
first
Liste der First-Mengen. |
private java.util.Vector |
follow
Liste der Follow-Mengen. |
java.lang.String[][] |
grammatik
formatierte Grammatik: aus der Grammatik, wie sie im Eingabefeld auf dem Bildschirm erscheint (Attribut 'guigrammatik'), wird durch Zergliederung in einzelne Zeilen (Trennzeichen ist das Zeilenende) eine Liste von Regeln erzeugt. |
(package private) java.lang.String |
guigrammatik
Grammatik, wie sie im Eingabefeld auf dem Bildschirm erscheint |
(package private) java.lang.String |
guilexikon
Lexikon, wie es im Eingabefeld auf dem Bildschirm erscheint |
(package private) java.lang.String |
guisatz
Satz, wie er im Eingabefeld auf dem Bildschirm erscheint |
java.lang.String[][] |
lexikon
formatiertes Lexikon: aus dem Lexikon, wie es im Eingabefeld auf dem Bildschirm erscheint (Attribut 'guilexikon'), wird durch Zergliederung in einzelne Zeilen (Trennzeichen ist das Zeilenende) eine Liste von Lexikoneinträgen erzeugt. |
private static java.lang.String |
punkt
Konstante, die einem Punkt-String entspricht (".") |
java.lang.String[] |
satz
formatierter Satz: aus dem Satz, wie er im Eingabefeld auf dem Bildschirm erscheint (Attribut 'guisatz'), wird durch Zergliederung in einzelne Wörter (Trennzeichen sind Leerzeichen, Komma etc.) eine Liste der Wörter erzeugt. |
java.lang.String[][] |
sprungtabelle
Sprungtabelle, die durch die Methode 'erzeugeTabellen' erzeugt wird. |
private java.lang.String |
startsymbol
Startsymbol der Grammatik. |
java.util.Vector |
zustand
Liste der erzeugten Zustände. |
Constructor Summary | |
LingDaten(java.lang.String psatz,
java.lang.String plexikon,
java.lang.String pgrammatik)
neues linguistisches Datenobjekt erzeugen. |
Method Summary | |
private boolean |
aehnlicheRegelVorhanden(java.lang.String[] punktregel,
java.util.Vector aktuellerZustand)
prüfe ob eine zur übergebene Punktregel ähnlichen Punktregel im übergebenen Zustand bereits enthalten ist oder nicht. |
void |
aktualisiereSatz(java.lang.String pguisatz)
Diese Methode übernimmt und formatiert den als Parameter übergebenen Eingabesatz vom Bildschirm. |
private void |
erzeugeAktionsGotoReduceTabellen()
Erzeugung der Aktions- und Sprungtabelle. |
void |
erzeugeTabellen()
Diese Methode ist die wichtigste Methode (Haupteinstiegspunkt von außen). |
private void |
erzeugeZustaende()
Diese Methode erzeugt aus der Grammatik eine Menge von Zuständen, die wiederrum aus einer Liste von Punktregeln besteht. |
private void |
expandiereNichtterminal(java.lang.String nichtTerminal,
int aktuellerZustand,
java.util.Vector firstzeileOberknoten,
java.util.Vector followzeileOberknoten)
Diese Methode führt die Operation der Expansion eines Nichtterminals in einem Zustand durch. |
void |
formatiereDaten()
Diese Methode formatiert den Eingabesatz, sowie Lexikon und Grammatik im Eingabebereich, die vorher im Konstruktor gesetzt wurden. |
private boolean |
fuegeRegelHinzu(int regelnr,
java.util.Vector aktuellerZustand)
Regel aus der Grammatik als Punktregel in einen Zustand aufnehmen, jedoch nur, wenn diese Punktregel noch nicht dort vorhanden ist. |
private void |
fuegeZuFirstHinzu(java.util.Vector firstzeile,
java.lang.String symbol)
Ein Symbol der First-Menge, die übergeben wird, hinzufügen. |
private void |
fuegeZuFirstVonFollowHinzu(java.util.Vector firstVonFollow,
java.util.Vector firstzeile)
Hilfsmethode: Fügt den Inhalt (d.h. die Symbole) einer First-Menge der übergegebenen Menge First(Follow(symbol)) hinzu (repräsentiert durch einen Vector). |
private boolean |
fuegeZuFollowHinzu(java.lang.String followsymbol,
java.lang.String symbol)
Ein Symbol der Follow-Menge, die übergeben wird, hinzufügen. |
private boolean |
gleich(java.lang.String[] punktregel,
java.lang.String[] grammatikregel)
Hilfsmethode: prüft, ob eine Punktregel gleich einer Regel der Grammatik ist (ohne Berücksichtigung des Punktes) |
java.lang.String |
holeZustandsliste()
Service-Methode für das Applet: listet alle Zustände auf und gibt diese Liste in Form eines einzigen Strings zurück. |
private java.util.Vector |
neueFollowzeile(java.lang.String nichtTerminal)
Eine neue Follow-Menge für das übergebene Nichtterminal übergeben, wenn es noch keine Follow-Menge für dieses gibt. |
void |
raeumeAuf()
Diese Methode räumt das Datenobjekt auf. |
private boolean |
regelNichtVorhanden(java.lang.String[] punktregel,
java.util.Vector aktuellerZustand)
prüfe ob die übergebene Punktregel im übergebenen Zustand bereits enthalten ist oder nicht. |
private void |
rueckePunktVor(java.lang.String[] punktregel,
java.util.Vector aktuellerZustand)
Diese Methode führt die Operation des Weiterrückens des Punktes innerhalb einer Punktregel durch. |
private void |
schreibeGoto(int zust,
java.lang.String symbol,
int nrPunktregel)
Für einen gegebenen Zustand und eine gegebene Punktzeile, schreibe eine Goto-Aktion für das übergebene Symbol in die Sprungtabelle. |
private void |
schreibeReduce(int zust,
java.lang.String symbol,
int nrPunktregel)
Für einen gegebenen Zustand und eine gegebene Punktzeile, schreibe eine Reduce-Aktion für das übergebene Symbol in die Aktionstabelle. |
private void |
schreibeShift(int zust,
java.lang.String symbol,
int nrPunktregel)
Für einen gegebenen Zustand und eine gegebene Punktzeile, schreibe eine Shift-Aktion für das übergebene Symbol in die Aktionstabelle. |
private void |
schreibeShiftGotoReduce(java.lang.String[] zeile,
int zustand,
int nrPunktregel)
Für einen gegebenen Zustand und eine gegebene Punktzeile, schreibe eines der möglichen Aktionen Shift, Goto oder Reduce in die Aktions- oder Sprungtabelle. |
int |
sucheEingabesymbolInAktionstabelle(java.lang.String symbol)
Service-Methode für den Parser: gibt die Spalte der Aktionstabelle zurück, in deren Überschrift sich das übergebene Symbol befindet. |
int |
sucheSymbolInSprungtabelle(java.lang.String symbol)
Service-Methode für den Parser: gibt die Spalte der Sprungtabelle zurück, in deren Überschrift sich das übergebene Symbol befindet. |
private boolean |
symbolInListe(java.util.Vector liste,
java.lang.String symbol)
Hilfsmethode: prüft, ob das übergebene Symbol in der Liste (Vector) enthalten ist oder nicht. |
private boolean |
uebernehmeFollow(java.lang.String linkesSymbol,
java.lang.String symbol)
Bei der Vervollständigung der Follow-Menge müssen die Symbole der Follow-Menge des Vaterknotens in die Follow-Menge des Kindknotens übernommen werden, jedoch nur diejenigen, die noch nicht vorhanden sind (Duplikat-Filterung). |
private void |
vervollstaendigeFollow()
Beim Aufbau der Zustandsliste wird die Follow-Menge nicht komplett erzeugt: nur die rechts in der Produktion stehenden Symbole, denen ein weiteres Symbol folgt, werden dort aufgenommen. |
private void |
zustaendeAusgeben()
Hilfsmethode (für Testzwecke): gibt alle Zustände auf Standard out aus. |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
java.lang.String guisatz
java.lang.String guilexikon
java.lang.String guigrammatik
public java.lang.String[] satz
guisatz
public java.lang.String[][] lexikon
Das erste Symbol eines Lexikoneintrags ist immer das Terminalsymbol, dass den Schlüssel des Lexikoneintrags darstellt.
guilexikon
public java.lang.String[][] grammatik
Das erste Symbol einer Regel ist immer das Regelsymbol, dass die Nummer der Regel repräsentiert.
guigrammatik
public java.util.Vector zustand
Jeder Zustand selbst besteht wiederrum aus einem Kopfelement gefolgt einer Liste (Vector) von sogenannten "Punktregeln", d.h. Regeln der Grammatik mit einem Punkt vor dem in dem Zustand zu lesenden Symbol (Terminal oder Nichtterminal). Im Kopfelement ist das erste Symbol der Zustandsname. Danach folgen, in der Reihenfolge der Punktregeln, die Folgezustände, wenn das Symbol an der Position hinter dem Punkt gelesen wird (Shift oder Goto).
erzeugeZustaende()
private static final java.lang.String punkt
private java.lang.String startsymbol
public java.lang.String[][] aktionstabelle
Die erste Zeile der Tabelle enthält immer die Liste der Terminalsymbole, für die diese Aktion gelten soll. Der Parser kann aufgrund dieser Kopfzeile die Spalte bestimmen, die für das aktuelle Symbol der Eingabe gelesen werden soll.
Wenn eine Grammatik eindeutig ist, steht in jedem Feld der Aktionstabelle immer nur eine Aktion. Ist die Grammatik nicht mehrdeutig, können in einem Feld mehrere Aktionen stehen.
public java.lang.String[][] sprungtabelle
Die erste Zeile der Tabelle enthält immer die Liste der Nichtterminalsymbole, für die diese Aktion gelten soll. Der Parser kann aufgrund dieser Kopfzeile die Spalte bestimmen, die für das aktuelle Symbol (nach einer Reduktion) gelesen werden soll.
Wenn eine Grammatik eindeutig ist, steht in jedem Feld der Aktionstabelle immer nur eine Aktion. Ist die Grammatik nicht mehrdeutig, können in einem Feld mehrere Aktionen (Goto-Aktionen) stehen.
private java.util.Vector first
Diese Menge wird berechnet, indem das First-Symbol solange gemäß der Grammatikregeln expandiert wird, bis man auf Ebene der Terminale angekommen ist. First-Symbole sind die an erster Stelle kommenden Terminale der angewendeten Produktionen.
Beispiel: sei NP -> n vt n
eine Regel der Grammatik. Dann ist First(NP) = {n}
private java.util.Vector follow
Diese Menge besteht aus:
1. allen Symbolen, die dem Follow-Symbol aufgrund der Grammatik folgen können. Hierbei handelt es sich um Punktregeln, bei denen der Punkt zwischen zwei Symbolen steht, wobei das erste Symbol das Follow-Symbol ist.
Beispiel: sei S -> NP . VP
eine Punktregel. Dann ist Follow(NP) = {VP}
2. allen Symbolen, die in der Follow-Menge des Elternknotens
der Produktion der Grammatik stehen, wobei das letzte Symbol
der Produktion das Follow-Symbol ist. Also:
Follow(Follow-Symbol) = Follow(Elternknoten)
Beispiel: sei S -> NP VP . und Follow(S) = {präp, $}
dann ist Follow(VP) = {präp, $}, da die Followmenge
des Elternknotens quasi kopiert wird.
Constructor Detail |
public LingDaten(java.lang.String psatz, java.lang.String plexikon, java.lang.String pgrammatik)
psatz
- Satz, wie er im Eingabefeld auf dem Bildschirm
erscheintplexikon
- Lexikon, wie es im Eingabefeld auf dem
Bildschirm erscheintpgrammatik
- Grammatik, wie sie im Eingabefeld auf
dem Bildschirm erscheintformatiereDaten()
Method Detail |
public void raeumeAuf()
public void aktualisiereSatz(java.lang.String pguisatz)
Dies hat dieselbe Funktion wie der Konstruktur und anschliessender Aufruf der Methode 'formatiereDaten', jedoch bezieht sich diese Methode nur auf den Satz. Diese Methode wird aufgerufen, wenn der Benutzer lediglich den Eingabesatz ändert, nicht aber Lexikon oder Grammatik.
pguisatz
- Satz, wie er im Eingabefeld auf dem Bildschirm
erscheintformatiereDaten()
,
LingDaten(String,String,String)
public void formatiereDaten()
Formatierung bedeutet, dass die lediglich im Stringformat vorhandenen Daten (Attribute 'guisatz', 'guilexikon', 'guigrammatik') in ein formatiertes Format gebracht werden (Attribute 'satz', 'lexikon', 'grammatik').
Siehe weitere Dokumentation bei den Attributen.
guisatz
,
guilexikon
,
guigrammatik
,
satz
,
lexikon
,
grammatik
public void erzeugeTabellen()
Die Methode ist High-Level und bedient sich weiterer Methoden zur Erledigung ihrer Aufgaben:
first
,
follow
,
erzeugeZustaende()
,
vervollstaendigeFollow()
,
lexikon
,
erzeugeAktionsGotoReduceTabellen()
private void erzeugeZustaende()
Diese Methode wird von Methode 'erzeugeTabellen' zuerst aufgerufen, bevor die Tabellengenerierung aufgerufen wird. Dies ist notwendig, da die Tabellengenerierung auf der Zustandsliste basiert.
Ablauf der Methode:
Am Ende der Methode werden auf Standard-Out noch die Zustände textuell ausgegeben, aus Testgründen.
zustand
,
erzeugeTabellen()
,
erzeugeAktionsGotoReduceTabellen()
,
expandiereNichtterminal(String,int,Vector,Vector)
,
rueckePunktVor(String[],Vector)
private void rueckePunktVor(java.lang.String[] punktregel, java.util.Vector aktuellerZustand)
Nach Weiterrücken des Punktes (dies erzeugt quasi eine neue Punktregel) gibt es 3 Möglichkeiten:
Diese Methode wird verwendet von der Methode 'erzeugeZustaende' (siehe weiteres dort).
Die Methode sorgt ferner noch dafür, dass eine hinzugefügte Punktregel in dem entsprechenden Zustand auch noch expandiert wird (Aufruf der Methode 'expandiereNichtterminal').
punktregel
- Punktregel, auf die die Operation
des Weiterrückens des Punktes angewendet werden sollaktuellerZustand
- Zustand, der diese Punktregel
enthält (Parameter punktregel)zustand
,
erzeugeZustaende()
,
expandiereNichtterminal(String,int,Vector,Vector)
private void expandiereNichtterminal(java.lang.String nichtTerminal, int aktuellerZustand, java.util.Vector firstzeileOberknoten, java.util.Vector followzeileOberknoten)
Die Expansion geschieht anhand der vorhandenen Regeln der Grammatik und rekursiv. Rekursiv deshalb, weil das Nichtterminal auch in mehreren Stufen expandiert werden kann, bis es auf Ebene der Terminale "ankommt".
Ablauf der Methode:
nichtTerminal
- Nichtterminal, das expandiert
werden sollaktuellerZustand
- Zustand, in dem die Expansion
durchgeführt werden sollfirstzeileOberknoten
- bezeichnet die First-Menge
des Vaterknotens (Symbol auf der linken Seite, wobei das
aktuelle Nichtterminal rechts steht)followzeileOberknoten
- entsprechend Follow-Menge
des Vaterknotensfirst
,
follow
private void fuegeZuFirstHinzu(java.util.Vector firstzeile, java.lang.String symbol)
firstzeile
- First-Menge, zu der das
Symbol hinzugefügt werden sollsymbol
- Hinzuzufügendes Symbol (Terminal)first
private java.util.Vector neueFollowzeile(java.lang.String nichtTerminal)
nichtTerminal
- Nichtterminal, für das
die Follow-Menge entweder bestimmt oder neu erzeugt
werden sollfollow
private boolean fuegeZuFollowHinzu(java.lang.String followsymbol, java.lang.String symbol)
followsymbol
- Follow-Symbol, zu dessen
Follow-Menge das Symbol hinzugefügt werden sollsymbol
- Hinzuzufügendes Symbol (Terminal
oder Nichtterminal)first
private void vervollstaendigeFollow()
Follow(Kind) = Follow(Vater)
Aufruf der Methode von der Methode 'erzeugeTabellen' aus.
follow
,
erzeugeTabellen()
private boolean uebernehmeFollow(java.lang.String linkesSymbol, java.lang.String symbol)
Aufruf der Methode in 'vervollstaendigeFollow'.
linkesSymbol
- Vaterknoten, von dessen Follow-Menge
übernommen werden sollsymbol
- Kindknoten, zu dessen Follow-Menge
hinzugefügt werden sollfollow
,
vervollstaendigeFollow()
private boolean fuegeRegelHinzu(int regelnr, java.util.Vector aktuellerZustand)
Aufruf der Methode von 'expandiereNichtterminal' aus.
regelnr
- Nummer der Regel der Grammatik,
die als Punktregel aufgenommen werden sollaktuellerZustand
- aktueller Zustand,
zu dem die Punktregel hinzugefügt werden sollexpandiereNichtterminal(String,int,Vector,Vector)
private boolean regelNichtVorhanden(java.lang.String[] punktregel, java.util.Vector aktuellerZustand)
Aufruf der Methode von 'fuegeRegelHinzu' aus.
punktregel
- Punktregel,
die überprüft werden sollaktuellerZustand
- aktueller Zustand,
für den überprüft werden soll, ob die Punktregel
dort vorhanden istfuegeRegelHinzu(int,Vector)
private boolean aehnlicheRegelVorhanden(java.lang.String[] punktregel, java.util.Vector aktuellerZustand)
Aufruf der Methode von 'rueckePunktVor' aus.
punktregel
- Punktregel,
die überprüft werden sollaktuellerZustand
- aktueller Zustand,
für den überprüft werden soll, ob eine ähnliche Punktregel
dort bereits vorhanden istrueckePunktVor(String[],Vector)
private void erzeugeAktionsGotoReduceTabellen()
Nach Ablauf einer Initialisierung (Reservierung der Tabellen, sowie schreiben der Kopfzeilen der Tabellen) erfolgt die Generierungsschleife: die äußere Schleife iteriert über die Zustände, die innere Schleife über die Punktregeln des aktuellen Zustands (der durch die äußere Schleife bestimmt wird). Für das Tripel aus Punktregel, Zustandsnummer und Nummer der Punktregel in diesem Zustand wird die Methode 'schreibeShiftGotoReduce' aufgerufen, die die tatsächliche Aktion bestimmt.
aktionstabelle
,
sprungtabelle
,
erzeugeTabellen()
,
schreibeShiftGotoReduce(String[],int,int)
private void schreibeShiftGotoReduce(java.lang.String[] zeile, int zustand, int nrPunktregel)
Die Methode steuert die verschiedenen Aktionstypen auseinander auf Basis folgender Überlegung:
zeile
- Punktregel,
die überprüft werden sollzustand
- aktueller Zustand,
in dem sich die Punktregel befindetnrPunktregel
- Nummer der Punktregel innerhalb
des aktuellen ZustandsschreibeGoto(int,String,int)
,
schreibeShift(int,String,int)
,
schreibeReduce(int,String,int)
private void schreibeShift(int zust, java.lang.String symbol, int nrPunktregel)
Ablauf:
1. Finden der Spaltennummer der Aktionstabelle, in der
das Symbol zu finden ist.
2. Bereitstellen der Nummer des Folgezustands (steht
im Kopfelement des aktuellen Zustands, siehe
Dokumentation des Attributs 'zustand').
3. Schreiben des Shift-Eintrags. Hierbei muss berücksichtigt
werden, dass bei Mehrdeutigkeit mehrere Einträge im Feld
der Tabelle möglich sind. Allerdings darf keine Aktion
doppelt geschrieben werden.
zust
- Nummer des aktuellen Zustands,
in dem sich die Punktregel befindetsymbol
- Symbol, das "geshiftet" werden soll,
d.h. dass als nächstes in der Eingabe stehen muss.nrPunktregel
- Nummer der Punktregel innerhalb
des aktuellen Zustandszustand
private void schreibeGoto(int zust, java.lang.String symbol, int nrPunktregel)
Ablauf:
1. Finden der Spaltennummer der Sprungtabelle, in der
das Symbol zu finden ist.
2. Bereitstellen der Nummer des Folgezustands (steht
im Kopfelement des aktuellen Zustands, siehe
Dokumentation des Attributs 'zustand').
3. Schreiben des Goto-Eintrags. Hierbei muss berücksichtigt
werden, dass bei Mehrdeutigkeit mehrere Einträge im Feld
der Tabelle möglich sind. Allerdings darf keine Aktion
doppelt geschrieben werden.
zust
- Nummer des aktuellen Zustands,
in dem sich die Punktregel befindetsymbol
- Symbol, für das "gesprungen" werden soll,
d.h. dass aktuell im Arbeitsbereich vorne steht und vor
dem der Punkt in der Punktregel stehtnrPunktregel
- Nummer der Punktregel innerhalb
des aktuellen Zustandszustand
private void schreibeReduce(int zust, java.lang.String symbol, int nrPunktregel)
Ablauf:
1. Initialisierung
2. Ermitteln der Menge First(Follow(symbol)): hierzu
wird zuerst die Follow-Menge des Symbols gefunden.
Danach wird für jedes Symbol der Follow-Menge die
First-Menge dieses Symbols der neuen Menge
First(Follow(symbol)) hinzugefügt. Hierbei müssen
aber noch Duplikate gefiltert werden.
3. Bestimmen der Regelnummer für die Punktregel anhand der
Grammatik
4. Schreiben von Reduce (Schritte 1. bis 3. waren
Voraussetzungen hierzu): für jedes Symbol der
Menge First(Follow(symbol)) wird die Aktion Reduce mit
der Regelnummer der Grammatik geschrieben.
Hierbei muss noch die Sonderregelgung für die Aktion
"acc" (accept) berücksichtigt werden.
zust
- Nummer des aktuellen Zustands,
in dem sich die Punktregel befindetsymbol
- Symbol, das reduziert, d.h.
das Reduktionssymbol, das auf der linken Seite
der Produktion steht.nrPunktregel
- Nummer der Punktregel innerhalb
des aktuellen Zustandsfirst
,
follow
,
grammatik
private boolean gleich(java.lang.String[] punktregel, java.lang.String[] grammatikregel)
punktregel
- Punktregel, die auf Gleichheit
geprüft werden sollgrammatikregel
- Regel der Grammatik, die auf
Gleichheit geprüft werden sollprivate void fuegeZuFirstVonFollowHinzu(java.util.Vector firstVonFollow, java.util.Vector firstzeile)
firstVonFollow
- First(Follow(symbol))-Menge,
zu der die Symbole hinzugefügt werden sollenfirstzeile
- First-Menge, deren Symbole
hinzugefügt werden sollenprivate boolean symbolInListe(java.util.Vector liste, java.lang.String symbol)
liste
- Liste von Symbolen, die geprüft werden
sollsymbol
- Symbol, dass auf Vorhandensein in der
Liste geprüft werden soll
private void zustaendeAusgeben()
public int sucheEingabesymbolInAktionstabelle(java.lang.String symbol)
symbol
- Symbol, dessen Spalte (aufgrund der
Überschrift) bestimmt werden soll
public int sucheSymbolInSprungtabelle(java.lang.String symbol)
symbol
- Symbol, dessen Spalte (aufgrund der
Überschrift) bestimmt werden soll
public java.lang.String holeZustandsliste()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |