• Keine Ergebnisse gefunden

... im Beispiel:

N/A
N/A
Protected

Academic year: 2022

Aktie "... im Beispiel:"

Copied!
31
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

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)

(3)

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

(4)

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:

(5)

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:

(6)

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)

(7)

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

(8)

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

(9)

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

(10)

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

(11)

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

(12)

... für unsere Beispiel-Grammatik:

First

1

:

E T F

S’

( , int , name

Follow

1

:

E T F

S’

+ , ) ∗

(13)

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

(14)

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

(15)

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= ∅ :-(

(16)

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= ∅ :-(

(17)

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= ∅ :-(

(18)

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=∅ :-(

(19)

Bottom-up Parsing:

Wir rekonstruieren reverse Rechtsableitungen :-)

Dazu versuchen wir, in M(1)G Reduktionsstellen zu entdecken.

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

(20)

A

0

i

0

A

2

i

2

A

1

i

1

B i γ α

m

α

2

α

1

... wobei α = α1 . . . αm :-)

Umgekehrt können wir zu jedem möglichen Wort α0 die Menge aller möglicherweise später passenden Regeln ermitteln ...

(21)

A

0

i

0

A

2

i

2

A

1

i

1

B i γ α

m

α

2

α

1

... wobei α = α1 . . . αm :-)

Umgekehrt können wir zu jedem möglichen Wort α0 die Menge aller möglicherweise später passenden Regeln ermitteln ...

(22)

Das Item [B→γ •β] heißt gültig für α0 gdw. SRα Bv mit α0 = α γ :

A

0

i

0

A

2

i

2

A

1

i

1

B i α

m

α

2

α

1

γ β

... wobei α = α1 . . . αm :-)

(23)

Beobachtung:

Die Menge der zuverlässigen Präfixe aus (NT) für (vollständige) Items kann mithilfe eines endlichen Automaten berechnet werden :-)

Zustände: Items :-) Anfangszustand: [S0 → • S]

Endzustände: {[B→γ•] | B→γ ∈ P} Übergänge:

(1) ([A→α • Xβ],X,[A→α X •β]), X ∈ (NT), A→α Xβ ∈ P;

(2) ([A→α • Bβ],, [B→ •γ]), A→α Bβ , B→γ ∈ P;

Den Automaten c(G) nennen wir charakteristischen Automaten für G.

(24)

Beispiel:

EE+T 0 | T 1 TTF 0 | F 1 F → ( E ) 0 | int2

E S’

E E +T

T E

F T

F ( )

S’ E

F int F int

int

F ( ) F ( ) F ( )

T F

T T F T T F T

E T

E E +T E E+ T E E+T E

T

T

F

( E

+ T

F

)

T F T

T F

E E E E

E

(25)

Beispiel:

EE+T 0 | T 1 TTF 0 | F 1 F → ( E ) 0 | int2

E S’

E E +T

T E

F T

F ( )

S’ E

F int F int

int

F ( ) F ( ) F ( )

T F

T T F T T F T

E T

E E +T E E+ T E E+T E

T

T

F

( E

+ T

F

)

T F T

T F

E E E E

E

(26)

Den kanonischen LR(0)-Automaten LR(G) erhalten wir aus c(G) , indem wir:

(1) nach jedem lesenden Übergang beliebig viele-Übergänge einschieben (unsere Konstruktion 1 :-)

(2) die Teilmengenkonstruktion anwenden.

... im Beispiel:

T

F

F F

( (

(

*

(

) +

+ int

int F

int E int

T

E

T

3 4 1

2 5 0

10 8

11

9 6

7

(27)

Dazu konstruieren wir:

q0 = {[S0→ • E], q1 = δ(q0, E) = {[S0E•],

{[E→ • E+T], {[EE• + T]}

{[E→ • T],

{[T→ • TF]} q2 = δ(q0, T) = {[ET•],

{[T→ • F], {[TT • ∗ F]}

{[F → • (E)],

{[F → • int]} q3 = δ(q0, F) = {[TF•]}

q4 = δ(q0,int) = {[F→int•]}

(28)

q5 = δ(q0, ( ) = {[F→( • E) ], q7 = δ(q2, ∗) = {[TT∗ • F], {[E→ • E+T], {[F → • ( E)], {[E→ • T], {[F → • int]}

{[T → • TF],

{[T → • F], q8 = δ(q5, E) = {[F →( E• )]}

{[F→ • ( E)], {[EE• +T]}

{[F→ • int]}

q9 = δ(q6, T) = {[EE+T•], q6 = δ(q1,+) = {[EE+• T], {[TT • ∗ F]}

{[T → • TF],

{[T → • F], q10 = δ(q7, F) = {[TTF•]}

{[F→ • ( E)],

{[F→ • int]} q11 = δ(q8, )) = {[F →( E)•]}

(29)

Beachte:

Der kanonische LR(0)-Automat kann auch direkt aus der Grammatik konstruiert werden :-)

Man benötigt die Hilfsfunktion:

δ(q) = q∪ {[B→ •γ] | ∃ [A→α • B0 β0] ∈ q,

∃ β ∈ (NT) : B0 Bβ}

Dann definiert man:

Zustände: Mengen von Items;

Anfangszustand: δ {[S0 → • S]}

Endzustände: {q | ∃ A→α ∈ P : [A→α•] ∈ q}

Übergänge: δ(q, X) = δ {[A→α X • β] | [A→α • Xβ] ∈ q}

(30)

Idee zu einem Parser:

• Der Parser verwaltet ein zuverlässiges Präfix α = X1 . . .Xm auf dem Keller und benutzt LR(G) , um Reduktionsstellen zu entdecken.

• Er kann mit einer Regel A→γ reduzieren, falls [A→γ•] für α gültig ist :-)

• Damit der Automat nicht immer wieder neu über den Kellerinhalt laufen muss, kellern wir anstelle der Xi jeweils die Zustände !!!

Achtung:

Dieser Parser ist nur dann deterministisch, wenn jeder Endzustand des kanonischen LR(0)-Automaten keine Konflikte enthält ...

(31)

... im Beispiel:

q1 = {[S0E•],

{[EE • +T]}

q2 = {[ET•], q9 = {[EE+T•], {[TT • ∗ F]} {[TT • ∗ F]}

q3 = {[TF •]} q10 = {[TTF •]}

q4 = {[F→int•]} q11 = {[F→(E)•]}

Die Endzustände q1,q2,q9 enthalten mehr als ein Item :-(

Aber wir haben ja auch noch nicht Vorausschau eingesetzt :-)

Referenzen

ÄHNLICHE DOKUMENTE

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

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

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

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 :-)3. • 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