2016-10-26 9 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) 컴파일하지 않았다 : 부호없는 int i; auto r = x3 :: parse (시작, in.end(), x3 :: (std :: ref (i)) [x3 :: byte_]); with.hpp : 60 : 33 : 오류 : 'boost :: spirit :: x3 :: context (this-> val, context) 유형의 비 const 참조 초기화가 잘못되었습니다. "실제 예상되는 동작은 무엇입니까?": 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]; 

이 규칙은 중첩 될 수 없습니다 또는 로컬 변수를 덮어 쓰게됩니다.