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;
};
我正在尝试将解析器从 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;
};