Frage zu boost::spirit



  • So ein Blödsinn. Du kannst sehr wohl auch komplexere Datentypen als result type benutzen. Die einfachste Möglichkeit dafür ist sicher functor_parser. Das sieht dann zum Beispiel so aus:

    namespace bs = boost::spirit;
    
    struct vektorparsefunctor {
      typedef std::vector<int> result_t; // Typ definieren
    
      template<typename ScannerT>
      int operator(const ScannerT &scan, result_t &result) const { //...und den entsprechenden Operator
        if(scan.at_end()) return -1;
        result.clear();
    
        bs::parse_info<typename ScannerT::iterator_t> info =
        bs::parse(scan.first, scan.last,
                  bs::ch_p('(') >>
                  bs::int_p[bs::push_back(result)] >> ',' >>
                  bs::int_p[bs::push_back(result)] >> ',' >>
                  bs::int_p[bs::push_back(result)] >> ')',
                  bs::space_p);
        if(info.hit) {
          scan.first = info.stop;
          return info.length;
        }
    
        return -1;
      }
    };
    
    bs::functor_parser<vektorparsefunctor> vektor_p; // dann in den Funktor-Parser zwängen
    

    ...und voila, du hast nen Parser, der std::vector<int> als Ergebnis hat und Ausdrücke der Form (1, 2, 3) parst. Nichts mehr mit auseinanderfummeln.



  • dead? was hat dein post mit dem problem zu tun? 😕

    und wie du auf diese aussage kommst, frag ich mich schon seit nunmehr 5 minuten...

    So ein Blödsinn. Du kannst sehr wohl auch komplexere Datentypen als result type benutzen

    vortallem, weil in diesem bezug nichts gesagt wurde. und was nicht gesagt wurde kann nicht blödsinns ein.



  • otze schrieb:

    functor 3 bekommt dann alel daten die functor 1 oder 2 bekämen als einen string,leider nicht als token,was bedeuted,dass man das ganze dann selbst wieder auseinanderfriemeln muss 😞

    Darauf bezog ich mich.



  • functor 3 bekommt die daten auch nur als string. als nichts anderes, weil bei compounded parsern nur strings bzw stringiteratoren übergeben werden.

    es gibt nur ganz wenig parser, die andere functoren annehmen.



  • @mastah

    ganz vergessen: schau dir das an:
    http://www.boost.org/libs/spirit/doc/phoenix.html

    vielleicht machts dir sie sache einfacher.

    und hier wird etwas ähnliches gemacht, wie dus machen willst(naja, fast^^):
    http://www.boost.org/libs/spirit/doc/closures.html

    //edit2 spirit isn monster,mehr sag ich dazu nichmehr. vielleicht kann spirit jede aufgabe erledigen, vielleicht auch nicht. vielleicht gehts wirklich in verbindung mit phönix super einfach, aber wer weis? spirit scheint mehr als ein parser zu sein, der schlicht irgendwo daten speichert,das ding ist eine touringmaschine. die stärke spielt spirit aber leider erst in den letzten kapiteln aus, und bis dahin ist es ein weiter weg



  • otze schrieb:

    functor 3 bekommt die daten auch nur als string. als nichts anderes, weil bei compounded parsern nur strings bzw stringiteratoren übergeben werden.

    es gibt nur ganz wenig parser, die andere functoren annehmen.

    Deswegen macht es ja auch Sinn, sich eigene Parser für eigene Datentypen und patterns zu schreiben.

    Was spirit ansonsten angeht, es ist nicht sonderlich einfach zu lernen, das ist richtig. Das liegt aber in der Natur der Sache, Sprachen und Parser sind halt nicht die einfachste Materie. Wenn man spirit aber einmal begriffen hat, ist es geradezu unglaublich einfach, darin sehr komplizierte Parser zu schreiben, und darum gehts ja.



  • Deswegen macht es ja auch Sinn, sich eigene Parser für eigene Datentypen und patterns zu schreiben.

    phönix machts besser.jede wette.



  • Auch auf die Gefahr hin, das ich damit den Thread aus dem C++ Forum nach "Rund um katapultiere" 🙂 :

    Ich schreibe derzeit auch zig parser selber (lesen von Dateien, Nutzereingaben u.s.w.). Ich hab mich jetzt mal ein bisschen mit boost::spirit und lex/yacc beschäftigt.
    Auch wenn die Frage an sich blöd ist : Ab welcher Komplexität lohnt sich der Einsatz von Spirit? Es nervt einfach, jedesmal das Rad neu zu erfinden. Ich bin von den Möglichkeiten die Spirit u. ähnliche Tools bieten fasziniert, aber im Moment bin ich bei einfacheren Parsingaufgaben einfach schneller es selbst zu machen und bei größeren (z.b. XML Parser) nehme ich lieber eine spezielles Tool.



  • wenn man spirit komplett beherrscht, so kann es jede kleine bis mittelgroße parsinggeschichte machen. mit spirit ist man schneller.

    weitere spiritanwendungen sind auch jene, wo ein string direkt geparst und berechnet werden können muss,spirit kann dir alles in einem rutsch machen.

    yacc etc sind bei sehr großen parsern interessant, da sie ideale maschienen produzieren.



  • Vermutlich richtig. Man (bzw. Ich) muß vermutlich der Versuchung wiederstehen bei einfachen Parsingaufgaben erstmal schnell was selbst zu zimmern.

    Vermutlich wie bei den meisten Tools: In der Lernphase braucht man erstmal ein vielfaches an Zeit, als man ohne sie gebraucht hätte :).


Anmelden zum Antworten