使用 boost-spirit 解析超过 15 个字符的字符串
Parsing string with more then 15 characters with boost-spirit
我有一个有点简单的问题,但我不知何故找不到任何答案。在解析更大的语法时,我发现解析任何大于 15 个字符的字符串都会导致解析器 return 失败。解析器如下所示:
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 个字符,使其解析无误。
感觉我在这里忽略了一些明显的东西。
您应该使用有效的迭代器:
std::string value = editor->toPlainText().toStdString()
std::string::const_iterator iter = value.begin(), end = value.end();
您在未存储的临时文件中使用迭代器。
我有一个有点简单的问题,但我不知何故找不到任何答案。在解析更大的语法时,我发现解析任何大于 15 个字符的字符串都会导致解析器 return 失败。解析器如下所示:
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 个字符,使其解析无误。
感觉我在这里忽略了一些明显的东西。
您应该使用有效的迭代器:
std::string value = editor->toPlainText().toStdString()
std::string::const_iterator iter = value.begin(), end = value.end();
您在未存储的临时文件中使用迭代器。