Parsen von Ausdrücken 'aa', 'bb' aber nicht 'ab', 'ba' (mit boost.Spirit)
-
Hallo,
ich versuche mich derzeit an einer Regel, die Ausdrücke
parst, in denen zweimal das gleiche Zeichen hintereinander
vorkommt.Problem ist, dass ich eine größere Menge von Zeichen habe
(z.B. [a-zA-Z]) und nicht alle Paare einzeln definieren kann und möchte.Ich suche also eine Regel, die einen zweistelligen Ausdruck nur
dann parst, wenn beide Zeichen übereinstimmen und nicht wenn zwei
beliebige Zeichen aus der Grundmenge hintereinander auftreten.Erster Ansatz war
rule<> r = anychar_p >> anychar_p;was natürlich sämtliche Paare parst, aber eben auch alles andere

Zweiter Ansatz war (pseudo-code)
rule<> r = anychar_p >> (anychar_p - <vorheriges_zeichen>);Aber ich weiß nicht, wie oder ob <voriges_zeichen> in Spirit darstellbar ist.
Könnte ein Phoenix Parser so etwas?
Quasi in der Artrule<> r = anychar_p[var(x)=arg1] >> anychar_p[var(x)!=arg1];Vielleicht kann jemand helfen?
Gruß,
Pisaro
-
Hi,
das kannst du mit den Funktoren für Spirit machen. In etwa so:
#include <boost/spirit.hpp> #include <iostream> using namespace std; using namespace boost::spirit; struct getChar { char& character; getChar(char& char_) : character(char_){} template <typename IteratorT> void operator()(IteratorT character) const { this->character = character; } }; int main() { char p; struct getChar c(p); rule<> r = anychar_p[c] >> chlit<char>(p); if(parse("ab", r).full) cout << "Rigth" << endl; else cout << "wrong" << endl; }Gruß
Tobi