boost::spirit: Lexer oder Parser
-
Hallo,
ich will mit boost::spirit folgendes in Teile zerlegen:
Buchstaben(groß/klein) gefolgt von (leeres Wort oder ' oder , beliebig oft hintereinander) gefolgt von (einer Zahl)
Muss ich dafür den Lexer oder den Parser nehmen?
Für den String dachte ich an [a-zA-Z][,'][0-9]*
Ist das richtig?
-
Das wäre eher eine Aufgabe für einen Lexer.
Ob du das captures was du denkst kannst du mit diversen Online Tools testen. Z.B:
http://rubular.com/
-
Kommt darauf an, was du machen willst. Wenn du den Text lediglich validieren willst, würde ich eher zu ner Regex greifen. Wenn du den Text auch irgendwie zerlegen möchtest, dann zum Parser.
-
Das ist mein Parser:
*alpha >> *(char_(',') | char_*('\'')) >> uint_;Wie verwende ich ihn?
-
So, jetzt bin ich soweit:
#include <boost/spirit/home/qi.hpp> namespace qi = boost::spirit::qi; #include <boost/lambda/lambda.hpp> namespace lambda = boost::lambda; #include <iostream> using namespace std; using lambda::_1; qi::parse(str.begin(), str.end(), (+qi::alpha)[cout << _1 << endl] >> (*(qi::char_(',') | qi::char_('\'')))[cout << _1 << endl] >> qi::uint_[cout << _1 << endl]);Ohne das "[cout << _1 << endl]" funzt es auch, aber mit diesem nicht. Was mache ich falsch? Und kann man statt boost::lambda hier auch die C++11-Lambda-Funktionen benutzen?
-
So, jetzt geht der uint_-Parser mit C++1Lambdas:
qi::parse(str.begin(), str.end(), (+qi::alpha)[[](const string& ton){cout << ton << '\n';}] >> (*(qi::char_(',') | qi::char_('\''))) >> qi::uint_[[](int integer){cout << integer << '\n';}]);Aber der +qi::alpha-Parser funzt noch nicht...
-
*push*
-
Die Lösung: string -> vector<char>
