• Keine Ergebnisse gefunden

Wir definieren:

N/A
N/A
Protected

Academic year: 2022

Aktie "Wir definieren:"

Copied!
35
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Beobachtung:

• Die auszuwählende Regel hängt hier ja gar nicht von den Erweiterungen der Items ab !!!

• Unter dieser Voraussetzung können wir den Item-Kellerautomaten ohne Erweiterung benutzen :-)

• Hängt die auszuwählende Regel nur von der aktuellen Vorausschau w ab, nennen wir G auch stark LL(k) ...

Wir definieren:

Followk(A) = S{Firstk(β) | SL u Aβ} .

Die reduzierte kontextfreie Grammatik G heißt stark LL(k), falls für je zwei verschiedene A → α, A → α0P :

Firstk(α) Followk(A) ∩ Firstk0) Followk(A) = ∅

(2)

Beobachtung:

• Die auszuwählende Regel hängt hier ja gar nicht von den Erweiterungen der Items ab !!!

• Unter dieser Voraussetzung können wir den Item-Kellerautomaten ohne Erweiterung benutzen :-)

• Hängt die auszuwählende Regel nur von der aktuellen Vorausschau w ab, nennen wir G auch stark LL(k) ...

Wir definieren:

Followk(A) = S{Firstk(β) | SL u Aβ} .

Die reduzierte kontextfreie Grammatik G heißt stark LL(k), falls für je zwei verschiedene A → α, A → α0P :

Firstk(α) Followk(A) ∩ Firstk0) Followk(A) = ∅

(3)

Beobachtung:

• Die auszuwählende Regel hängt hier ja gar nicht von den Erweiterungen der Items ab !!!

• Unter dieser Voraussetzung können wir den Item-Kellerautomaten ohne Erweiterung benutzen :-)

• Hängt die auszuwählende Regel nur von der aktuellen Vorausschau w ab, nennen wir G auch stark LL(k) ...

Wir definieren:

Followk(A) = S{Firstk(β) | SL u Aβ} .

Die reduzierte kontextfreie Grammatik G heißt stark LL(k), falls für je zwei verschiedene A→α , A→α0P :

Firstk(α) Followk(A) ∩ Firstk0) Followk(A) = ∅

(4)

... im Beispiel:

S | aSb

Follow1(S) = {,b}

First1() Follow1(S) = {} {,b} = {, b} First1(aSb) Follow1(S) = {a} {,b} = {a}

Wir schließen:

Die Grammatik ist in der Tat stark LL(1) :-)

(5)

Ist G eine starke LL(k)-Grammatik, können wir die Vorausschau-Tabelle statt mit (erweiterten) Items mit Nichtterminalen indizieren :-)

Wir setzen M[B, w] = i genau dann wenn (B,i) die Regel B→γ ist und: wFirstk(γ) Followk(B) .

... im Beispiel:

S | aSb

a b

S 0 1 0

Satz

• Jede starke LL(k)-Grammatik ist auch LL(k) :-)

• Jede LL(1)-Grammatik ist bereits stark LL(1) :-))

(6)

Ist G eine starke LL(k)-Grammatik, können wir die Vorausschau-Tabelle statt mit (erweiterten) Items mit Nichtterminalen indizieren :-)

Wir setzen M[B, w] = i genau dann wenn (B,i) die Regel B→γ ist und: wFirstk(γ) Followk(B) .

... im Beispiel:

S | aSb

a b

S 0 1 0

Satz

• Jede starke LL(k)-Grammatik ist auch LL(k) :-)

• Jede LL(1)-Grammatik ist bereits stark LL(1) :-))

(7)

Beweis:

Sei G stark LL(k).

Betrachte eine Ableitung SL u Aβ und Regeln A→α, A→α0P.

Dann haben wir:

Firstk(α β) ∩ Firstk0 β) = Firstk(α) Firstk(β) ∩ Firstk0) Firstk(β)

⊆ Firstk(α) Followk(A) ∩ Firstk0) Followk(A)

= ∅

Folglich ist G auch LL(k) :-)

(8)

Sei G LL(1).

Betrachte zwei verschiedene Regeln A→α , A→α0P.

Fall 1: ∈ First1(α) ∩ First10) .

Dann kann G nicht LL(1) sein :-)

(9)

Sei G LL(1).

Betrachte zwei verschiedene Regeln A→α , A→α0P.

Fall 1: ∈ First1(α) ∩ First10) .

Dann kann G nicht LL(1) sein :-)

Fall 2: 6∈ First1(α) ∪ First10) .

Sei SL u Aβ . Da G LL(1) ist, gilt:

First1(α) Follow1(A) ∩ First10) Follow1(A)

= First1(α) ∩ First10)

= First1(α) First1(β) ∩ First10) First1(β)

= ∅

(10)

Fall 3: ∈ First1(α) und 6∈ First10) . Dann gilt:

First1(α) Follow1(A) ∩ First10) Follow1(A)

= First1(α) Follow1(A) ∩ First10)

= First1(α) (S{First1(β) | SL u Aβ}) ∩ First10)

= (S{First1(α) First1(β) | SL u Aβ}) ∩ First10)

= S{First1(α) First1(β) ∩ First10) | SL u Aβ}

= S{∅ | SL u Aβ}

= ∅

Fall 4: 6∈ First1(α) und ∈ First10) : analog :-)

(11)

Fall 3: ∈ First1(α) und 6∈ First10) . Dann gilt:

First1(α) Follow1(A) ∩ First10) Follow1(A)

= First1(α) Follow1(A) ∩ First10)

= First1(α) (S{First1(β) | SL u Aβ}) ∩ First10)

= (S{First1(α) First1(β) | SL u Aβ}) ∩ First10)

= S{First1(α) First1(β) ∩ First10) | SL u Aβ}

= S{∅ | SL u Aβ}

= ∅

Fall 4: 6∈ First1(α) und ∈ First10) : analog :-)

(12)

Beispiel:

Sa Aa a 0 | b Ab a1 Ab0 | 1

Offenbar ist die Grammatik LL(2) :-) Andererseits gilt:

First2(b) Follow2(A) ∩ First2() Follow2(A)

= {b} {a a , b a} ∩ {} {a a, b a}

= {b a, b b} ∩ {a a, b a} 6= ∅

Folglich ist die Grammatik nicht stark LL(2) :-(

Wir schließen:

• Für k > 1 ist nicht jede LL(k)-Grammatik automatisch stark LL(k).

• Zu jeder LL(k)-Grammatik kann jedoch eine äquivalente starke LL(k)-Grammatik konstruiert werden RR Übung!

(13)

Beispiel:

Sa Aa a 0 | b Ab a1 Ab0 | 1

Offenbar ist die Grammatik LL(2) :-) Andererseits gilt:

First2(b) Follow2(A) ∩ First2() Follow2(A)

= {b} {a a , b a} ∩ {} {a a, b a}

= {b a, b b} ∩ {a a, b a} 6= ∅

Folglich ist die Grammatik nicht stark LL(2) :-(

Wir schließen:

• Für k > 1 ist nicht jede LL(k)-Grammatik automatisch stark LL(k).

• Zu jeder LL(k)-Grammatik kann jedoch eine äquivalente starke LL(k)-Grammatik konstruiert werden ==⇒ Übung!

(14)

Berechnung von Follow

k

( B ) :

A2 i2

A1 i1 β1 β2 A im

S i0

α

βm B

Followk(B)

Followk(A)

(15)

Berechnung von Follow

k

( B ) :

Idee:

• Wir stellen ein Ungleichungssystem auf :-)

• ist ein möglicher rechter Kontext von S :-)

• Mögliche rechte Kontexte der linken Seite einer Regel propagieren wir ans Ende jeder rechten Seite ...

... im Beispiel:

S | aSb

Followk(S) ⊇ {}

Followk(S) ⊇ {b} Followk(S)

(16)

Allgemein:

Followk(S) ⊇ {}

Followk(B) ⊇ Firstk(X1) . . . Firstk(Xm) Followk(A) für A→α BX1 . . . XmP

Diskussion:

• Man überzeugt sich, dass die kleinste Lösung dieses Ungleichungssystems tatsächlich die Mengen Followk(B) liefert :-)

• Die Größe der auftretenden Mengen steigt mit k rapide :-(

• In praktischen Systemen wird darum meist nur der Fall k = 1 implementiert ...

(17)

2.5 Schnelle Berechnung von Vorausschau-Mengen

Im Fall k = 1 lassen sich First, Follow besonders effizient berechnen ;-)

Beobachtung:

Seien L1, L2T ∪ {} mit L1 6= ∅ 6= L2. Dann ist:

L1 L2 =

L1 falls 6∈ L1 (L1\{}) ∪ L2 sonst

Ist G reduziert, sind alle Mengen First1(A) nichtleer :-)

(18)

Idee:

• Behandle separat!

Sei empty(X) = true gdw. X .

• Definiere die -freien First1-Mengen

F(a) = {a} für aT F(A) = First1(A)\{} für AN

• Konstruiere direkt ein Ungleichungssystem für F(A) :

F(A) ⊇ F(Xj) falls AX1 . . . XmP,

empty(X1) ∧. . . ∧ empty(Xj−1)

(19)

... im Beispiel:

EE+T 0 | T 1 TTF 0 | F 1

F → ( E ) 0 | name1 | int2 wobei empty(E) = empty(T) = empty(F) = false .

Deshalb erhalten wir:

F(S0) ⊇ F(E) F(E) ⊇ F(E) F(E) ⊇ F(T) F(T) ⊇ F(T)

F(T) ⊇ F(F) F(F) ⊇ {(,name,int}

(20)

Entsprechend konstruieren wir zur Berechnung von Follow1 : Follow1(S) ⊇ {}

Follow1(B) ⊇ F(Xj) falls A→α BX1 . . . XmP,

empty(X1) ∧ . . .∧ empty(Xj−1) Follow1(B) ⊇ Follow1(A) falls A→α BX1 . . . XmP,

empty(X1) ∧. . . ∧ empty(Xm)

... im Beispiel:

... erhalten wir:

(21)

Entsprechend konstruieren wir zur Berechnung von Follow1 : Follow1(S) ⊇ {}

Follow1(B) ⊇ F(Xj) falls A→α BX1 . . . XmP,

empty(X1) ∧ . . .∧ empty(Xj−1) Follow1(B) ⊇ Follow1(A) falls A→α BX1 . . . XmP,

empty(X1) ∧. . . ∧ empty(Xm)

... im Beispiel:

EE+T 0 | T 1 TTF 0 | F 1

F → ( E ) 0 | name1 | int2 ... erhalten wir:

(22)

Entsprechend konstruieren wir zur Berechnung von Follow1 : Follow1(S) ⊇ {}

Follow1(B) ⊇ F(Xj) falls A→α BX1 . . . XmP,

empty(X1) ∧ . . .∧ empty(Xj−1) Follow1(B) ⊇ Follow1(A) falls A→α BX1 . . . XmP,

empty(X1) ∧. . . ∧ empty(Xm)

... im Beispiel:

EE+T 0 | T 1 TTF 0 | F 1

F → ( E ) 0 | name1 | int2 ... erhalten wir:

Follow1(S0) ⊇ {} Follow1(E) ⊇ Follow1(S0) Follow1(E) ⊇ {+, )} Follow1(T) ⊇ {∗}

Follow1(T) ⊇ Follow1(E) Follow1(F) ⊇ Follow1(T)

(23)

Diskussion:

• Diese Ungleichungssysteme bestehen aus Ungleichungen der Form:

x w y bzw. x w d für Variablen x, y und d ∈ D .

• Solche Ungleichungssysteme heißen reine Vereinigungs-Probleme :-)

• Diese Probleme können mit linearem Aufwand gelöst werden ...

Beispiel:

D = 2{a,b,c}

x0 ⊇ {a}

x1 ⊇ {b} x1x0 x1x3

x2 ⊇ {c} x2x1

x3 ⊇ {c} x3x2 x3x3

a b

c

c

0 1

3

2

(24)

a b

c

c

0 1

3

2

Vorgehen:

• Konstruiere den Variablen-Abhängigkeitsgraph zum Ungleichungssystem.

• Innerhalb einer starken Zusammenhangskomponente haben alle Variablen den gleichen Wert :-)

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)

• Gibt es eingehende Kanten, muss man zusätzlich die Werte an deren Startknoten hinzu fügen :-)

(25)

a b

c

c

0 1

3

2

Vorgehen:

• Konstruiere den Variablen-Abhängigkeitsgraph zum Ungleichungssystem.

• Innerhalb einer starken Zusammenhangskomponente haben alle Variablen den gleichen Wert :-)

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)

• Gibt es eingehende Kanten, muss man zusätzlich die Werte an deren Startknoten hinzufügen :-)

(26)

a b

c

c

0 1

3

2

Vorgehen:

• Konstruiere den Variablen-Abhängigkeitsgraph zum Ungleichungssystem.

• Innerhalb einer starken Zusammenhangskomponente haben alle Variablen den gleichen Wert :-)

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)

• Gibt es eingehende Kanten, muss man zusätzlich die Werte an deren Startknoten hinzufügen :-)

(27)

a

a b c

0 1

3

2

Vorgehen:

• Konstruiere den Variablen-Abhängigkeitsgraph zum Ungleichungssystem.

• Innerhalb einer starken Zusammenhangskomponente haben alle Variablen den gleichen Wert :-)

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)

• Gibt es eingehende Kanten, muss man zusätzlich die Werte an deren Startknoten hinzufügen :-)

(28)

... für unsere Beispiel-Grammatik:

First

1

:

E T F

S’

( , int , name

Follow

1

:

E T F

S’

+ , ) ∗

(29)

2.6 Bottom-up Analyse

Achtung:

• Viele Grammatiken sind nicht LL(k) :-(

• Eine Grund ist Links-Rekursivität...

• Die Grammatik G heißt links-rekursiv, falls

A+ Aβ für ein AN, β ∈ (TN)

Beispiel:

EE + T 0 | T 1 TTF 0 | F 1

F → ( E ) 0 | name1 | int2

(30)

2.6 Bottom-up Analyse

Achtung:

• Viele Grammatiken sind nicht LL(k) :-(

• Eine Grund ist Links-Rekursivität...

• Die Grammatik G heißt links-rekursiv, falls

A+ Aβ für ein AN, β ∈ (TN)

Beispiel:

EE+T 0 | T 1 TTF 0 | F 1

F → ( E ) 0 | name1 | int2

... ist links-rekursiv :-)

(31)

Satz

Ist die Grammatik G reduziert und links-rekursiv, dann ist G nicht LL(k) für jedes k .

Beweis: Vereinfachung:

AAβ ∈ P

A erreichbar ==⇒ SL u Aγ→L u Aβnγ für jedes n0 . A produktiv RRA→α : α 6= Aβ .

Annahme:

G ist LL(k) ;-) Dann gilt für alle n ≥ 0 : Firstk(α βnγ) ∩ Firstk(Aβ βnγ) = ∅ Weil Firstk(α βn+1 γ) ⊆ Firstk(Aβn+1γ)

folgt: Firstk(α βnγ) ∩ Firstk(α βn+1γ) = ∅ Fall 1: β→ — Widerspruch !!!

Fall 2: β→ w 6= RR Firstk(α βkγ) ∩ Firstk(α βk+1γ) 6= ∅ :-(

(32)

Satz

Ist die Grammatik G reduziert und links-rekursiv, dann ist G nicht LL(k) für jedes k .

Beweis: Vereinfachung:

AAβ ∈ P

A erreichbar ==⇒ SL u Aγ→L u Aβn γ für jedes n0 . A produktiv ==⇒ ∃ A→α : α 6= Aβ .

Annahme:

G ist LL(k) ;-) Dann gilt für alle n ≥ 0 : Firstk(α βnγ) ∩ Firstk(Aβ βnγ) = ∅ Weil Firstk(α βn+1 γ) ⊆ Firstk(Aβn+1γ)

folgt: Firstk(α βnγ) ∩ Firstk(α βn+1γ) = ∅ Fall 1: β→ — Widerspruch !!!

Fall 2: β→ w 6= RR Firstk(α βkγ) ∩ Firstk(α βk+1γ) 6= ∅ :-(

(33)

Satz

Ist die Grammatik G reduziert und links-rekursiv, dann ist G nicht LL(k) für jedes k .

Beweis: Vereinfachung:

AAβ ∈ P

A erreichbar ==⇒ SL u Aγ→L u Aβn γ für jedes n0 . A produktiv ==⇒ ∃ A→α : α 6= Aβ .

Annahme:

G ist LL(k) ;-) Dann gilt für alle n ≥ 0 : Firstk(α βnγ) ∩ Firstk(Aβ βnγ) = ∅ Weil Firstk(α βn+1 γ) ⊆ Firstk(Aβn+1γ)

folgt: Firstk(α βnγ) ∩ Firstk(α βn+1γ) = ∅ Fall 1: β→ — Widerspruch !!!

Fall 2: β→ w 6= RR Firstk(α βkγ) ∩ Firstk(α βk+1γ) 6= ∅ :-(

(34)

Satz

Ist die Grammatik G reduziert und links-rekursiv, dann ist G nicht LL(k) für jedes k .

Beweis: Vereinfachung:

AAβ ∈ P

A erreichbar ==⇒ SL u Aγ→L u Aβn γ für jedes n0 . A produktiv ==⇒ ∃ A→α : α 6= Aβ .

Annahme:

G ist LL(k) ;-) Dann gilt für alle n ≥ 0 : Firstk(α βnγ) ∩ Firstk(Aβ βnγ) = ∅ Weil Firstk(α βn+1 γ) ⊆ Firstk(Aβn+1γ)

folgt: Firstk(α βnγ) ∩ Firstk(α βn+1γ) = ∅ Fall 1: β→ Widerspruch !!!

Fall 2: β→ w 6= ==⇒ Firstk(α βkγ) ∩ Firstk(α βk+1 γ)6=∅ :-(

(35)

Bottom-up Parsing:

Wir rekonstruieren reverse Rechtsableitungen :-)

Dazu versuchen wir, für den Shift-Reduce-Parser MG(1) die Reduktionsstellen zu identifizieren ...

Betrachte eine Berechnung dieses Kellerautomaten:

(q0α γ, v) ` (q0α B, v) ` (q0 S, )

α γ nennen wir zuverlässiges Präfix für das vollständige Item [B→γ•] .

Dann ist α γ zuverlässig für [B→γ•] gdw. SR α Bv :-)

Referenzen

ÄHNLICHE DOKUMENTE

Beweise, daß die Menge aller Begriffe eines endlichen Kontextes (ein Kon- text mit endlicher Merkmal- und Gegenstandsmenge) geordnet bez¨uglich der Begriffsordnung einen

Es wird gezeigt werden, dass stets durch die extrafokale Korrelation eine Verringe- rung der Standardabweichung bei der Bestimmung der Kantenpositionen – immer ver- glichen

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)c. • Gibt es eingehende Kanten, muss

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-)c. • Gibt es eingehende Kanten, muss

• Hat eine SZK keine eingehenden Kanten, erhält man ihren Wert, indem man die kleinste obere Schranke aller Werte in der SZK berechnet :-). • Gibt es eingehende Kanten, muss

Idee: Leader gibt sich einen (neuen) Namen; restliche Knoten führen unter sich eine neue Election

Idee: Leader gibt sich einen (neuen) Namen; restliche Knoten führen unter sich eine neue Election durch.. Es geht auch direkter ohne

Dann ist γ genau dann eine untere Schranke von M, wenn −γ obere Schranke von −M ist.. Um die noch fehlenden zwei Nullstellen von p zu bestimmen, f¨ uhren wir