• Keine Ergebnisse gefunden

Universit¨ at Siegen

N/A
N/A
Protected

Academic year: 2021

Aktie "Universit¨ at Siegen"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Universit¨ at Siegen

Lehrstuhl Theoretische Informatik Markus Lohrey

Compilerbau I SS 2020

Ubungsblatt 14 ¨

Aufgabe 1 Betrachten Sie wieder die kontextfreie Grammatik G = ({S}, {a, +}, P, S ),

wobei P gegeben ist durch

S → SS+ | a.

(a) Konstruieren Sie den Automaten LR(G).

L¨ osung:

Wir verwenden den Automat c(G) aus dem letzten ¨ Ubungsblatt. Um LR(G) zu erhalten, m¨ ussen wir zun¨ achst die ε- ¨ Uberg¨ ange entfernen.

Sei A = (Q, Σ, δ, q

0

, F ) ein Automat. Der Epsilon-Abschluss eines Zu- stands p ∈ Q ist E(p) = {q ∈ Q | (p, ε) `

A

(q, ε)}, also alle Zust¨ ande, die man aus p erreicht, indem man nur ε- ¨ Uberg¨ ange macht. Zum Entfernen der ε- ¨ Uberg¨ ange (Konstruktion 1 auf Folie 32) erzeugen wir folgenden Automat (mit mehreren Startzust¨ anden) (Q, Σ, δ

0

, E(q

0

), F ), wobei

δ

0

= {(p, a, q) ∈ Q × Σ × Q | ∃q

0

∈ Q.(p, a, q

0

) ∈ δ ∧ q ∈ E(q

0

)}.

Wir erzeugen also einen ¨ Ubergang (p, a, q) genau dann, wenn es ein q

0

∈ Q gibt mit (p, a) `

A

(q

0

, ε) `

A

(q, ε).

c(G) aus dem letzten ¨ Ubungsblatt ist:

[S

0

→ •S]

[S

0

→ S•]

[S → •SS+] [S → S•S+]

[S → SS•+]

[S → SS+•]

[S → •a]

[S → a•]

S S S

+

a

ε

ε

ε

ε

ε

ε

1

(2)

Nach dem Entfernen der ε- ¨ Uberg¨ ange erhalten wir:

[S

0

→ •S]

[S

0

→ S•]

[S → •SS+] [S → S•S+]

[S → SS•+]

[S → SS+•]

[S → •a]

[S → a•]

S S S

+ S

S

a

Als N¨ achstes machen wir den Automaten deterministisch mit der bekann- ten Potenzmengenkonstruktion und erhalten LR(G) = (Q, Σ, δ, q

0

, F ):

{[S

0

→ •S], [S → •SS+], [S → •a]} {[S → a•]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}

{[S → •SS+], [S → •a], [S → S•S+], [S → SS•+]}

{[S → SS+•]}

S

a

S

a

S

a

+

(b) Geben Sie eine akzeptierende Konfigurationsfolge f¨ ur w = aa+a+ im LR(0)-Parser an.

L¨ osung:

Der LR(0)-Parser startet in der Konfiguration

({[S

0

→ •S], [S → •SS+], [S → •a]}, aa+a+).

2

(3)

Mit einem Shift- ¨ Ubergang gelangen wir in

({[S

0

→ •S], [S → •SS+], [S → •a]}{[S → a•]}, a+a+).

Nun m¨ ussen wir einen Reduce- ¨ Ubergang machen. Dazu sehen wir, dass {[S → a•]} der letzte Zustand auf dem Keller ist. Da die rechte Seite a von S → a L¨ ange 1 hat, m¨ ussen wir einen Zustand vom Keller entfernen.

Von dem danach oben liegenden Zustand

{[S

0

→ •S], [S → •SS+], [S → •a]}

m¨ ussen wir einen ¨ Ubergang mit S, was die linke Seite von S → a ist, machen. Also gelangen wir in die Konfiguration

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, a+a+).

Mit einem Shift- ¨ Ubergang erhalten wir

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → a•]}

+a+).

Mit einem Reduce- ¨ Ubergang erhalten wir ({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → •SS+], [S → •a], [S → S•S+], [S → SS•+]}, +a+).

Mit einem Shift- ¨ Ubergang erhalten wir

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → •SS+], [S → •a], [S → S•S+], [S → SS•+]}

{[S → SS+•]}, a+).

Nun haben wir {[S → SS+•]} oben auf dem Keller liegen, wobei |SS+| = 3, also m¨ ussen wir bei einem Reduce- ¨ Ubergang drei Zust¨ ande entfernen

3

(4)

und dann einen ¨ Ubergang mit S aus {[S

0

→ •S], [S → •SS+], [S → •a]}

machen. Wir erhalten also

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, a+).

Mit einem Shift- ¨ Ubergang erhalten wir

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → a•]}

+).

Mit einem Reduce- ¨ Ubergang erhalten wir ({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → •SS+], [S → •a], [S → S•S+], [S → SS•+]}, +).

Mit einem Shift- ¨ Ubergang erhalten wir

({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, {[S → •SS+], [S → •a], [S → S•S+], [S → SS•+]}

{[S → SS+•]}, ε).

Mit einem Reduce- ¨ Ubergang erhalten wir ({[S

0

→ •S], [S → •SS+], [S → •a]}

{[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, ε).

Nun liegt q

0

= {[S

0

→ •S], [S → •SS+], [S → •a]} unten im Keller gefolgt von {[S

0

→ S•], [S → •SS+], [S → •a], [S → S•S+]}, was das Item [S

0

→ S•] enth¨ alt. Somit k¨ onnen wir einen Finish- ¨ Ubergang machen und erhalten (f, ε).

4

Referenzen

ÄHNLICHE DOKUMENTE

[r]

[r]

[r]

(c) Geben Sie zu jeder Formel eine Struktur an, die kein Modell ist..

Wandeln Sie das Verfahren so um, dass der NDEA stattdessen einen einzigen Endzustand besitzt.. Verwenden Sie hierzu die bereits bekannten Funktionen empty, first, last

Formalisieren Sie Ihr Vorgehen in 1, indem Sie regul¨ are Ausdr¨ ucke und Priorit¨ aten f¨ ur die Tokenklassen angeben2. Geben Sie intuitiv den Scanner zu den regul¨ aren Ausdr¨

Aufgabe 2 Beweisen Sie die zwei Aussagen aus dem Skript auf Seite 99 zur Korrektheit des Algorithmus zum Auffinden nichtproduktiver Nichtterminale:.. • Falls A in der j -ten

• Entwerfen Sie regul¨ are Ausdr¨ ucke, die die g¨ ultigen Tokens der Pro- grammiersprache beschreiben, und geben Sie diesen Priorit¨ aten. • Geben Sie intuitiv