2017-02-13 9 views
2

Ich habe ein etwas einfaches Problem, dass ich irgendwie keine Antworten finden kann. Während ich an der Analyse einer größeren Grammatik arbeitete, entdeckte ich, dass das Parsen einer beliebigen Zeichenfolge mit mehr als 15 Zeichen dazu führen würde, dass der Parser als fehlgeschlagen zurückkehrte. Der Parser sieht wie folgt aus:Parsing String mit mehr als 15 Zeichen mit Boost-Geist

namespace parser { 
    template <typename Iterator> 
    struct p_grammar : qi::grammar<Iterator, standard::space_type> { 
     p_grammar() : p_grammar::base_type(spec) { 
      spec = "qwertyuiopasdfgh"; 
     } 
     qi::rule<Iterator, standard::space_type> spec; 
    }; 

Und wird aus einer anderen Funktion ausgeführt werden:

void MainWindow::parserTest() { 
    typedef parser::p_grammar<std::string::const_iterator> p_grammar; 
    p_grammar grammar; 
    using boost::spirit::standard::space; 
    std::string::const_iterator iter = editor->toPlainText().toStdString().begin(); 
    std::string::const_iterator end = editor->toPlainText().toStdString().end(); 

    if (phrase_parse(iter,end,grammar,space)) { 
     outputLog->append("Parsing succesfull"); 
    } else { 
     outputLog->append("Parsing failed"); 
    } 
} 

Entfernen des letzten Zeichens in „qwertyuiopasdfgh“, so dass nur 15 Zeichen vorhanden sind, macht es ohne Fehler analysieren .

Fühlen Sie sich wie ich etwas offensichtliches hier übersehe.

Antwort

3

Sie sollten gültig Iteratoren werden:

std::string value = editor->toPlainText().toStdString() 
std::string::const_iterator iter = value.begin(), end = value.end(); 

Sie wurden Iteratoren in eine temporäre verwenden, die nicht gespeichert wurden.

Verwandte Themen