我有一个简单的问题,我在某种程度上找不到任何答案。在解析更大的语法时,我发现解析大于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个字符存在,使其解析而不失败。
感觉我在这里忽略了一些明显的东西。
答案 0 :(得分:3)
您应该使用有效的迭代器:
std::string value = editor->toPlainText().toStdString()
std::string::const_iterator iter = value.begin(), end = value.end();
您正在将迭代器用于未存储的临时文件中。