11.07.2015 Aufrufe

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

5.1 ERWEITERUNG DES SPRACHUMFANGS 45Neben dem Lexer, Parser <strong>und</strong> den Syntaxbaum-Knoten generiert SableCC das Packagequest.odl.parser.analysis – hier befindet sich das Interface Analysis, das zusammenmit den Syntaxbaum-Knoten aus quest.odl.parser.node das Visitor-Entwurfsmusterimplementiert ([GammaEtAl], S.301-318). Für jeden Syntaxbaum-Knoten Foo, d.h., für jede Unterklassevon quest.odl.parser.node.Node, enthält das Interface Analysis die MethodecaseFoo(Foo node). Jeder Syntaxbaum-Knoten Foo besitzt seinerseits die Methodeapply(Analysis visitor), die den Aufruf visitor.caseFoo(this) enthält.Das Interface Analysis wird von der Klasse AnalysisAdapter implementiert, die für jedenSyntaxbaum-Knoten Foo eine leere Implementierung der entsprechenden Methode caseFoobereitstellt. Die Unterklasse DepthFirstAdapter von AnalysisAdapter bildet die Vorstufezur systematischen Analyse <strong>und</strong> Verarbeitung eines Syntaxbaums, indem sie einen Syntaxbaum inder Reihenfolge der Tiefensuche durchläuft. Dabei wird für jeden Knoten Foo beim Betreten die MethodeinFoo(Foo node) <strong>und</strong> beim Verlassen die Methode outFoo(Foo node) aufgerufen.Diese Methoden führen hier keine Aktionen aus <strong>und</strong> dienen als Ansatzstellen für Unterklassen vonDepthFirstAdapter, um Aktionen für Syntaxbaum-Knoten ausführen zu können. Wir wollendiese Vorgehensweise am Beispiel der Verarbeitung einer Gleichheit im DepthFirstAdapter erläutern.Für den Knoten AEqualExpression, der einen Gleichheitsausdruck repräsentiert, enthältDepthFirstAdapter die Methodepublic void caseAEqualExpression(AEqualExpression node) {inAEqualExpression(node);}node.getLeftExpression.apply( this );node.getRightExpression.apply( this );outAEqualExpression(node);Auf diese Art <strong>und</strong> Weise wird für alle Knoten eines Syntaxbaums sichergestellt, dass sie in der Reihenfolgeder Tiefensuche besucht werden, wobei für jeden Knoten beim Betreten <strong>und</strong> beim Verlasseneine Aktion ausgeführt werden kann. Um einen Syntaxbaum nun sinnvoll verarbeiten zu können,muss eine Unterklasse von DepthFirstAdapter erstellt werden, welche die MethodeninFoo <strong>und</strong> outFoo für Syntaxbaum-Knoten überschreibt, damit in diesen Methoden bestimmteAktionen für die jeweiligen Knoten ausgeführt werden. Im einfachsten Fall wird in einer überschriebenenMethode outFoo ein <strong>ODL</strong>-Auswertungsbaum-Knoten erstellt, der dem verarbeitetenSyntaxbaum-Knoten entspricht. Für den Fall eines Gleichheitsterms würde die überschriebene MethodeoutAEqualExpression(AEqualExpression node), vereinfacht dargestellt, wie folgtaussehen:public void outAEqualExpression(AEqualExpression node) {/* Zunächst werden die von den Kinderknoten in einerHashtabelle gespeicherten Auswertungsbaum-Knoten fürdie linke <strong>und</strong> rechte Seite der Gleichheit ausgelesen. */Term leftTerm = (Term)getOut(node.getLeftExpression());Term rightTerm = (Term)getOut(node.getRightExpression());}/* Nun wird ein Auswertungsbaum-Knoten erstellt, der dieFunktionalität einer Gleichheit bereitstellt. */Term equalExpression = new EqualExpression(leftTerm,rightTerm);/* Schließlich wird der neue Auswertungsbaum-Knoten in einerHashtabelle abgespeichert, aus der er von anderen Knotenwieder ausgelesen werden kann. */setOut(node,equalExpression);

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!