提升精神 X3 局部变量并获取合成属性

Boost Spirit X3 local variables and getting the synthesized attribute

本文关键字:获取 属性 局部变量 X3      更新时间:2023-10-16

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

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

  • 提升精神X3无法编译具有可变因子的重复指令
  • 提升精神 X3 AST 在使用单独的规则定义和实例化时无法使用语义操作
  • 将提升精神用于基于堆栈的语言

第二个的诀窍是只使用语义操作(可以是 lambda)并分配_pass: Boost Spirit X3 无法编译带有可变因子的重复指令也显示了这一点:

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