X3解析“ int_”的规则,然后重复等于该“ int_”的双精度值

时间:2018-08-15 16:53:14

标签: c++ boost boost-spirit boost-spirit-x3

种类繁琐的标题,但我想解析如下内容:

int_ >> repeat(N)[double_]

但是我希望N等于int_解析为的任何内容

如何使用Boost.Spirit.X3做到这一点?

1 个答案:

答案 0 :(得分:1)

在解析之后更容易进行验证。也就是说,只需解析而不限制计数,然后进行验证:

auto const p = x3::int_ >> *x3::double_;

// ...
std::pair<int, std::vector<double>> result;

if (x3::phrase_parse(begin, end, p, x3::space, result)) {
    if (result.first != result.second.size()) {
        // invalid
    }
}

如果您确实想在解析时对此进行验证,则可以使用语义操作:

int size;
auto const store_size = [&size](auto& ctx) { size = _attr(ctx); };
auto const validate_size = [&size](auto& ctx) {
    if (size >= 0 && static_cast<std::size_t>(size) != _attr(ctx).size()) {
        _pass(ctx) = false;
    }
};
auto const p = x3::int_[store_size] >> (*x3::double_)[validate_size];