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

因为您没有给出使用情况,所以我不认为想出示例是值得的,尽管您可以搜索我的答案*

  • Boost Spirit X3 cannot compile repeat directive with variable factor
  • Boost Spirit X3 AST not working with semantic actions when using separate rule definition and instantiation
  • Using boost spirit for a stack based language

  • 第二个技巧是仅使用语义 Action (可以是lambda)并分配_pass:Boost Spirit X3 cannot compile repeat directive with variable factor也显示了这一点:
    auto zerosum = [](auto &ctx) {
        auto& v = x3::_attr(ctx);
        _pass(ctx) = std::accumulate(v.begin(), v.end(), 0) == 0;
    };
    

    关于c++ - Boost Spirit X3局部变量并获取综合属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35208162/

    10-13 08:12