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