Funktionstabelle |
Top Previous Next |
Skripte > Klassen-Elemente und C++-Befehle > interpretierte C++-Anweisungen > Container > Funktionstabelle
Eine Funktionstabelle ist im Prinzip eine Map, in der Funktionen nach String-Schlüsseln sortiert sind. Alle Funktionen einer Liste haben den gleichen Typ. Es gibt jedoch verschiedene Funktionstabellen-Typen, je nach dem Typ den die Funktionen zurückliefern. (Siehe obige Tabelle)
Syntax
mstrfun <bezeichner> ; bool_mstrfun <bezeichner> ; int_mstrfun <bezeichner> ; uint_mstrfun <bezeichner> ; dbl_mstrfun <bezeichner> ; str_mstrfun <bezeichner> ; node_mstrfun <bezeichner> ; dnode_mstrfun <bezeichner> ;
Beschreibung
Diese sehr speziellen Container erleichtern die Verarbeitung von Parse-Bäumen, indem sie jedem Label eines Knotens eine Funktion zuordnen, die den Knoten auswerten kann. Exemplarisch sei eine Funktionstabelle an Hand von mstrfun erläutert.So ist mstrfun einer map mstrstr ähnlich. mstrfun besitzt einen str als Schlüssel und einen weiteren str als Wert. Der Wert bezeichnet hier den Namen einer Klassenmethode. Klassenmethoden, die über ihre Namen in eine Funktionstabelle eingefügt sind, müssen alle den gleichen Typ haben. Der Typ einer Funktion ergibt sich aus ihrem Rückgabetyp und ihren Parametern. So müssen alle in der Tabelle enthaltenen Funktionen den gleichen Rückgabetyp und die gleiche Anzahl und Art von Parametern haben. Eine zusätzliche Bedingung ist, dass der erste Parameter vom Typ: const node& ist. Mit diesem Parameter wird der Knoten übergeben, der ausgewertet werden soll. Zur Definition einer mstrfun-Variable auf der Element-Seite des TextTransformers erscheint daher nach Eingabe des mstrfun-Typs das Parameterfeld, das sonst nur für die Definition von Funktionen erforderlich ist. Hier müssen nun die Parameter auf gleiche Weise spezifiziert werden, wie bei den einzufügenden Klassenmethoden. Der Rückgabetyp der in der Tabelle enthaltenen Funktionen wird durch den speziellen Typ der Funktionstabelle bestimmt:
bool add( LABEL, FUNCTION );
Im Textfeld, das für Variablen die Initialisierungs-Routine enthält, werden dann mittels des add-Befehls die einzelnen Funktionen eingefügt. Sämtliche Funktionen, die mstrfun enthalten soll, müssen bereits hier eingefügt werden. Es ist nicht möglich, in einer laufenden Transformation Funktionstabellen dynamisch zu erzeugen. LABEL und FUNCTION können entweder als Strings - z.B. "number" - oder als Bezeichner - number - übergeben werden. Die Parameter als Bezeichner zu übergeben hat den Vorteil, dass das Syntax-Highlighting dann aktiv ist, und durch Anklicken mit der Maus zur entsprechenden Funktion gewechselt werden kann. Bei der Erzeugung von exportierten C++-Code werden die Bezeichner automatisch in Strings bzw. Funktionsadressen umgewandelt. Es ist nicht möglich allgemeine Ausdrücke für diese Parameter zu verwenden.
Beispiel:
m_Eval sei eine mstrfun von void-Funktionen mit nur einen node-Parameter, wie
void VisitVariable(const node& xNode)
Der ersten beiden Aufrufe sind korrekt, der dritte aber nicht:
m_Eval.add( "Variable", "VisitVariable"); m_Eval.add( Variable, VisitVariable);
str sLabel = "Variable"; m_Eval.add( sLabel, "VisitVariable"); // Fehler
Default-Funktion
Jede Funktionstabelle muss eine Default-Funktion enthalten, die diejenigen Knoten-Werte behandelt, deren Label mit keinem der Schlüssel der Tabelle übereinstimmt. Die Default-Funktion wird mit dem Leerstring "" als Schlüssel eingefügt:
Fortsetzung des obigen Beispiels:
void Default(const node& xNode) m_Eval.add( "", "Default");
Die Erweiterung von Funktions-Tabellen durch neue Funktionen wird erleichtert durch den Funktions-Tabellen-Assistenten
. visit(const node& xNode ... )
Der Aufruf einer Funktion der Tabelle erfolgt durch einen Aufruf der visit-Methode der Tabelle selbst. Je nach dem Wert, den das Label des übergebenen Knotens hat, wird der visit-Aufruf automatisch in einen Aufruf der Methode umgeleitet, die in der Tabelle dem Wert zugeordnet ist.
Fortsetzung des obigen Beispiels:
node n( "Variable", ...); m_Eval.visit( n );
ist äquivalent zu
if ( n.label() == "Variable") VisitVariable( n ); else Default( n );
Im exportierten C++Code entspricht mstrfun die Klasse CTT_Mstrfun.
|
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |