Universität Karlsruhe (TH)

Werbung
Universität Karlsruhe (TH)
Lehrstuhl für Programmierparadigmen
Sprachtechnologie und Compiler WS 2008/2009
Dozent: Prof. Dr.-Ing. G. Snelting
Übungsleiter: Matthias Braun
Lösung zu Übungsblatt 2
http://pp.info.uni-karlsruhe.de/
[email protected]
[email protected]
Ausgabe: 30.10.2008
Besprechung: 5.11.2008
Aufgabe 1: Praxis: Flex
Unter http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung/minicalc.zip finden Sie ein
C-Programm zum Berechnen von einfachen mathematischen Ausdrücken. Auf der Homepage zur Übung 1 finden
sich weitere Informationen zur Installation von flex.
1.1 Scanner
Der enthaltene Scanner wurde in flex geschrieben, ist allerdings unvollständig. Erweitern Sie diesen um folgende
Tokentypen:
• T PLUS: das ’+’ Zeichen
• T MINUS: das ’-’ Zeichen
• T STAR: das ’*’ Zeichen
• T SLASH: das ’/’ Zeichen
• T LBRACE: das ’(’ Zeichen
• T RBRACE: das ’)’ Zeichen
• T NUMBER: Eine Zahl. Diese beginnt mit einer Ziffernfolge. Danach kann ein Punkt und optional
weitere Ziffern folgen. Alternativ darf die Zahl nur mit einem Punkt beginnen, wenn danach mindestens
eine Ziffer folgt. Enthält die Zahl einen Punkt, so darf der Buchstabe e oder E angehängt werden, gefolgt
von einem optionalen + oder - und weiteren Ziffern.
Zusätzlich soll bei T NUMBER Tokens der Wert der Zahl im Token vermerkt werden.
Hinweise:
• In flex enthält die Variable yytext den erkannten String.
• Die Funktion scanf ermöglicht es einen String in eine Gleitpunktzahl zu konvertieren: sscanf( string , ”%f”, &variable);
• Der parser Code enthält eine Debughilfe.
Lösung:
http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung/minicalc_solution.
zip
1 http://pp.info.uni-karlsruhe.de/lehre/WS200809/compiler/uebung
Aufgabe 2: Kontextfreie Grammatik 1
2.1 Einfache Grammatiken 1
Betrachten Sie die folgende kontextfreie Grammatik und den String aa+a*:
S →S S +|S S ∗|a
• Geben Sei eine Linksableitung für den String an.
Lösung:
S → S S ∗ → S S + S ∗ → aS + S ∗ → aa+ S ∗ → aa+a∗
• Geben Sie eine Rechtsableitung für den String an.
Lösung:
S → S S ∗ → S a∗ → S S + a∗ → S a+ a∗ → aa+a∗
• Geben Sie einen Parse-Baum für den String an.
Lösung:
S
S
S
S
a
a
S
+
∗
a
• Ist die Grammatik mehrdeutig oder nicht? Begründen Sie Ihre Antwort.
Lösung:
Die Grammatik ist nicht mehrdeutig.
• Beschreiben Sie die von dieser Grammatik generierte Sprache.
Lösung:
Die Grammatik beschreibt eine Postfix-Notation von Ausdrücken mit einer + und einer - Operation.
2.2 Einfache Grammatiken 2
Wiederholen Sie die vorige Aufgabe mit
S →S (S )S |
und dem String (()()).
2
Lösung:
Linksableitung:
S →S (S )S →(S )S →(S (S )S S )S →((S )S S )S →(()S S )S →(()S )S →
(()S (S )S )S →(()(S )S )S →(()()S )S →(()())S →(()())
Rechtsableitung:
S →S (S )S →S (S )→S (S (S )S )→S (S (S ))→S (S ())→S (S (S )S ())→
S (S (S )())→S (S ()())→S (()())→(()())
Parsebaum:
S
(
S
S
(
S
(
)
S
)
S
S
)
S
S
S
Die Grammatik ist nicht eindeutig, Beispiel für einen alternativen Parsebaum des Strings:
S
(
S
S
)
S
(
)
S
S
S
S
(
S
)
S
Die von der Grammatik generiert Sprache ist die Menge aller korrekten Klammerungen.
2.3 Entwerfen von Grammatiken
Entwerfen Sie Grammatiken für:
• Die Menge aller Strings aus 0 und 1 mit derselben Anzahl von 0 und 1
Lösung:
S →S 0S 1S |S 1S 0S |
• Die Menge aller Strings aus 0 und 1 mit einer ungleichen Anzahl von 0 und 1
Lösung:
S
→ G Z + G Z ∗ G | G O+ G O∗ G
G
→ G 0G 1G |G 1G 0G |
Z+
→ 0 Z∗
Z∗
→ 0 Z∗ | O+
→ 1 O∗
O∗
→ 1 O∗ | • Die Menge aller Strings aus 0 und 1 in der 011 nicht als Teilstring vorkommt
3
Lösung:
Als endlicher Automat würde das so aussehen:
1
0
start
Z0
0
Z1
1
1
Z2
F
0
Daraus lässt sich leicht eine Grammatik konstruieren:
S
→
| 1S | 0Z1
Z1
→
| 0Z1 | 1Z2
Z2
→
| 0Z1
4
Aufgabe 3: Kontextfreie Grammatik 2
Gegeben folgende Grammatik:
Satz
→ Subjekt Praedikat .
Subjekt
→ Nomen Attribut
Nomen
→ Pronomen | Artikel Adjektive Substantiv
Praedikat
→ Verb Adverben Adjektiv | Verb Objekte Adverben Attribut
Adjektive
→ Adjektive Adjektiv | Objekte
Objekt
Adverben
Attribut
Artikel
Verb
Adverb
→ Objekt | Objekt Objekt
→ Nomen Attribut
→ Adverben Adverb | → | Praeposition Substantiv
→ der|die|das|des|dem|den|ein|eine|eines|einem|dieser|kein|PossesivPronomen|
→ bin|ist|hat|gehe|traf |fliegen
→ naemlich|vielleicht|hier|damals|morgen|gerne|leider|links|hinterher
Substantiv
→ Junge|Bruder|Schloss|Jaeger|Leben|Blau|Gelb|Fliegen|CD|Satz|Verb
Adjektiv
Pronomen
→ schnell|fliegende|teure|schoen|neue
→ ich|du|er|sie|es|PossesivPronomen
PossesivPronomen
Praeposition
→ mein|dein|sein|seinem
→ in|an|mit
3.1 Ableitungen
Geben Sie eine Ableitung für folgende Sätze an:
1. das Leben ist naemlich schön.
Lösung:
Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . →
Artikel
Adjektive Substantiv
Praedikat
.
→
das Leben Praedikat
.
→
das Leben Verb Adverben Adjektiv . → das Leben ist Adverben Adverb schoen . →
das Leben ist naemlich schoen .
2. Blau ist das neue Gelb.
Lösung:
Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . →
Artikel Adjektive Substantiv Praedikat . → Substantiv Praedikat . → Blau Praedikat . →
Blau Verb Objekte Adverben Attribut. → Blau ist Objekte Adverben Attribut. →
Blau ist Objekt Adverben Attribut. → Blau ist Nomen Attribut Adverben Attribut. →
Blau ist Nomen Adverben Attribut. → Blau ist Artikel Adjektive Substantiv Adverben Attribut. →
Blau
ist
das
Adjektive
Substantiv
Adverben
Attribut.
→
Blau
ist
das
Adjektive
Adjektiv
Substantiv
Adverben
Attribut.
→
Blau ist das Adjektiv Substantiv Adverben Attribut. → Blau ist das neue Substantiv Adverben Attribut. →
Blau ist das neue Gelb Adverben Attribut. → Blau ist das neue Gelb Attribut. →
Blau ist das neue Gelb .
3. schnell fliegende Fliegen fliegen Fliegen hinterher.
5
Lösung:
Satz → Subjekt Praedikat . → Nomen Attribut Praedikat . → Nomen Praedikat . →
Artikel Adjektive Substantiv Praedikat .
→
Adjektive Substantiv Praedikat .
→
Adjektive Adjektiv Substantiv Praedikat . → Adjektive Adjektiv Adjektiv Substantiv Praedikat . →
Adjektive Adjektive Adjektiv Substantiv Praedikat . → Adjektive Adjektiv Substantiv Praedikat . →
schnell Adjektiv Substantiv Praedikat . → schnell fliegende Substantiv Praedikat . →
schnell fliegende Fliegen Praedikat . → schnell fliegende Fliegen Verb Objekte Adverben Attribut . →
schnell
fliegende
Fliegen
fliegen
Objekte
Adverben
Attribut
.
→
schnell
fliegende
Fliegen
fliegen
Objekt
Adverben
Attribut
.
→
schnell fliegende Fliegen fliegen Nomen Attribut
Adverben Attribut
.
→
schnell fliegende Fliegen fliegen Artikel Adjektive Substantiv Attribut Adverben Attribut . →
schnell fliegende Fliegen fliegen Artikel Adjektive Substantiv Attribut Adverben Attribut . →
schnell fliegende Fliegen fliegen Substantiv Attribut Adverben Attribut .
→
schnell fliegende Fliegen fliegen Fliegen Attribut Adverben Attribut .
→
schnell
fliegende
Fliegen
fliegen
Fliegen
Adverben
Attribut
.
→
schnell fliegende Fliegen fliegen Fliegen Adverben Adverb Attribut
.
→
schnell
fliegende
Fliegen
fliegen
Fliegen
Adverb
Attribut
.
→
schnell
fliegende
Fliegen
fliegen
Fliegen
hinterher
Attribut
.
→
schnell fliegende Fliegen fliegen Fliegen hinterher .
4. der Junge bringt seinem Bruder die teure CD.
Lösung:
Satz
→
Subjekt
Praedikat
.
→
Nomen
Attribut
Praedikat
.
→
Nomen
Praedikat
.
→
Artikel
Adjektive
Substantiv
Praedikat
.
→
der Adjektive Substantiv Praedikat . → der Substantiv Praedikat . → der Junge Praedikat . →
der Junge Verb Objekte Adverben Attribut . → der Junge bringt Objekte Adverben Attribut . →
der
Junge
bringt
Objekt
Objekt
Adverben
Attribut
.
→
der
Junge
bringt
Nomen
Attribut
Objekt
Adverben
Attribut
.
→
der Junge bringt Artikel Adjektive Substantiv Attribut Objekt Adverben Attribut . →
der Junge bringt PossesivPronomen Adjektive Substantiv Attribut Objekt Adverben Attribut . →
der Junge bringt seinem Adjektive Substantiv Attribut Objekt Adverben Attribut . →
der Junge bringt seinem Adjektive Substantiv Attribut Objekt Adverben Attribut . →
der Junge bringt seinem Substantiv Attribut Objekt Adverben Attribut .
→
der Junge bringt seinem Bruder Attribut Objekt Adverben Attribut .
→
der
Junge
bringt
seinem
Bruder
Objekt
Adverben
Attribut
.
→
der
Junge
bringt
seinem
Bruder
Nomen
Adverben
Attribut
.
→
der Junge bringt seinem Bruder Artikel Adjektive Substantiv Adverben Attribut . →
der Junge bringt seinem Bruder die Adjektive Substantiv Adverben Attribut . →
der Junge bringt seinem Bruder die Adjektive Adjektiv Substantiv Adverben Attribut . →
der Junge bringt seinem Bruder die Adjektiv Substantiv Adverben Attribut . →
der Junge bringt seinem Bruder die teure Substantiv Adverben Attribut . →
der Junge bringt seinem Bruder die teure CD Adverben Attribut .
→
der
Junge
bringt
seinem
Bruder
die
teure
CD
Attribut
.
→
der Junge bringt seinem Bruder die teure CD .
5. dieser Satz kein Verb.
Lösung:
Keine Ableitung möglich ⇒ Satz gehört nicht zur Sprache.
3.2 Mehrdeutigkeit
Ist die Grammatik eindeutig? Geben Sie ein Gegenbeispiel oder eine Begründung für die Eindeutigkeit an!
6
Lösung:
Man kann mehrdeutige Sätze konstruieren. Zum Beispiel:
ich traf den Jaeger mit seinem Gewehr.
Dieser Satz ist (auch im Deutschen) syntaktisch mehrdeutig. den Jaeger mit seinem Gewehr
kann beim Ableiten als einzelnes Objekt interpretiert werden. Alternativ kann man den Jaeger als
Objekt interpretieren und traf . . . mit seinem Gewehr als Verb mit zugehörigem Attribut.
7
Aufgabe 4: Grammar Engineering
4.1 Elimination der Linksrekursion
Es folgt eine Grammatik für reguläre Ausdrücke über die Symbole a und b:
rexpr
→ rexpr + rterm | rterm
rterm
→ rterm rfactor | rfactor
rfactor
rprimary
→ rfactor ∗ | rprimary
→ a|b
• Führen Sie eine Linksfaktorisierung dieser Grammatik durch.
Lösung:
Eine Linksfaktorisierung ändert an der gegebenen Grammatik nichts.
• Macht die Linksfaktorisierung sie für Top-Down-Parsing geeignet?
Lösung:
Nein. Die Grammatiken enthält Linksrekursionen und ist daher für Top-Down-Parsing ungeeignet.
• Eliminieren Sie anschließend die Linksrekursion aus der ursprünglichen Grammatik.
Lösung:
Nutze Regeln aus der Vorlesung: A → A α | β lässt sich umformen zu: A → βA0 und A0 → αA0 | Daraus ergibt sich:
rexpr
rexpr
0
→ rterm rexpr 0
→ + rexpr 0 | rterm
→ rfactor rterm 0
rterm 0
→ rfactor rterm 0 | rfactor
→ rprimary rfactor 0
rfactor 0
→
rprimary
∗ rfactor 0 | → a|b
• Eignet sich die resultierende Grammatik für Top-Down-Parsing.
Lösung:
Ja.
4.2 Dangling-Else
Die folgende Grammatik soll das aus der Vorlesung bekannte Problem des Dangling-Else” beseitigen:
”
stmt
→ if expr then stmt
|
matchedStmt
matchedStmt
→ if expr then matchedStmt else stmt
|
other
Zeigen Sie, dass sie immer noch mehrdeutig ist.
8
Für den Satz
if expr then if expr then other else if expr then other else other
kann man 2 Parsebäume konstruieren:
stmt
expr
if
stmt
then
matchedStmt
expr
if
then matchedStmt else
stmt
other
matchedStmt
expr
if
then matchedStmt else
stmt
other
matchedStmt
other
stmt
matchedStmt
expr
if
if
then matchedStmt
expr
else
stmt
thenmatchedStmt else
other
if
expr
then
matchedStmt
stmt
matchedStmt
other
9
stmt
other
Herunterladen