2017-02-13 75 views
2

我有一個有點簡單的問題,我無法找到任何答案。在解析更大的語法時,我發現解析任何大於15個字符的字符串會導致解析器返回失敗。解析器是這樣的:用boost-spirit解析超過15個字符的字符串

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(); 

您使用迭代器,這不是存儲在一個臨時的。