使用精神x3解析长度相关的数据结构

时间:2016-10-26 03:45:39

标签: boost-spirit-x3

我正在尝试使用精灵x3解析二进制数据,并且我遇到了一个问题,我无法找到解析长度相关数据结构的方法,例如[uint32-counter] [counter-length data ]

是否可以将属性从一个解析器(x3 :: little_dword)传递到类似x3 :: repeat(???)[byte _]的内容?

1 个答案:

答案 0 :(得分:0)

您可以使用语义操作来存储预期的列表长度和解析的列表项的数量,然后使重复项的解析器在最后一个条目之前失败。 未经测试的代码:

unsigned expected_length;
unsigned current_length;
auto store_length   = [&](auto& ctx) { expected_length = _attr(ctx); _pass(ctx) = (expected_length > 0); };
auto check_for_last = [&](auto& ctx) { _pass(ctx) = (++current_length < expected_length); };
auto last_item      = [&](auto& ctx) { _pass(ctx) = (current_length == expected_length); }

auto r = little_dword[store_length] >> +(my_item[check_for_last]) >> my_item[last_item];

此规则不能嵌套,否则将覆盖局部变量。