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.

5.1 ERWEITERUNG DES SPRACHUMFANGS 57– Deklaration eines benamten PrädikatsBetrachten wir zunächst die Deklaration eines benamten Prädikats. Die semantische Analyse<strong>und</strong> die Kompilation des <strong>ODL</strong>-Terms, der den Rumpf eines benamten Prädikats bildet,unterscheidet sich nicht von der Verarbeitung eines <strong>ODL</strong>-Terms in einer üblichen <strong>ODL</strong>-Abfrage. Der Unterschied tritt erst bei der Behandlung des kompilierten <strong>ODL</strong>-Terms zuTage – er wird vom SableCCGenerator nicht als Ergebnis der Kompilation an dasaufrufende Objekt (typischerweise eine Instanz von quest.odl.evaluation.EvaluationModelGenerator)zurückgegeben, sondern in einer Instanz der neuen KlasseNamedPredicate gekapselt <strong>und</strong> in einer internen Hashtabelle unter dem in der Prädikatsdeklarationangegebenen Namen für spätere Aufrufe gespeichert. Für diese Sonderbehandlungsind im SableCCGenerator die Methoden outANamedPredicateOdl-Start, outANamedPredicateDeclaration <strong>und</strong> caseANamedPredicateDeclarationzuständig. Eine NamedPredicate-Instanz enthält alle für den Aufruf einesbenamten Prädikats notwendigen Angaben – die Parameterliste des benamten Prädikats <strong>und</strong>seinen Rumpf, der durch einen <strong>ODL</strong>-Term repräsentiert wird.Diese Verarbeitungsweise hat den positiven Nebeneffekt, dass benamte Prädikate, die im<strong>ODL</strong>-Editor während einer QUEST-Sitzung deklariert wurden, bis zum Ende dieser Sitzungverfügbar bleiben, ohne erneut eingegeben werden zu müssen.– Aufruf eines benamten PrädikatsWir beschreiben nun die Implementierung des Aufrufs eines benamten Prädikats. Dafürwird die Klasse NamedPredicateTerm eingesetzt: sie erfüllt die Rolle eines Adapters(s. auch [GammaEtAl], S.171-185), der einer NamedPredicate-Instanz die Schnittstelleeines Terms gibt. Diese Trennung zwischen NamedPredicate <strong>und</strong> NamedPredicateTermwird gemacht, um die Auswertung eines benamten Prädikats von der Berechnungseiner Parameter abzukoppeln, die ja beliebige <strong>ODL</strong>-Ausdrücke sein dürfen. Die Auswertungder Parameter wird von NamedPredicateTerm vorgenommen <strong>und</strong> die Ergebnissewerden als Parameterwerte an den NamedPredicate weitergegeben.Im SableCCGenerator sind die Methoden outANamedPredicateUnaryProposition,outANamedPredicateCclUnaryProposition <strong>und</strong> outANamedPredicateCallfür die Erstellung des Aufrufs eines benamten Prädikats zuständig. Die erstenbeiden dienen lediglich dazu, einen bereits erstellten NamedPredicateTerm weiterzugeben.Die Erstellung <strong>und</strong> Überprüfung eines NamedPredicateTerm findet in derMethode outANamedPredicateCall statt. Hier wird zunächst überprüft, ob das aufgerufenePrädikat bereits deklariert wurde, dann wird überprüft, ob die Anzahl <strong>und</strong> dieTypen der Parameter mit der deklarierten Signatur des benamten Prädikats übereinstimmen.Schließlich wird ein NamedPredicateTerm erstellt, der das aufzurufende NamedPredicatekapselt.• CCL-PropositionenFür die CCL-Propositionen existiert in der <strong>ODL</strong>-Grammatik ein eigener Ableitungszweig, dermit einigen Ausnahmen mit dem für <strong>ODL</strong>-Propositionen übereinstimmt (s. Abschnitt 5.1). Dadie Verarbeitung von Syntaxbaum-Knoten für eine CCL-Proposition <strong>und</strong> eine <strong>ODL</strong>-Propositiongleich ist, wurden im SableCCGenerator die Methoden für CCL-Propositionen erstellt,indem entsprechende Methoden für <strong>ODL</strong>-Propositionen kopiert <strong>und</strong> die Namen der Methoden<strong>und</strong> der in Methodenrümpfen aufgerufenen Methoden angepasst wurden. Beispielsweise wurdeaus der Methode für die AND-Verknüpfung von zwei <strong>ODL</strong>-Propositionen:public void outAAndProposition(AAndProposition node) {Term leftTerm = (Term)getOut( node.getProposition() );Term rightTerm = (Term)getOut( node.getUnaryProposition() );setOut( node, new Conjunction(leftTerm, rightTerm) );}

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!