Seminar Entwurfsmuster
Interpreter
Tobias Webelsiep
Korreferenten
Prof. Dr. Burkhardt Renz
Prof. Dr. Wolfgang Henrich
18.06.2003
Inhaltsverzeichnis
Einführung in Verhaltensmuster
Interpreter:
• Definition und Motivation
• Beispiel: Interpreter für römische Zahlen
Interpreter – Entwurfsmuster
• Struktur, Aufbau
• Anwendbarkeit, Vor- und Nachteile
Beispiel: Projektdaten einlesen
Kritische Würdigung
Entwurfsmuster - Interpreter
Tobias Webelsiep
Einführung in Verhaltensmuster
Definition
Beschreiben allgemeine Algorithmen
Befasst sich mit der Zuweisung von Zuständigkeiten
Regeln Interaktionen zwischen Objekten bzw. Klassen
Ermöglicht Beschreibung komplexer Kontrollflüsse
Unterschiedliche Arten
Klassenbasiert (Vererbung):
• Interpreter, Schablonenmethode
Objektbasiert (Objektkomposition):
• Vermittler, Strategie, Zustandsmuster
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter - Definition
"Definiere für eine gegebene Sprache eine
Repräsentation der Grammatik sowie einen
Interpreter, der die Repräsentation nutzt,
um Sätze in der Sprache zu interpretieren."
[GoF]
"Löse ein Problem, indem es rekursiv in kleinere
unabhängige Probleme unterteilt wird. Die
resultierenden Teilprobleme können getrennt
voneinander gelöst und zu einer um fassenden
Lösung zusammengefügt werden."
[Applied Java Patterns]
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter - Motivation
Direkt
Interpretation von Sprachen und Grammatiken
Parsen von Eingabeströmen (String, Datei)
Indirekt
Finde für ein Problem eine Grammatik:
• Zerlege das Problem in Teile
• Schreibe jedes Teilproblem als Satz der Sprache
• Füge die Sätze zu einer Grammatik zusammen
Lösung des gleichen Problemtyps
mit einem einzigen Interpreter
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter – Beispiel (1)
Interpreter für Römische Zahlen
Eingabe römischer Zahlen
Ausgabe Interger-Zahlen
Grammatik
<Roman>
<Tausend>
<Hundert>
<Zehn>
<Eins>
:=
:=
:=
:=
:=
<Tausend> <Hundert> <Zehn>
{'M'}
{'C'} | 'CD' | 'D' {'C'} |
{'X'} | 'XL' | 'L' {'X'} |
{'I'} | 'IV' | 'V' {'I'} |
Entwurfsmuster - Interpreter
<Eins>
'CM'
'XC'
'IX'
Tobias Webelsiep
Interpreter – Beispiel (2)
Struktur und Aufbau
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter – Beispiel (3)
Teilnehmer
Quellcode
ZahlenParser: Hauptklasse, liest
römische Zahl ein, gibt die Integer-Zahl aus.
ZahlenKontext: Speichert aktuelle Integer-Zahl
während des Parsvorgangs
ZahlInterpreter: Abstrakte Basisklasse, enthält die
interpretiere()-Methode
• ZahlEins: Interpretiert 1, 4, 5, 9
• ZahlZehn: Interpretiert 10, 40, 50, 90
• ZahlHundert: Interpretiert 100, 400, 500, 900
• ZahlTausend: Interpretiert 1000
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter-Entwurfsmuster
Definition
Klassenbasiertes Verhaltensmuster
Beschreibt den Entwurf der Klassen aus der Grammatik
Globale Informationen werden in einer Kontext-Klasse
gespeichert
Was wird nicht beschrieben
Wie wird der Syntaxbaum erzeugt (vgl. Kompositum)
Beispiele:
Stringparsen, CUI, Algebraische Ausdrücke
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter-Entwurfsmuster
Aufbau und Struktur
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter-Entwurfsmuster
Anwendbarkeit
Einfache und kleine Grammatik
• Anzahl der Klassen wird zu groß
• Wartbarkeit, Handhabbarkeit eingeschränkt
Problem lässt sich einfach als Grammatik formulieren
• Suche darf den Rahmen nicht sprengen
Die Effizienz spielt keine Rolle
• Aufbau des Syntaxbaumes kostet Zeit
• Viele Klassen-Instanziierungen
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter-Entwurfsmuster
Vorteile
Die Grammatik ist leicht zu implementieren
Erweiterung der Grammatik und des Interpreters ohne
großen Aufwand möglich
Neue Interpretationsart durch eine neue Methode in
der abstrakten Basisklasse Ausdruck
Nachteile
Große Grammatiken bereiten Probleme
Parsergeneratoren meist besser geeignet
Entwurfsmuster - Interpreter
Tobias Webelsiep
Beispiel: Projektdaten einlesen
Aufgabe
Kommaseparierte Projekt-Daten und Projektpositionen
einlesen und interpretieren
Auswertung des Projektnamen und des Gesamtwertes
Grammatik
<Projekt>
PrjNr
PrjName
PrjStatus
<PrjPosition>
PrdNr
PrdName
PrdPreis
PrdAnzahl
:=
:=
:=
:=
:=
:=
:=
:=
:=
PrjNr PrjName PrjStatus {<PrjPosition>}
int
String
int
PrdNr PrdName PrdPreis PrdAnzahl
int
String
float
int
Entwurfsmuster - Interpreter
Tobias Webelsiep
Beispiel: Projektdaten einlesen
Klassendiagramm
Entwurfsmuster - Interpreter
Tobias Webelsiep
Beispiel: Projektdaten einlesen
Syntaxbaum
Wird vom ProjektParser aufgebaut
Projekt und ProjektPosition enthalten Kind-Objekte
Entwurfsmuster - Interpreter
Tobias Webelsiep
Beispiel: Projektdaten einlesen
Teilnehmer
Start des Interpretier-Vorgangs im ProjektParser
über die werteAus()-Methode des Wurzel-Objektes
Jeder NichtTerminalAusdruck wertet den Kontext durch
Aufruf der werteAus()-Methode seiner Kind-Objekte
aus
Die TerminalAusdrücke bilden das Ende der Rekursion
Wertübergabe im Baum durch Klasse ProjektKontext
und PositionKontext in beide Richtungen
Quellcode
Entwurfsmuster - Interpreter
Tobias Webelsiep
Kritische Würdigung
Besonderheit bei der Implementierung
Einfache Möglichkeit der Kommando-Eingabe
Fehlerbehandlung kann umfangreich werden
Bei großen Syntaxbäumen hilft Iterator-Muster
Typische Anwendungsgebiete
Ausdruck-Interpreter in Mathematica
Übersetzer für Smalltalk
Generator für Ausgabe. Sprache ähnlich wie SQL
HTML Generierung für Web-Client
Entwurfsmuster - Interpreter
Tobias Webelsiep
Kritische Würdigung
Fazit
Strukturierter Aufbau der Grammatik in Klassen
Gute Wiederverwendung und Erweiterbarkeit
Mächtiges Werkzeug durch Baumstruktur
Implementierungsaufwand größer, da Klient und
Kontext nicht im Entwurfsmuster beschreiben
Da eingeschränktes Anwendungsgebiet nur selten im
Softwareentwurf eingesetzt
Entwurfsmuster - Interpreter
Tobias Webelsiep
Noch Fragen?
Vielen Dank für Ihre Aufmerksamkeit
Entwurfsmuster - Interpreter
Tobias Webelsiep