Я пытаюсь портировать парсер от 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>
правило синтезирует.
У меня были такие же выводы!
Хитрость с «местными жителями» заключается в использовании with<>
директивы.
Поскольку вы не даете сценарий использования, я не думаю, что стоит придумывать примеры, хотя вы можете искать их ответы в моих *
Хитрость со вторым заключается в том, чтобы просто использовать семантическое действие (которое может быть лямбда-выражением) и назначить _pass
: Boost Spirit X3 не может скомпилировать директиву повтора с переменным фактором показывает это тоже:
auto zerosum = [](auto &ctx) {
auto& v = x3::_attr(ctx);
_pass(ctx) = std::accumulate(v.begin(), v.end(), 0) == 0;
};
Других решений пока нет …