2017-02-13 4 views
2

У меня есть несколько простая проблема, с которой я как-то не могу найти ответы. Работая над разбором более крупной грамматики, я обнаружил, что синтаксический анализ любой строки больше, чем 15 символов, приведет к тому, что парсер вернется с ошибкой. Анализатор выглядит следующим образом:Синхронизация строки с более чем 15 символами с boost-spirit

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; 
    }; 

И будет работать из другой функции:

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"); 
    } 
} 

Удаление последнего символа в «qwertyuiopasdfgh», так что только 15 символов присутствуют, делает его разобрать без разрушения ,

Почувствуйте, что я не замечаю здесь ничего очевидного.

ответ

3

Вы должны использовать действительные итераторы:

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

Вы использовали итераторы в временный, который не был сохранен.

Смежные вопросы