Dolmetscher-Muster

In der Computerprogrammierung ist das Dolmetscher-Muster ein Designmuster, das angibt, wie man Sätze auf einer Sprache bewertet.

Die Grundidee ist, eine Klasse für jedes Symbol (Terminal oder Nichtterminal) auf einer Spezialcomputersprache zu haben. Der Syntax-Baum eines Satzes auf der Sprache ist ein Beispiel des zerlegbaren Musters und wird verwendet, um zu bewerten (interpretieren) den Satz.



Gebrauch für das Dolmetscher-Muster

  • Spezialdatenbankanfragensprachen wie SQL.
  • Spezialcomputersprachen, die häufig verwendet werden, um Nachrichtenprotokolle zu beschreiben.
  • Die meisten Mehrzweckcomputersprachen vereinigen wirklich mehrere Spezialsprachen.

Struktur

Beispiel

Das folgende polnische Rücknotationsbeispiel illustriert das Dolmetscher-Muster. Die Grammatik </br> </br>

Ausdruck:: = plus | minus | Variable | Zahl

plus:: = Ausdruck-Ausdruck '+'

minus:: = Ausdruck-Ausdruck '-'

Variable:: = | 'b' | 'c' |... | 'z'

Ziffer = '0' | '1' |... '9'

Zahl:: = Ziffer | Ziffer-Zahl

</br>

</Code>

definiert eine Sprache, die polnische Rückausdrücke enthält wie: </br> </br>

ein b +

ein b c + -

ein b + c - - </br>

</Code>

Im Anschluss an das Dolmetscher-Muster gibt es eine Klasse für jede Grammatik-Regel.

Import java.util. Karte;

verbinden Sie Ausdruck {\

öffentliche interne Nummer dolmetscht (Karte

}\

Klassifikationsindex führt Ausdruck {\durch

private int Zahl;

öffentliche Zahl (int Zahl) {this.number = Zahl; }\

öffentliche interne Nummer dolmetscht (Karte}\

Klasse Plus der Werkzeug-Ausdruck {\

Ausdruck leftOperand;

Ausdruck rightOperand;

Publikum Plus (Ist Ausdruck, Ausdruck-Recht abgereist) {

leftOperand = ist abgereist;

rightOperand = Recht;

}\ öffentliche interne Nummer dolmetscht (Karte

geben Sie leftOperand.interpret (Variablen) + rightOperand.interpret (Variablen) zurück;

}\}\

Klasse Minus der Werkzeug-Ausdruck {\

Ausdruck leftOperand; Ausdruck rightOperand;

Publikum Minus (Ist Ausdruck, Ausdruck-Recht abgereist) {

leftOperand = ist abgereist; rightOperand = Recht; }\ öffentliche interne Nummer dolmetscht (Karte

geben Sie leftOperand.interpret (Variablen) - rightOperand.interpret (Variablen) zurück;

}\}\

Klassenvariable führt Ausdruck {\durch

privater Schnur-Name;

öffentliche Variable (Schnur-Name) {this.name = Name; }\

öffentliche interne Nummer dolmetscht (Karte

wenn (ungültig == variables.get (Name)) 0 zurückkehren;//Jede Rückkehr neue Nummer (0).

geben Sie variables.get (Name).interpret (Variablen) zurück;

}\}\</Quelle>

Während das Dolmetscher-Muster Syntaxanalyse eines parser nicht richtet, wird für die Vollständigkeit zur Verfügung gestellt.

Import java.util. Karte;

Import java.util. Stapel;

Klassenschätzer führt Ausdruck {\durch

privater Ausdruck syntaxTree;

öffentlicher Schätzer (String-Ausdruck) {\

Stapel

dafür (Spannen Jeton: expression.split (" ")) {\

wenn (token.equals (" + ")) {\

Ausdruck-Subausdruck = neu Plus (expressionStack.pop , expressionStack.pop );

expressionStack.push (Subausdruck);

}\

sonst, wenn (token.equals (" - ")) {\

//es ist notwendig entfernen zuerst das Recht operand vom Stapel

Ausdruck-Recht = expressionStack.pop ;

//.. und nach dem linken

Ausdruck ist = expressionStack.pop abgereist;

Ausdruck-Subausdruck = neu Minus (verlassen, Recht);

expressionStack.push (Subausdruck); }\

sonst

expressionStack.push (neue Variable (Jeton));

}\

syntaxTree = expressionStack.pop ;

}\ öffentliche interne Nummer dolmetscht (Karte

geben Sie syntaxTree.interpret (Zusammenhang) zurück;

}\}\</Quelle>

Schließlich den Ausdruck "w x z - +" mit w = 5, x = 10, und z = 42 bewertend.

Import java.util. Karte;

Import java.util. HashMap;

öffentliche Klasse InterpreterExample {\

öffentliche statische leere Hauptsache (Schnur [] args) {\

String-Ausdruck = "w x z - +";

Schätzer-Satz = neuer Schätzer (Ausdruck);

Karte

variables.put ("w", neue Nummer (5));

variables.put ("x", neue Nummer (10));

variables.put ("z", neue Nummer (42));

int Ergebnis = sentence.interpret (Variablen);

System.out.println (Ergebnis);

}\}\</Quelle>

Siehe auch

Links


Muster von Iterator / Vermittler-Muster
Impressum & Datenschutz