Правило X3 для разбора `int_`, а затем повторяющихся удвоений, равных этому `int_`

Немного сложное название, но я хочу разобрать что-то вроде этого:

int_ >> repeat(N)[double_]

Но я бы хотел, чтобы N было равно тому, что int_ анализирует до

Как это сделать с помощью Boost.Spirit.X3?


person ExBigBoss    schedule 15.08.2018    source источник
comment
stackoverflow.com/questions/33624149/   -  person llonesmiz    schedule 15.08.2018


Ответы (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];
person Justin    schedule 15.08.2018