Parsing - PHP oder C++ 14



  • Hallo

    Ich will lernen wie man Textdateien bearbeitet. Aufgaben wie sie Linux mit grep oder cat erledigt in größeren Programmen wie sed. Ich will aber kein sed nehmen, sondern lernen wie man das programmiert.

    Nach Recherche fand ich heraus, dass Perl sowie PHP ganz gut für solche Zwecke verwendbar sind. Weitere Recherche brachte mich dazu, dass ich evtl. PHP ins Auge fasse.

    Zu C++: Seit kurzem versuche ich mich von Arrays weg zu bewegen und statt dessen den sequentiellen Container std::vector verwenden möchte. Wenn ich dann einen Vektorbezeichner deklariert habe, kann man ja mit Vektorbezeichner.Mitgliedsfunktion den Vektor bearbeiten.

    Jetzt stellt sich mir deshalb die Frage, ob man mit dieser Herangehensweise ebenfalls "einfache" parsing-Programme schreiben kann in C++ oder ob es doch angebrachter ist PHP zu verwenden?

    Was ich mich halt auch Frage ist, ob das gut geht, wenn in einem Stream unterschiedliche Datentypen sind, also z:b.

    2G!+xkseghhf3.45_bla

    Darin sind ja viele Datentypen enthalten. Ob man das dann so ohne weiteres in einen Vektor packen kann? Ich denke nicht, denn der hat per Definition ja einen festen Datentyp....

    Was meint ihr? PHP oder modernes C++ für parsing?

    Danke und Grüße



  • Ich würde C++ empfehlen. Denn PHP und andere Scriptsprachen sind im Vergleich zu C++ langsamer. Und auch mit C++ kannst du mit regulären Ausdrücken arbeiten!



  • Klar kann man den Vektor verwenden zum Parsen.
    Und die Typprüfung von C++ hat gerade für Anfänger auch viele Vorteile. PHP funktioniert bald mal "irgendwie", später kracht es halt zur Laufzeit.

    Also, zurück zu deiner Frage:
    Mach eine Struktur für verschiedene Datentypen, und dann zerlegst du deinen Eingabetext eben in seine Komponenten und trägst diese in "tokens" ein.
    Das wäre mal ein erster Schritt, ganz ohne reguläre Ausdrücke. Das ist übrigens einer der ersten Schritt eines Compilers, nämlich den Quelltext in seine kleinsten Bestandteile zu zerlegen.

    enum Type {TypeString, TypeInt, TypeFloat, TypeNone};
    
    struct ValueType
    {
      std::string s;
      int i;
      float f;
    
      Type type;  
    };
    
    // hier speicherst du alle geparsten Werte
    std::vector<ValueType> tokens;
    
    // z.B. beim Parsen hast du einen int eingelesen, dieser befindet sich in "myReadInteger"
    ValueType currToken;
    currToken.type=TypeInt;
    currToken.i=myReadInteger;
    
    tokens.push_back(currToken);
    

    Übrigens macht PHP intern ja auch nichts anderes*, dort gibt es auch eine Struktur, die sich darum kümmert, dass du in die gleiche Variable mal einen Integer, mal einen String, mal was ganz anderes reinstecken kannst.

    * http://php.net/manual/de/internals2.ze1.zendapi.php#internals2.ze1.zendapi.example.zval-typedef



  • Wow ___parser___, vielen Dank für diesen Beitrag. Du hast mich gerade ziemlich motiviert parsing mit C++ zu lernen 🙂


Log in to reply