Suche Home Einstellungen Anmelden Hilfe  

2.1 Algorithmus (nach Aho/Ullman (1972: s303f))

Eingabe:

    eine kontextfreie Grammatik G = (N,T, P, S) ohne Zyklen und epsilon-Regeln
    und ein Eingabewort w = x1x2 · · · xn mit n > 0.
    Die Produktionen in P sind nummeriert 1, 2, . . . , p.

Ausgabe: Rechtsparse, wenn existent, sonst "Fehler"

Methode:

  1. Ordne die Regeln willkürlich.
  2. Eine Konfiguration wird durch das 4-Tupel (s, i, L1, L2) beschrieben: mit:
    1. s: Zustand des Algorithmus. Der Algorithmus kann sich in den Zuständen q (normaler Modus), b (Backtracking) oder t (Terminiert) befinden.
    2. i: Position des Eingabezeigers. An der Position n+1 sollte der rechte Rand des Wortes durch $ markiert sein.
    3. L1: die erste push-down-Liste enthält Elemente (N union T)*, mit denen der Wortteil links vom Eingabezeiger abgeleitet werden kann. Der Kopf der Liste befindet sich rechts. Sie verhält sich wie ein Keller.
    4. L2: die zweite push-down-Liste (L2), in der die Reduktionen und Shift-Operationen vermerkt werden, die von der bisherigen Eingabe zur in L1 festgehaltenen Rechtsatzform geführt haben. Der Kopf dieser Liste befindet sich links.
  3. Die Ausgangskonfiguration ist (q, 1, $, epsilon).
  4. Der Algorithmus selbst unterteilt sich in 5 Schritte. Beginnend bei Schritt 1 wird der passende Übergang ausgesucht.
    Schritt 1: Versuch der Reduktion
    (q, i, L1w1, L2) |- (q, i, L1A, jL2), wenn die Regel A can be replaced byw1 die j-te Regel in P ist und die erste rechte Regelseite (nach der Ordnung unter Punkt 1), die einen Suffix von L1 bildet.
    Konnte Schritt 1 angewendet werden, gehe zu Schritt 1, sonst zu Schritt 2.
    Schritt 2: Shift
    (q, i, L1, L2) |- (q, i + 1, L1a, sL2), wenn iungleich n + 1. Falls i = n + 1 gehe zu Schritt 3.
    Das aktuelle Eingabesymbol wird in den Keller geschoben. Dieser "shift" wird durch ein "s" in der Parselist vermerkt. Wenn Schritt 2 ausgeführt werden konnte, gehe zu Schritt 1.
    Schritt 3: Akzeptieren
    (q, n+1, $S, ) |- (t, n+1, $S, gamma); Ausgabe von h(gamma), wobei h(s) = epsilon und h(j) = j. h(gamma) ist ein umgekehrter Rechtsparse von w.
    Halte an.
    Konnte Schritt 3 nicht angewendet werden, gehe zu Schritt 4.
    Schritt 4: Übergang in den Backtrackmodus
    (q, n+1, L1, L2) |- (b, n+1, L1, L2) vorausgesetzt L1ungleich $S (dann könnte im Schritt 3 akzeptiert werden). Gehe zu Schritt 5.
    Schritt 5: Backtracking
    Vier mögliche Übergänge gibt es im Backtrackmodus.
    1. Alternative Reduktion: (b, i, L1A, jL2) |- (q, i, L1'B, kL2), wenn die j-te Regel in P Acan be replaced byw1 ist und die nächste Regel (in der Ordnung unter 1), deren rechte Regelseite einen Suffix von L1w1 bildet, Bcan be replaced byw2 ist Diese Regel hat die Nummer k.
      L1w1 = L1'w2.
      Gehe zu Schritt 1.
    2. Reduktion rückgängig: (b, n + 1,L1A, jL2) |- (b, n + 1,L1w1, L2), wenn die j-te Regel in P A w1 ist und keine alternativen Reduktionen von L1w1 möglich sind.
      Gehe zu Schritt 5.
    3. Shift statt Reduktion: (b, i, L1A, jL2) |- (q, i+1, L1w1a, sL2), wenn iungleich n+1 und die j-te Regel in P Acan be replaced byw1 ist und keine alternativen Reduktionen von L1w1 möglich sind.
      Gehe zu Schritt 1.
    4. Shift rückgängig: (b, i, L1a, sL2) |- (q, i - 1, L1, L2), wenn das oberste Symbol von L2 "s" -für ein Shift- ist.
      Gehe zu Schritt 5.

Verfahren (2) zurück 1   2   3   4   5 weiter Üben

Benutzer: Gast • Besitzer: matthias • Zuletzt geändert am: