Was sind eure lieblings boost funktionen?


  • Administrator

    Badestrand schrieb:

    Dann sag doch mal, was du unter einer komplexen Grammatik verstehst. Der Spirit-Code um C++-Quelltext zu parsen ist jedenfalls noch recht übersichtlich.

    Zum Beispiel ein XML-Parser. Wenn meiner auch nicht ganz zu 100% Standardkonform ist, aber so gut wie möglich. Kommt an den TinyXML Parser ran.

    Ich wollte meinen Parser durch einen Boost.Spirit Parser ersetzen, ca. nach einem Drittel habe ich es abgebrochen. Habe lieber 10-15 private Funktionen, welche den Parser implementieren. Das andere sah einfach nur hässlich aus.

    Badestrand schrieb:

    PS: Und wie sieht das Gleiche in XPression aus?

    Gerade für sowas ist Xpressive extrem geeignet. Das würde wohl irgendwie so aussehen:

    #include <boost/xpressive/xpressive.hpp>
    
    #include <string>
    #include <iostream>
    
    int main()
    {
      std::string line = "GET /path/to/file/index.html HTTP/1.0";
    
      using namespace boost::xpressive;
    
      sregex verb = as_xpr("GET") | "POST";
      sregex path = *(alnum | '/' | '-' | '.');
      sregex version = as_xpr("HTTP/1.0") | "HTTP/1.1";
    
      sregex r = (s1 = verb) >> +space >>
                 (s2 = path) >> +space >>
                 (s3 = version);
    
      // Das oben finde ich schön strukturiert, so s1,s2,s3 übereinander.
      // Aus fairness aber auch noch iner einer Zeile, wo es immer noch deutlich kürzer ist.
    
      /*
      sregex r = (s1 = verb) >> +space >> (s2 = path) >> +space >> (s3 = version);
      */
    
      smatch what;
    
      if(regex_match(line, what, r))
      {
        std::cout << what[1] << std::endl;
        std::cout << what[2] << std::endl;
        std::cout << what[3] << std::endl;
      }
      else
      { std::cout << "Match failed!" << std::endl; }
    
      return 0;
    }
    

    Man beachte, wie man die Werte wunderbar herausfiltern kann. Keine mühsamen Funktoren an die Grammatik binden. Sicher ist das einer der grossen Stärken von Spirit, aber auf der anderen Seite gerade etwas, was die Übersichtlichkeit extrem verschlechtert.

    Anstatt einer Grammatik, welche man extrem schlecht mit Funktoren oder irgendetwas dynamisches verbinden kann, lieber viele verschiedene statische Xpressiv Ausdrücke aufgeteilt auf verschiedene Funktionen. Vor allem ist die dynamik dann viel einfacher, da man die Grammatik während der Laufzeit mit normalen C++ Mitteln verändern kann. Und dabei meine ich nicht nur if, while, for usw. sondern man kann auch Regex Ausdrücke mit den statischen mischen.

    Mag sein, dass Spirit dafür etwas schneller ist, aber ich habe lieber einen etwas langsameren Code, dafür eine Übersicht.

    Grüssli



  • Cool, sieht ja von der Syntax recht ähnlich aus. Die Sache mit (s1=rule) statt (rule[assign_a(var)] sieht auch schöner aus, obwohl es sich nicht viel nimmt.
    Da die Tokens erst hinterher herausgefiltert werden (what[x]), funktioniert das denn noch halbwegs komfortablel bei einer Liste, z.B. wenn unbestimmt viele Pfade (in dem HTTP-Beispiel) möglich sind, oder auch *int_val >> *float_val ?
    Wie dem auch sei, ich werd's mir mal näher angucken, sieht vielversprechend aus 🙂



  • Ich nutze vor allem die Tools, die einem das normale C++-Programmiererleben leichter machen und weniger die Speziallibraries: boost::noncopyable, boost/cstdint.hpp, boost::tuple, shared_ptr/scoped_ptr, STATIC_ASSERT, type_traits, mpl etc.

    Badestrand schrieb:

    Dravere schrieb:

    Ja, genau diese wunderschönen Zeilen! Und das ist noch eine einfache Grammatik, mach das mal mit komplexen Grammatiken.

    Dann sag doch mal, was du unter einer komplexen Grammatik verstehst. Der Spirit-Code um C++-Quelltext zu parsen ist jedenfalls noch recht übersichtlich.

    PS: Und wie sieht das Gleiche in XPression aus?

    Es gibt einen Spirit-Code um C++-Quelltext zu parsen? Link bitte!





  • Phoemuex schrieb:

    http://spirit.sourceforge.net/repository/grammars/show_contents.php

    EDIT: Ist aber nicht wirklich toll...

    Den finde ich sogar noch vergleichsweise hübsch, aber viel mehr als Schlüsselwörter erkennen und sowas macht der ja auch nicht.

    Ansonsten gibt es noch Boost.Wave (C/C++-Präprozessor) und Hannibal. Und da ist's dann auf einmal schon nicht mehr ganz so schön...



  • rüdiger schrieb:

    Es gibt einen Spirit-Code um C++-Quelltext zu parsen? Link bitte!

    Den Link hab ich nicht mehr, hatte ich irgendwo bei Google.de/CodeSearch gefunden. Ich schau mal, ob ich ihn auf die Schnelle noch mal finde.

    edit: Finde ihn grad nicht mehr 😕



  • Hat hier irgendwer nen Vorschlag, wo ich mich am besten (bevorzugt im Internet und erstma ohne Buch) in solche generellen Pars-Grammatik-Ideen einlesen kann? Im Moment versteh ich nur Bahnhof, wenn ich die Spirit-Docu anschaue.



  • Frägst du gerade, was reguläre und kontextfreie Grammatiken sind? EBNF, Automaten und Parsing? Oder willst du es speziell auf Spirit bezogen haben?



  • minhen schrieb:

    Frägst du gerade, was reguläre und kontextfreie Grammatiken sind? EBNF, Automaten und Parsing? Oder willst du es speziell auf Spirit bezogen haben?

    allgemein. wenn es ein allumfassendes spirit-tutorial gibt wäre das natürlich perfekt. deine frage war jedoch auch ne gute antwort, jetzt hab ich paar google suchwörter 🤡



  • In dem Fall liefer ich doch noch gerne ein paar mehr Stichwörter, die jedoch thematisch ohnehin zusammenhängen. Schau dir doch zuerst reguläre Sprachen und Grammatiken an (Chomsky-Hierarchie Typ 3), dann kontextfreie Grammatiken (Typ 2). Typ 1 und 0 sind nett, aber für die konkrete Anwendung hier unwichtig. Dann schau dir kurz EBNF noch an. Und schließlich endliche Automaten und Kellerautomaten. Sehr aufschlussreich ist, wie man einen regulären Ausdruck zu einer regulären Grammatik bekommt und wie man daraus einen endlichen Automaten erzeugen kann, der die Grammatik erkennt. Analog kann man sich einen Parser vorstellen, der EBNF als Eingabe erhält, und zu dieser Eingabe Programmcode erzeugt, welcher die Grammatik erkennt. Zu dem Thema kann man natürlich noch ganze Bücher mehr sagen. Aber ich denke, wenn du dir das so angeschaut hast, wirst du schon eine gute Vorstellung von der Sache haben.



  • minhen schrieb:

    In dem Fall liefer ich doch noch gerne ein paar mehr Stichwörter, die jedoch thematisch ohnehin zusammenhängen. Schau dir doch zuerst reguläre Sprachen und Grammatiken an (Chomsky-Hierarchie Typ 3), dann kontextfreie Grammatiken (Typ 2). Typ 1 und 0 sind nett, aber für die konkrete Anwendung hier unwichtig. Dann schau dir kurz EBNF noch an. Und schließlich endliche Automaten und Kellerautomaten. Sehr aufschlussreich ist, wie man einen regulären Ausdruck zu einer regulären Grammatik bekommt und wie man daraus einen endlichen Automaten erzeugen kann, der die Grammatik erkennt. Analog kann man sich einen Parser vorstellen, der EBNF als Eingabe erhält, und zu dieser Eingabe Programmcode erzeugt, welcher die Grammatik erkennt. Zu dem Thema kann man natürlich noch ganze Bücher mehr sagen. Aber ich denke, wenn du dir das so angeschaut hast, wirst du schon eine gute Vorstellung von der Sache haben.

    hört sich ja nach viel hartem tobak an... werd ich mir mal antun 🤡 danke nochmals.



  • TravisG schrieb:

    hört sich ja nach viel hartem tobak an... werd ich mir mal antun 🤡 danke nochmals.

    Ach was. Ist eigentlich alles halb so wild. Musst nur aufpassen, dass du nicht plötzlich bei Berechenbarkeitstheorie oder Compilerbau landest. Und vorausgesetzt, du hast die üblichen Vorurteile gegenüber Geisteswissenschaft. Dann erinner dich einfach daran, dass Chomsky Professor für Linguistik ist. Und wenn ein Geisteswissenschaftler kein Problem mit dem Kram hat, dann doch erst recht nicht du, oder? 😉 😃


Anmelden zum Antworten