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>, которое синтезирует правило.


person LChris314    schedule 04.02.2016    source источник


Ответы (1)


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

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

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

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

auto zerosum = [](auto &ctx) { 
    auto& v = x3::_attr(ctx); 
    _pass(ctx) = std::accumulate(v.begin(), v.end(), 0) == 0;
};
person sehe    schedule 07.02.2016
comment
Спасибо за ответ и извините, что приняли так поздно. Я попробую, как только вернусь с ноутбуком :) - person LChris314; 21.02.2016
comment
Без проблем. Надеюсь, ваш ноутбук и вы не переживете многолетний развод :) - person sehe; 21.02.2016