Boost Spirit X3局部变量和获取综合属性

Boost Spirit X3 local variables and getting the synthesized attribute

我正在尝试将解析器从 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> 规则。

我有同样的发现!

"locals" 的技巧是使用 with<> 指令。

因为你没有给出使用场景,我认为不值得举出例子,尽管你可以搜索我的答案*

  • Using boost spirit for a stack based language

第二个技巧是仅使用语义操作(可以是 lambda)并分配 _pass 也显示了这一点:

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