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 Art

    rule<> 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


Anmelden zum Antworten