如何使用parse/phrase_parse函数
How to use the parse/phrase_parse function
具体来说,使用语法g,我该如何解析字符串s?我应该给出什么论据?我试了很多电话,但总是出错。
此外,由于我还不确定我稍后会使用哪一个,所以使用 phrase_parse
会有什么不同吗?
namespace qi = boost::spirit::qi;
int main() {
My_grammar<std::string::const_iterator> g;
std::string s = "a"; // string to parse
if (qi::parse( /*...*/ )) {
std::cout << "String parsed !";
} else {
std::cout << "String doesn't parse !";
}
return EXIT_SUCCESS;
}
基本上,您应该查看教程,但部分问题是,您或多或少需要创建一个变量来保存开始迭代器。因为,它是通过对 qi::parse
的引用传递的,而它确切停止的地方可以认为是 qi::parse
函数的输出。如果您尝试通过 s.begin()
传递它,它将不起作用,因为您正试图将引用绑定到临时对象。
namespace qi = boost::spirit::qi;
int main() {
My_grammar<std::string::const_iterator> g;
std::string s = "a"; // string to parse
std::string::const_iterator it = s.begin(); // The type declaration here
std::string::const_iterator end = s.end(); // and here needs to match template parameter
// which you used to instantiate g
if (qi::parse( it, end, g )) {
std::cout << "String parsed !";
} else {
std::cout << "String doesn't parse !";
}
return EXIT_SUCCESS;
}
仅当您想明确指定跳过语法时才使用 phrase_parse
。
是的,会有区别。
phrase_parse
使用船长,可能不会消耗所有输入,但仍然 return 正确。
在所有其他方面,两者完全相同。你真的应该点击文档:
std::string::const_iterator f(s.begin(), l(s.end());
if (qi::parse(f, l, g/*, optional, bound, attribute, references*/))
具体来说,使用语法g,我该如何解析字符串s?我应该给出什么论据?我试了很多电话,但总是出错。
此外,由于我还不确定我稍后会使用哪一个,所以使用 phrase_parse
会有什么不同吗?
namespace qi = boost::spirit::qi;
int main() {
My_grammar<std::string::const_iterator> g;
std::string s = "a"; // string to parse
if (qi::parse( /*...*/ )) {
std::cout << "String parsed !";
} else {
std::cout << "String doesn't parse !";
}
return EXIT_SUCCESS;
}
基本上,您应该查看教程,但部分问题是,您或多或少需要创建一个变量来保存开始迭代器。因为,它是通过对 qi::parse
的引用传递的,而它确切停止的地方可以认为是 qi::parse
函数的输出。如果您尝试通过 s.begin()
传递它,它将不起作用,因为您正试图将引用绑定到临时对象。
namespace qi = boost::spirit::qi;
int main() {
My_grammar<std::string::const_iterator> g;
std::string s = "a"; // string to parse
std::string::const_iterator it = s.begin(); // The type declaration here
std::string::const_iterator end = s.end(); // and here needs to match template parameter
// which you used to instantiate g
if (qi::parse( it, end, g )) {
std::cout << "String parsed !";
} else {
std::cout << "String doesn't parse !";
}
return EXIT_SUCCESS;
}
仅当您想明确指定跳过语法时才使用 phrase_parse
。
是的,会有区别。
phrase_parse
使用船长,可能不会消耗所有输入,但仍然 return 正确。
在所有其他方面,两者完全相同。你真的应该点击文档:
std::string::const_iterator f(s.begin(), l(s.end());
if (qi::parse(f, l, g/*, optional, bound, attribute, references*/))