Class LingDaten

java.lang.Object
  |
  +--LingDaten

public class LingDaten
extends java.lang.Object

Die Klasse LingDaten ist eine der beiden Hauptklassen des Projektes (die andere ist ShiftReduceParser).

Hier werden alle linguistischen Daten gespeichert:

Ferner werden mit der Methode 'erzeugeTabellen' aus Grammatik und Lexikon die Aktions- und Sprungtabelle erzeugt. Als Zwischenschritt dieser Erzeugung wird die Zustandsliste erzeugt (Untermethode erzeugeZustaende).

See Also:
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

guisatz

java.lang.String guisatz
Satz, wie er im Eingabefeld auf dem Bildschirm erscheint


guilexikon

java.lang.String guilexikon
Lexikon, wie es im Eingabefeld auf dem Bildschirm erscheint


guigrammatik

java.lang.String guigrammatik
Grammatik, wie sie im Eingabefeld auf dem Bildschirm erscheint


satz

public 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.

See Also:
guisatz

lexikon

public 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. Jede dieser Einträge wird selber erneut (wie beim Satz) in einzelne Wörter zerlegt.

Das erste Symbol eines Lexikoneintrags ist immer das Terminalsymbol, dass den Schlüssel des Lexikoneintrags darstellt.

See Also:
guilexikon

grammatik

public 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. Jede dieser Regeln wird selber erneut (wie beim Satz) in einzelne Wörter zerlegt.

Das erste Symbol einer Regel ist immer das Regelsymbol, dass die Nummer der Regel repräsentiert.

See Also:
guigrammatik

zustand

public java.util.Vector zustand
Liste der erzeugten Zustände. Diese Liste wird in der Methode 'erzeugeZustaende' erzeugt.

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).

See Also:
erzeugeZustaende()

punkt

private static final java.lang.String punkt
Konstante, die einem Punkt-String entspricht (".")


startsymbol

private java.lang.String startsymbol
Startsymbol der Grammatik. Das Startsymbol wird dadurch bestimmt, dass die erste Regel der Grammatik angeschaut wird. Das (Nichtterminal-)Symbol auf der linken Seite der Produktion wird als Startsymbol gesetzt.


aktionstabelle

public java.lang.String[][] aktionstabelle
Aktionstabelle, die durch die Methode 'erzeugeTabellen' erzeugt wird. Es handelt sich um ein 2-dimensionales Array von Feldern (Typ String). In jedem Feld kann ein oder mehrere Aktionen (wie shift oder reduce) gespeichert sein.

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.


sprungtabelle

public java.lang.String[][] sprungtabelle
Sprungtabelle, die durch die Methode 'erzeugeTabellen' erzeugt wird. Es handelt sich um ein 2-dimensionales Array von Feldern (Typ String). In jedem Feld kann ein oder mehrere Aktionen (nur goto) gespeichert sein.

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.


first

private java.util.Vector first
Liste der First-Mengen. Eine First-Menge besteht aus dem First-Symbol, sowie einer Menge aus Terminalen, die diesem First-Symbol zugeordnet sind.

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}


follow

private java.util.Vector follow
Liste der Follow-Mengen. Eine Follow-Menge besteht aus dem Follow-Symbol, sowie einer Menge aus Terminalen oder Nicht-Terminalen, die diesem Follow-Symbol zugeordnet sind.

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

LingDaten

public LingDaten(java.lang.String psatz,
                 java.lang.String plexikon,
                 java.lang.String pgrammatik)
neues linguistisches Datenobjekt erzeugen. Hierbei werden die linguistischen Eingabedaten vom Bildschirm übernommen. Sie können in der Folge von der Methode 'formatiereDaten' weiterverarbeitet werden.

Parameters:
psatz - Satz, wie er im Eingabefeld auf dem Bildschirm erscheint
plexikon - Lexikon, wie es im Eingabefeld auf dem Bildschirm erscheint
pgrammatik - Grammatik, wie sie im Eingabefeld auf dem Bildschirm erscheint
See Also:
formatiereDaten()
Method Detail

raeumeAuf

public void raeumeAuf()
Diese Methode räumt das Datenobjekt auf. Hiermit werden jedoch lediglich die Referenzen auf die Eingabedaten zurückgenommen. Dies wird dann benötigt, wenn ein begonnener Parsevorgang beendet ist bzw. der Parsevorgang abgebrochen wird. Ein Beispiel ist, dass der Benutzer den Knopf "Tabellen erzeugen" gedrückt hat. Hierdurch sollen die Eingabedaten erneut verarbeitet und die Tabellen erstellt werden.


aktualisiereSatz

public void aktualisiereSatz(java.lang.String pguisatz)
Diese Methode übernimmt und formatiert den als Parameter übergebenen Eingabesatz vom Bildschirm. Bei der Formatierung werden die lexikalischen Kategorien der Eingabewörter bestimmt.

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.

Parameters:
pguisatz - Satz, wie er im Eingabefeld auf dem Bildschirm erscheint
See Also:
formatiereDaten(), LingDaten(String,String,String)

formatiereDaten

public void formatiereDaten()
Diese Methode formatiert den Eingabesatz, sowie Lexikon und Grammatik im Eingabebereich, die vorher im Konstruktor gesetzt wurden.

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.

See Also:
guisatz, guilexikon, guigrammatik, satz, lexikon, grammatik

erzeugeTabellen

public void erzeugeTabellen()
Diese Methode ist die wichtigste Methode (Haupteinstiegspunkt von außen). Sie ermöglicht die Generierung der Aktions- und Sprungtabelle, wenn zuvor Eingabesatz, Lexikon und Grammatik gesetzt und formatiert sind.

Die Methode ist High-Level und bedient sich weiterer Methoden zur Erledigung ihrer Aufgaben:

Als erstes werden noch die Attribute 'first' und 'follow' initialisert. Siehe weitere Dokumentation bei den aufgerufenen Methoden.

See Also:
first, follow, erzeugeZustaende(), vervollstaendigeFollow(), lexikon, erzeugeAktionsGotoReduceTabellen()

erzeugeZustaende

private void erzeugeZustaende()
Diese Methode erzeugt aus der Grammatik eine Menge von Zuständen, die wiederrum aus einer Liste von Punktregeln besteht. Zur Datenstruktur siehe Dokumentation des Attributes 'zustand'.

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:

See Also:
zustand, erzeugeTabellen(), erzeugeAktionsGotoReduceTabellen(), expandiereNichtterminal(String,int,Vector,Vector), rueckePunktVor(String[],Vector)

rueckePunktVor

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. Zu diesem Zweck werden ihr als Parameter die Punktregel selbst und der aktuelle Zustand, in dem die Punktregel vorhanden ist, übergeben.

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').

Parameters:
punktregel - Punktregel, auf die die Operation des Weiterrückens des Punktes angewendet werden soll
aktuellerZustand - Zustand, der diese Punktregel enthält (Parameter punktregel)
See Also:
zustand, erzeugeZustaende(), expandiereNichtterminal(String,int,Vector,Vector)

expandiereNichtterminal

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. Parameter sind demzufolge das zu expandierende Nichtterminal und die Nummer des Zustands, in dem das Nichtterminal expandiert werden soll. 2 weitere Parameter werden für den Aufbau der First- und Follow-Mengen benötigt.

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:

Parameters:
nichtTerminal - Nichtterminal, das expandiert werden soll
aktuellerZustand - Zustand, in dem die Expansion durchgeführt werden soll
firstzeileOberknoten - bezeichnet die First-Menge des Vaterknotens (Symbol auf der linken Seite, wobei das aktuelle Nichtterminal rechts steht)
followzeileOberknoten - entsprechend Follow-Menge des Vaterknotens
See Also:
first, follow

fuegeZuFirstHinzu

private void fuegeZuFirstHinzu(java.util.Vector firstzeile,
                               java.lang.String symbol)
Ein Symbol der First-Menge, die übergeben wird, hinzufügen.

Parameters:
firstzeile - First-Menge, zu der das Symbol hinzugefügt werden soll
symbol - Hinzuzufügendes Symbol (Terminal)
See Also:
first

neueFollowzeile

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.

Parameters:
nichtTerminal - Nichtterminal, für das die Follow-Menge entweder bestimmt oder neu erzeugt werden soll
See Also:
follow

fuegeZuFollowHinzu

private boolean fuegeZuFollowHinzu(java.lang.String followsymbol,
                                   java.lang.String symbol)
Ein Symbol der Follow-Menge, die übergeben wird, hinzufügen.

Parameters:
followsymbol - Follow-Symbol, zu dessen Follow-Menge das Symbol hinzugefügt werden soll
symbol - Hinzuzufügendes Symbol (Terminal oder Nichtterminal)
See Also:
first

vervollstaendigeFollow

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. Daher wird in dieser Methode der Rest der Symbole hinzugefügt: es handelt sich um die Symbole am Ende einer Regel, die die Followmenge des Vaterknotens übernehmen:

Follow(Kind) = Follow(Vater)

Aufruf der Methode von der Methode 'erzeugeTabellen' aus.

See Also:
follow, erzeugeTabellen()

uebernehmeFollow

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). Dies leistet diese Methode.

Aufruf der Methode in 'vervollstaendigeFollow'.

Parameters:
linkesSymbol - Vaterknoten, von dessen Follow-Menge übernommen werden soll
symbol - Kindknoten, zu dessen Follow-Menge hinzugefügt werden soll
See Also:
follow, vervollstaendigeFollow()

fuegeRegelHinzu

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.

Aufruf der Methode von 'expandiereNichtterminal' aus.

Parameters:
regelnr - Nummer der Regel der Grammatik, die als Punktregel aufgenommen werden soll
aktuellerZustand - aktueller Zustand, zu dem die Punktregel hinzugefügt werden soll
See Also:
expandiereNichtterminal(String,int,Vector,Vector)

regelNichtVorhanden

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.

Aufruf der Methode von 'fuegeRegelHinzu' aus.

Parameters:
punktregel - Punktregel, die überprüft werden soll
aktuellerZustand - aktueller Zustand, für den überprüft werden soll, ob die Punktregel dort vorhanden ist
See Also:
fuegeRegelHinzu(int,Vector)

aehnlicheRegelVorhanden

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.

Aufruf der Methode von 'rueckePunktVor' aus.

Parameters:
punktregel - Punktregel, die überprüft werden soll
aktuellerZustand - aktueller Zustand, für den überprüft werden soll, ob eine ähnliche Punktregel dort bereits vorhanden ist
See Also:
rueckePunktVor(String[],Vector)

erzeugeAktionsGotoReduceTabellen

private void erzeugeAktionsGotoReduceTabellen()
Erzeugung der Aktions- und Sprungtabelle. Diese Methode wird von der Methode 'erzeugeTabellen' aufgerufen.

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.

See Also:
aktionstabelle, sprungtabelle, erzeugeTabellen(), schreibeShiftGotoReduce(String[],int,int)

schreibeShiftGotoReduce

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.

Die Methode steuert die verschiedenen Aktionstypen auseinander auf Basis folgender Überlegung:

Abhängig vom Ergebnis der Prüfung werden die Methoden 'schreibeGoto', 'schreibeShift' oder 'schreibeReduce' aufgerufen.

Parameters:
zeile - Punktregel, die überprüft werden soll
zustand - aktueller Zustand, in dem sich die Punktregel befindet
nrPunktregel - Nummer der Punktregel innerhalb des aktuellen Zustands
See Also:
schreibeGoto(int,String,int), schreibeShift(int,String,int), schreibeReduce(int,String,int)

schreibeShift

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. Das Symbol ist das Symbol der Punktregel, welches hinter dem Punkt steht.

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.

Parameters:
zust - Nummer des aktuellen Zustands, in dem sich die Punktregel befindet
symbol - Symbol, das "geshiftet" werden soll, d.h. dass als nächstes in der Eingabe stehen muss.
nrPunktregel - Nummer der Punktregel innerhalb des aktuellen Zustands
See Also:
zustand

schreibeGoto

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. Das Symbol ist das Symbol der Punktregel, welches hinter dem Punkt steht.

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.

Parameters:
zust - Nummer des aktuellen Zustands, in dem sich die Punktregel befindet
symbol - Symbol, für das "gesprungen" werden soll, d.h. dass aktuell im Arbeitsbereich vorne steht und vor dem der Punkt in der Punktregel steht
nrPunktregel - Nummer der Punktregel innerhalb des aktuellen Zustands
See Also:
zustand

schreibeReduce

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. Das Symbol ist das Symbol auf der linken Seite der Punktregel (Produktion).

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.

Parameters:
zust - Nummer des aktuellen Zustands, in dem sich die Punktregel befindet
symbol - Symbol, das reduziert, d.h. das Reduktionssymbol, das auf der linken Seite der Produktion steht.
nrPunktregel - Nummer der Punktregel innerhalb des aktuellen Zustands
See Also:
first, follow, grammatik

gleich

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)

Parameters:
punktregel - Punktregel, die auf Gleichheit geprüft werden soll
grammatikregel - Regel der Grammatik, die auf Gleichheit geprüft werden soll

fuegeZuFirstVonFollowHinzu

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). Hierbei werden Duplikate gefiltert.

Parameters:
firstVonFollow - First(Follow(symbol))-Menge, zu der die Symbole hinzugefügt werden sollen
firstzeile - First-Menge, deren Symbole hinzugefügt werden sollen

symbolInListe

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.

Parameters:
liste - Liste von Symbolen, die geprüft werden soll
symbol - Symbol, dass auf Vorhandensein in der Liste geprüft werden soll
Returns:
Ergebnis der Prüfung: wahr, wenn Symbol in der Liste enthalten ist

zustaendeAusgeben

private void zustaendeAusgeben()
Hilfsmethode (für Testzwecke): gibt alle Zustände auf Standard out aus.


sucheEingabesymbolInAktionstabelle

public 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.

Parameters:
symbol - Symbol, dessen Spalte (aufgrund der Überschrift) bestimmt werden soll
Returns:
Spalte, deren Überschrift das Symbol enthält. -1, wenn nicht gefunden.

sucheSymbolInSprungtabelle

public 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.

Parameters:
symbol - Symbol, dessen Spalte (aufgrund der Überschrift) bestimmt werden soll
Returns:
Spalte, deren Überschrift das Symbol enthält. -1, wenn nicht gefunden.

holeZustandsliste

public 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. Dieser kann dann in einem Fenster ausgegeben werden.

Returns:
Text als Liste aller Zustände