docjunior.de
News
20.03.2013
Habe einen UART auf dem Tiny25 gebraucht. Gab keinen. Hab mir selber einen gebaut.

14.09.2011
Ich habe mich entschieden euch ein Geheimnis zu verraten: Ich hab ein Buch geschrieben: Mikrocontroller in Kürze

Menu
zurück
Gästebuch
eM@il
Sitemap
Logindaten
Benutzername

Passwort


Sie sind der
60688. Besucher
home/ Programmierung/ Java/ Das Interpreter-Pattern/
 
Index    Einleitung
   Das Interpreter-Pattern
   Der Parser
   Download

Einleitung Compiler- und Interpreterbau sind ein sehr komplexes Thema. Obwohl ich nicht der Meinung bin, dass sich jeder seine eigene Programmiersprache basteln muss, ist das Wissen darüber, wie man sich einen Interpreter selbst erstellen kann meines Erachtens sehr wertvoll.


Das Interpreter-Pattern Seit der Gang of Four gibt es eine Struktur zur Abarbeitung von Parserbäumen für einfache Gramatiken. Es hat mich etwas Zeit gekostet, diese zu verstehen, weil ich immer davon ausging, dass das Pattern auch Parserbäume selbst generiert. (Wer dies nicht versteht, kann sich auf wikipedia.org mal umschauen.)

Für meine Experimente habe ich einen Interpreter für Aussagenlogik erstellt. Dieser parst einen logischen Ausdruck, wie (A = "Text") & (B = (C | D)), wobei die Inhalte Variablen aus einem internen Speicher kommen. Der Aufruf des Ganzen ist wie folgt:

/*
* Erstelle den Interpreter
*/
Interpreter itr = new Interpreter();

/*
* Setze die Variablen
*/
itr.context.setVariable("A", "B x");
itr.context.setVariable("B", "N");
itr.context.setVariable("C", "2");

/*
* Erstelle die Regeln
*/
itr.context.setRule("1", "( [A] = "B x" ) | ( "1" > [C] )");
itr.context.setRule("0", "!([B] = "C")");

/*
* Interpretiere eine Regel
*/
itr.interprete("1");
System.out.println("interpreting result: " + itr.context.getVariable("rule1"));


Der Parser Der Parser ist recht einfach gestrickt. Grundsätzlich wird davon ausgegangen, dass ein einzelner Ausdruck geparst wird.

Term Operator Term

Ein Term widerum kann, wenn er in Klammern geschrieben wird ebenfalls wieder ein Ausdruck sein. Entsprechend wird dann ein neuer Ausdruck eingehängt, was durch eine "einfache" Rekursion sehr elegant zu programmieren ist.

Der Ausdruck
(A = "Text") & (B = (C | D))
wird quasi zerlegt in die Ausdrücke
X & Y
wobei
X : A = "Text"
Y : B = Z
Z : C | D

X, Y und Z sind hier nur zur Veranschaulichung. Das Programm hängt diese Terme direkt in den Parserbaum.


Download Download - Das Beispiel ist für Java 5 geschrieben. Der Quellcode liegt bei. Ich entschuldige mich für die dürftige Dokumentation- das Prog war ursprünglich nicht für die Veröffentlichung gedacht. Ich werde dies nachholen ;)
MyInterpreter.jar (35kb inkl. Source Code)

Für eventuellen Schaden, den diese Software verursacht (was eigentlich nicht denkbar ist) übernehme ich keinerlei Verantwortung!


cmsJr by Jens Rapp, 2006 - 2008