Aufgabe 1:
Schreiben Sie einen Parser für korrekt aufgebaute Klammerstrukturen. Legen Sie folgende Grammatik zugrunde (a entspricht einer öffnenden, b einer schließenden Klammer):
S | aSbS | ε |
Aufgabe 2:
(123*(30-5))-16+32
auf korrekten syntaktischen Aufbau überprüft, und benutzen Sie dabei die untenstehende Grammatik in erweiterter Backus-Naur-Form.
Die Grammatik hat folgende Produktionen:
expr | term (+ term | - term)* | |
term | factor (* factor | / factor)* | |
term | number | ( expr ) | |
number | digit+ | |
digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Aufgabe 3:
Schreiben Sie einen Übersetzer, der eine Zahl auswertet. Mögliche Zahlen sollen z.B. sein:
17, 0, 1024, 13.5, 0.005, 5.5e-2, 6e+2, 1.00E3, 0e0, 000.000e000
Eingabewort soll eine als String dargestellte Zahl sein, Ergebnis der Übersetzung soll eine double-Zahl sein.
Die Grammatik für Zahlen hat folgenden Produktionen:
number | integer fraction? exponent? | |
integer | digit+ | |
fraction | . integer | |
exponent | (e | E) sign integer | |
sign | (+ | -)? | |
digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Schreiben Sie eine Klasse NumberCompiler und leiten Sie diese von der Basisklasse Compiler ab.
Aufgabe 4:
Eine mathematische Formel der Art
x |
2 |
x |
3 |
3x + 2x |
6 |
soll in einer XML-Sprache wie folgt beschrieben werden:
Entwerfen Sie eine kontextfreie Grammatik für diese XML-Sprache.
Schreiben Sie einen Recursive-Descent-Parser auf Grundlage dieser Grammatik.
Wandeln Sie den Parser in einen Compiler um, der Formeln dieser Art in HTML-Code übersetzt, sodass diese wie oben dargestellt werden.