Hallo zusammen,
Ich arbeite gerade fuer einen Kunden an einer Template-Bibliothek (in C). Dazu
haette ich zwei Fragen.
Die erste betrifft das Setzen von Template-Variablen. Ich benutze im Moment
einen Array von Variablen, um alle Variablen zu speichern. Per Insertion Sort
suche ich fuer jede neue Variable den richtigen Platz und fuege sie dort ein.
In der getter-Methode fuer Variablen benutze ich dann ein Binary Search um die
gewuenschte Variable zu suchen.
Das Problem ist jetzt aber, dass ich zum einfuegen neuer Variablen am Anfang
oder am Ende des Arrays ja den kompletten Array umkopieren muss (mache ich mit
memcpy()). Das ist natuerlich, je nach Groesse des Arrays, sehr langsam. Dem
wuerde eine verkettete (ob einfach oder doppelt, ist in dem Fall egal) Liste ja
ziemlich abhelfen. Allerdings weiss ich zum Suchen in Listen keinen sinnvollen
Such-Algorithmus ausser einer linearen Suche, die ueber alle Elemente iteriert.
Meine Frage waere nun, ob es fuer verkettete Listen nicht einen sinnvolleren
Such-Algorithmus gibt, auf den ich nur noch nicht gekommen bin und ob es sich
lohnen wuerde, eine Liste statt eines Arrays zu verwenden.
Die zweite Frage ist etwas komplexer. Ich verwende einen von einem Lex
generierten Tokenizer und speichere den potentiellen Programmablauf in einem
Array von Baeumen. Beispielsweise saehe dieses Programm
<$ set $var = "abc".$var."blahr"; print $var; $>
in einem Syntaxbaum so aus:
Knoten 1 (Typ SET) -> Knoten 2 (Typ PRINT)
/ \ /
$var1 Operator . $var
/ \
"abc" Operator .
/ \
$var "blahr"
Ich speichere also im Grunde einen Array von Ausdruecken, wobei jeder Ausdruck
aus einem Baum besteht (mit minimal einem Knoten). Ich habe allerdings ein
Problem damit, ifs abzubilden. Kann mich vielleicht mal jemand darauf stossen,
wie ein Baum fuer ein if aussehen kann? Es soll nur if-else-endif moeglich
sein, kein elsif oder so. Das muesste ueber else if abgebildet werden.
Krein Problem bereitet es mir, den true- oder den false-Zweig abzubilden. Das
waeren einfach wieder Arrays von Baeumen, einfach eine Ebene tiefer als das if
selber. Probleme bereitet mir nur das Darstellen des Ausdrucks, der die
Bedingung praesentiert, also z. B. $var == 1 in if($var == 1).
Gruesse,
CK