gpt4 book ai didi

c++ - 使用 boost spirit x3 解析逗号分隔的 0 个或多个列表

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:15 26 4
gpt4 key购买 nike

我经常需要解析逗号分隔的0 or more list在提升精神 x3。我知道 %-operator它解析 1 or more list进入 std::vector .当我需要 0 or more list我目前是这样做的-(element_parser % separator) ,它做我想做的,但解析成 boost::optional<std::vector> ,这不是我所追求的。那么我怎样才能制作一个解析器,它解析一个逗号分隔的 0 or more list使用 boost spirit x3 变成一个普通的 std::vector。

最佳答案

也许我遗漏了一些东西,但使用 - 对我来说工作正常:

#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

#include <boost/spirit/home/x3.hpp>

namespace x3 = boost::spirit::x3;

const x3::rule<class number_list_tag, std::vector<int>> integer_list = "integer_list";
const auto integer_list_def = -(x3::int_ % ',');
BOOST_SPIRIT_DEFINE(integer_list);

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
bool first = true;
os << '[';
for (const T& x : vec)
{
if (first)
first = false;
else
os << ", ";

os << x;
}
os << ']';
return os;
}

std::vector<int> parse(const std::string& src)
{
std::vector<int> result;
auto iter = src.begin();
bool success = x3::phrase_parse(iter, src.end(), integer_list, x3::space, result);
if (!success || iter != src.end())
throw std::runtime_error("Failed to parse");
else
return result;
}

int main()
{
std::cout << "\"\":\t" << parse("") << std::endl;
std::cout << "\"5\":\t" << parse("5") << std::endl;
std::cout << "\"1, 2, 3\":\t" << parse("1, 2, 3") << std::endl;
}

输出是:

"":     []
"5": [5]
"1, 2, 3": [1, 2, 3]

关于c++ - 使用 boost spirit x3 解析逗号分隔的 0 个或多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41682723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com