Boost Spirit X3 локальные переменные и получение синтезированного атрибута

Я пытаюсь портировать парсер от Spirit V2 на X3. Общий опыт довольно хороший, но есть две проблемы.

Во-первых, локальные переменные исчезли, что для меня довольно неудобно, так как я использовал их довольно часто для отслеживания вещей. Поэтому я прошу кое-что, что сделало бы работу местных жителей в V2.

Другой лучше всего проиллюстрировать на этом фиктивном примере: я хочу разобрать список целых чисел через запятую в vector<int>, но он должен анализироваться только при суммировании списка до нуля:

auto const int_list = rule<class int_list, vector<int>>("int_list")
= int_ % ','
>> eps(/* How to extract the attribute? */);

Я застрял с последней проверкой здесь, так как я не знаю, как достать vector<int> правило синтезирует.

1

Решение

У меня были такие же выводы!

Хитрость с «местными жителями» заключается в использовании with<> директивы.

Поскольку вы не даете сценарий использования, я не думаю, что стоит придумывать примеры, хотя вы можете искать их ответы в моих *

Хитрость со вторым заключается в том, чтобы просто использовать семантическое действие (которое может быть лямбда-выражением) и назначить _pass: Boost Spirit X3 не может скомпилировать директиву повтора с переменным фактором показывает это тоже:

auto zerosum = [](auto &ctx) {
auto& v = x3::_attr(ctx);
_pass(ctx) = std::accumulate(v.begin(), v.end(), 0) == 0;
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector