Interessantes Problem: Generierung von Bäumen aus flachen Daten
(Hinweis: Dies ist kein "ich suche Hilfe"-Thread; ich finde nur, daß das Problem interessant genug ist, um hier diskutiert zu werden.)
Ich bin gerade dabei, ein Programm zu schreiben, das zwischen verschiedenen Textformaten konvertieren kann. Genau gesagt konvertiere ich Text in Drehbuchform zwischen HTML (nur Ausgabe), XML und zwei spezifischen Formaten, TXML (ein nicht standardkonformer XML-Dialekt) und TML (eine völlig eigene Sprache).
Das Programm funktioniert so, daß ich den Text intern als einen Baum von Objekten repräsentiere. Es gibt grundsätzlich fünf Arten von Objekten:
Episode: Ein Blockelement, das die Wurzel jedes Dokuments darstellt. Kann Instanzen von Scene und ggf. Comment beinhalten.
Scene: Ein Blockelement, das eine konkrete Szene beschreibt. Beinhaltet Comment, Line, Event und Camera.
Comment: Ein Kommentar. Äquivalent zu XMLs <!-- -->.
Line: Eine Textzeile, die von jemandem gesprochen wird.
Event: Ein Ereignis.
Camera: Eine Regieanweisung, Kameraeinstellung oder ähnliches.
Ein Beispielbaum mit Metadaten könnte so aussehen:
So weit, so gut. Aus korrektem XML einen derartigen Baum zu generieren ist relativ einfach, allerdings habe ich jetzt vor, einen Baum aus TML zu generieren. Der Haken: TML ist darauf ausgelegt, kompakter als XML zu sein und deshalb nicht hierarchisch.
Hier mal das obige Dokument in TML:
In meinem Fall kann ich ausnutzen, daß die Tiefe des Baums begrenzt ist: Szenen können keine andere Blockelemente beinhalten, also kann ich ein Szenenobjekt definieren, dort alles reinschieben und beim Lesen einer neuen Szenenbeschreibung einfach das Objekt ersetzen.
Was aber im allgemeinen Fall? Natürlich kann man nicht beliebige Bäume unzweideutig in einem nichthierarchischen Format ablegen, aber was ist eurer Meinung nach das Komplexeste, das man sinnvoll machen kann?
(BTW, ich könnte es mir viel einfacher machen und einfach per Regexps TML nach XML umformen, aber mit direktem Einlesen ist alles modularer und erweiterbarer. Und wir wissen ja alles, daß "einfach" und "robust" gegen "theoretisch erweiterbar" nicht anstinken kann.)