使用 boost spirit 解析 int pair to vector
use boost spirit parse int pair to vector
字符串内容如下:
20 10 5 3...
它是一个整数对的列表。如何用spirit解析成std::vector<std::pair<int, int>>
?
std::string line;
std::vector<std::pair<int, int>> v;
boost::spirit::qi::phrase_parse(
line.cbegin(),
line.cend(),
(
???
),
boost::spirit::qi::space
);
您可以做一个简单的解析器表达式,例如 *(int_ >> int_)
(请参阅教程和 these documentation pages)。
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::string line = "20 10 5 3";
std::vector<std::pair<int, int>> v;
qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_), qi::space, v);
for (auto& p : v) {
std::cout << "(" << p.first << ", " << p.second << ")\n";
}
}
版画
(20, 10)
(5, 3)
专业提示 1:有效性
如果您想确保没有 unwanted/unexpected 输入,请检查剩余数据:
解析后检查迭代器
auto f = line.cbegin(), l = line.cend();
qi::phrase_parse(f, l, *(qi::int_ >> qi::int_), qi::space, v);
if (f!=l)
std::cout << "Unparsed input '" << std::string(f,l) << "'\n";
或者简单地要求 qi::eoi
作为解析器表达式的一部分并检查 return 值:
bool ok = qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_) >> qi::eoi, qi::space, v);
专业提示 2:"Look ma, no hands"
因为语法是可以解析成这个数据结构的最简单的东西,你可以让 Spirit 做所有的猜测:
qi::phrase_parse(line.begin(), line.end(), qi::auto_, qi::space, v);
也就是说,一个语法只包含一个 qi::auto_
。输出仍然是:
(20, 10)
(5, 3)
字符串内容如下:
20 10 5 3...
它是一个整数对的列表。如何用spirit解析成std::vector<std::pair<int, int>>
?
std::string line;
std::vector<std::pair<int, int>> v;
boost::spirit::qi::phrase_parse(
line.cbegin(),
line.cend(),
(
???
),
boost::spirit::qi::space
);
您可以做一个简单的解析器表达式,例如 *(int_ >> int_)
(请参阅教程和 these documentation pages)。
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::string line = "20 10 5 3";
std::vector<std::pair<int, int>> v;
qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_), qi::space, v);
for (auto& p : v) {
std::cout << "(" << p.first << ", " << p.second << ")\n";
}
}
版画
(20, 10)
(5, 3)
专业提示 1:有效性
如果您想确保没有 unwanted/unexpected 输入,请检查剩余数据:
解析后检查迭代器
auto f = line.cbegin(), l = line.cend(); qi::phrase_parse(f, l, *(qi::int_ >> qi::int_), qi::space, v); if (f!=l) std::cout << "Unparsed input '" << std::string(f,l) << "'\n";
或者简单地要求
qi::eoi
作为解析器表达式的一部分并检查 return 值:bool ok = qi::phrase_parse(line.cbegin(), line.cend(), *(qi::int_ >> qi::int_) >> qi::eoi, qi::space, v);
专业提示 2:"Look ma, no hands"
因为语法是可以解析成这个数据结构的最简单的东西,你可以让 Spirit 做所有的猜测:
qi::phrase_parse(line.begin(), line.end(), qi::auto_, qi::space, v);
也就是说,一个语法只包含一个 qi::auto_
。输出仍然是:
(20, 10)
(5, 3)