의미있는 동작을 사용하여 예상 된 목록 길이와 구문 분석 된 목록 항목 수를 저장 한 다음 마지막 항목 이전에 반복 항목의 파서를 실패 할 수 있습니다. 테스트되지 않은 코드 :
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];
이 규칙은 중첩 될 수 없습니다 또는 로컬 변수를 덮어 쓰게됩니다.
적어도 지금까지 시도한 것과 실제로 예상되는 동작을 보여줍니다. – makallio85
http://stackoverflow.com/questions/33624149/boost-spirit-x3-cannot-compile-repeat-directive-with-variable-factor – llonesmiz
@ 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 지시문은 카운터 인수에 대한 필수적인 합성 특성을 가진 파서를 지원해야합니다. :) –