Datenstruktur für YAML-Syntax



  • Hi all !

    Ich suche eine Datenstruktur um Informationen aus dem YAML-Format verarbeiten zu können.

    Falls ihr nicht wisst wie YAML aufgebaut ist: klick mich
    Kurz zusammen gefasst: Das YAML-Format besteht aus Listen und Werte-Paaren die ineinander verschachtelt seien können.

    Beispiel:

    - Dies
    - ist
    - eine
    -
        - verschachtelte
    - Liste
    
    date: 2003-07-25
    letters to: #Kommentar: Wert mit Werte-Paaren verschachtelt
        Jim O'Connor: 2
        Myself: 2
    

    Um die Suche nach einer Datenstrucktur zu vereinfachen, kann man die Werte-Paare und die Liste gleich behandeln. Eine Liste ist ein Werte-Paar, mit dem key einer fortlaufenden Nummer. Also:

    - Eine
    - Liste
    
    1 : Eine
    2 : Liste
    

    Das Problem ist nun, da sich ein jeder Map eine weitere Map befinden kann, wie man diese Datenstruktur modellieren sollte. Meine Lösungen wären:

    1. Einen Datentyp entwerfen, der eine Liste von Einträgen, als auch Einträge selbst darstelt. Dabei gefällt mir nicht das ich immer Prüfen muss was ich gerade bearbeite, Liste oder Element.

    class Node
    {
    private:
    	std::list<boost::shared_ptr<Node> > fork;
    	std::string element;
    public:
    	void addNode(const Node& node); // element leeren, node anhängen
    	void setLeaf(const std::string& leaf); // fork leeren, leaf kopieren
    };
    

    2. Einen Basisklasse einführen, und davon eine Klasse für die Liste und für das Element ableiten. Nur was kommt in die Schnittstelle der Basisklasse?

    Darum frage ich jetzt:
    Wüsstet ihr Verbesserungsvorschläge für diese Überlegungen oder bessere Entwürfe?
    Sollten noch Fragen sein werde ich sie nach bestem Wissen beantworten.



  • Ja, sowas könnte man schön mit Strukturen machen, wie man sie in funktionalen Sprachen oft hat.

    du könntest es auch so machen: Es gibt ein Basis, die absolut nichts kann und die von dir besprochenen Derivate. Dann dispatcht du eben immer zur Laufzeit:

    List * list = dynamic_cast<List*>(baseObject);
    if (list) { // handelt sich um eine Liste
       ...
    
    }
    else {
       Element * element = dynamic_cast<Element*>(baseObject);
       if (element) { // handelt sich um ein Element
          ...
    
       }
    }
    

    Ich hatte schonmal darüber nachgedacht, ob man nicht mal einen Typeswitch für C++0x vorschlagen sollte:

    switch (baseObject) {
    case List * list:
       ...
       break;
    case Element * element:
       ...
       break;
    }
    

Anmelden zum Antworten