Muster: Interpreter
Interpreter
[Bearbeiten]Der Interpreter gehört zu der Kategorie der Verhaltensmuster (behavioural patterns).
Das Interpretermuster definiert eine Repräsentation für die Grammatik einer Sprache und die Möglichkeit Sätze dieser Sprache zu interpretieren.
Verwendung
[Bearbeiten]Wenn ähnliche Probleme oft genug gelöst werden müssen, ist es häufig sinnvoll das Problem mit einer einfachen Sprache zu beschreiben. Beispiele für ein solches Problem sind:
- das Auswerten von regulären Ausdrücken und
- die Berechnung von logischen oder mathematischen Formeln
UML-Diagramme
[Bearbeiten]Klassendiagramm
[Bearbeiten]Bestandteile
[Bearbeiten]Die SymbolSchnittstelle definiert die Funktion interpretiere, die von allen abgeleiteten Klassen implementiert wird und das entsprechende Symbol auswertet.
Ein TerminalSymbol steht für einen festen Wert innerhalb des Satzes, z. B. einen Zahlenwert innerhalb einer mathematischen Formel.
Ein NichtTerminalSymbol repräsentiert eine Verknüpfung zweier Symbole, z. B. Addition oder Multiplikation. Sowohl Terminalsymbol als auch Nichtterminalsymbole können miteinander verknüpft werden.
Den Satz, der interpretiert werden soll, baut der Klient in Form eines Syntaxbaumes aus den Nichtterminal- und Terminalsymbolen zusammen.
Im Kontext werden die konkreten Werte der Terminalsymbole gekapselt, mit denen der Satz interpretiert werden soll.
Vorteile
[Bearbeiten]- Die Grammatik kann leicht geändert oder erweitert werden.
- Der selbe Satz oder Ausdruck kann durch Ändern des Kontextes immer wieder auf neue Art und Weise interpretiert werden.
Nachteile
[Bearbeiten]Für komplexe Grammatiken und sehr große Sätze ist das Interpretermuster ungeeignet, da
- die Klassenhierachie zu groß wird und
- die Effizienz bei großen Syntaxbäumen leidet.
Sollen komplexe Grammatiken verarbeitet werden, eignen sich Parsergeneratoren besser. Große Syntaxbäume werden üblicherweise in andere Strukturen konvertiert und z. B. mit Hilfe von Zustandsautomaten bearbeitet.
Verwandte Entwurfsmuster
[Bearbeiten]Der Syntaxbaum wird durch ein Kompositum beschrieben.
Ein Besucher kann das Verhalten aller Nichttermalsymbole in sich kapseln, um die Anzahl der Klassen zu verringern und/oder das Verhalten dieser austauschbar zu gestalten.
Mit Hilfe des Fliegengewicht können Terminalsymbole gemeinsam genutzt werden.
Ein Iterator kann verwendet werden, um den Syntaxbaum zu traversieren.