2016-10-26 48 views
0

我想解析一個使用精靈x3的二進制數據,我遇到了一個問題,我找不到解析長度相關數據結構的方式,像[uint32 - 計數器] [計數器長度數據]。使用精靈x3解析長度相關的數據結構

是否可以將屬性從一個解析器(x3 :: little_dword)傳遞到像x3 :: repeat(???)[byte_]之類的東西?

+0

至少顯示你已經嘗試了這麼多,應該是什麼實際的預期行爲。 – makallio85

+0

http://stackoverflow.com/questions/33624149/boost-spirit-x3-cannot-compile-repeat-directive-with-variable-factor – llonesmiz

+0

@ makallio85,我見過這個問題。用_ <>方法,它並沒有爲我編譯,可能是由於舊的提升(debian中的1.61): unsigned int i; auto r = x3 :: parse(start,in.end(),x3 :: with (std :: ref(i))[x3 :: byte_]); with.hpp:60:33:error:類型'boost :: spirit :: x3 :: context (this-> val,context) 至於「應該是什麼應該是實際的預期行爲」:x3 :: repeat指令應支持具有整數綜合屬性的任何解析器用於計數器參數:) –

回答

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]; 

這條規則不能嵌套或局部變量將被覆蓋。