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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

88 KAPITEL 5: IMPLEMENTIERUNGWeitere Visitor-Klassen für <strong>ODL</strong>-Auswertungsbäume, beispielsweise TermToString-Converter, sollten ebenfalls um Methoden für die neue Auswertungsklasse ergänztwerden.Der letzte Schritt ist die Erstellung von Methoden im SableCCGenerator, die für die Kompilationdes neuen Sprachkonstrukts zuständig sind. Diese Methoden müssen, wenn sie in einemvom SableCC-Parser erstellten <strong>ODL</strong>-Syntaxbaum einer <strong>ODL</strong>-Abfrage auf das neue Sprachkonstrukttreffen, eine Instanz der entsprechenden ODl-Auswertungsklasse in den <strong>ODL</strong>-Auswertungsbaumeinfügen:public void outASetSizeArithmeticTerm(ASetSizeArithmeticTerm node) {TypedExpression typedExpression =(TypedExpression)getOut( node.getExpression() );/* Überprüfen, ob der Typ des Ausdrucks, auf den SetSizeExpressionangewandt wird, ein Mengentyp ist. */if ( !( typedExpression.getType().getInstanceMetaType()instanceof MetaSetType ) ) {throw new InvalidArgumentsException("Argument must be a set",typedExpression.getToken().getLine(),typedExpression.getToken().getPos() );}/* Interne Repräsentation für die AuswertungsklasseSetSizeExpression erstellen. */TypedExpression sizeExpression = new TypedSetSizeExpression(node.getSize(), typedExpression );setOut( node, sizeExpression );}Bei TypedSetSizeExpression handelt es sich um eine interne Klasse von SableCCGenerator,die zusätzlich zu den Informationen für den Aufbau einer SetSizeExpressionweitere Information enthält, die vom SableCCGenerator zur Kompilation einer <strong>ODL</strong>-Abfragebenötigt werden: ihre Instanz wird im späteren Verlauf der Kompilation der <strong>ODL</strong>-Abfragedurch eine Instanz von SetSizeExpression ersetzt.Nach der Durchführung aller oben beschriebenen Schritte ist die Einführung des neuen <strong>ODL</strong>-Ausdrucks abgeschlossen: er kann nun in <strong>ODL</strong>-Abfragen verwendet werden.• Einführung eines neuen <strong>ODL</strong>-Datentyps am Beispiel von MetaProductType:Die ersten drei Schritte für die Einführung eines neuen <strong>ODL</strong>-Datentyps sind dieselben wiefür einen neuen <strong>ODL</strong>-Ausdruck: Einfügen der Produktionsregeln in die <strong>ODL</strong>-Grammatik, Erstellungeiner entsprechenden <strong>ODL</strong>-Auswertungsklasse, die diesmal das Interface MetaTypeimplementiert, Anpassung von EvalTreeVisitor <strong>und</strong> seiner Unterklassen, Ergänzung vonSableCCGenerator um Methoden für die Verarbeitung des neuen Typs.Der nächste Schritt, der bei einem neuen Datentyp hinzukommt, ist die Implementierung derBenutzereingabe für diesen Datentyp. Ein Datentyp wendet sich an das <strong>ODL</strong>-Query-Subsystem,indem aus seiner query-Methode heraus die dem Datentyp entsprechende Methode derQueryManager-Klasse aufgerufen wird – für den Produkttyp heißt sie queryProduct-Type <strong>und</strong> liefert als Rückgabewert eine ProductValue-Instanz, die den vom Benutzer eingegebenenWert enthält. Nachdem das <strong>ODL</strong>-Query-Subsystem ausführlich im Abschnitt 5.2 beschriebenwurde, verzichten wir hier auf eine ausführliche Beschreibung der Implementierungvon Benutzereingaben <strong>und</strong> geben nur die Klassen an, die bei der Einführung von Produkttypenim <strong>ODL</strong>-Query-Subsystem erstellt werden mussten:

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!