私は精神 x3 を使用してバイナリ データを解析しようとしていますが、[uint32-counter][counter-length data] のような長さ依存のデータ構造を解析する方法が見つからないという問題に遭遇しました。
1 つのパーサー (x3::little_dword) から x3::repeat(???)[byte_] のようなものに属性を渡すことは可能ですか?
私は精神 x3 を使用してバイナリ データを解析しようとしていますが、[uint32-counter][counter-length data] のような長さ依存のデータ構造を解析する方法が見つからないという問題に遭遇しました。
1 つのパーサー (x3::little_dword) から x3::repeat(???)[byte_] のようなものに属性を渡すことは可能ですか?
セマンティック アクションを使用して、予想されるリストの長さと解析されたリスト アイテムの数を格納し、最後のエントリの 1 つ前の繰り返しアイテムのパーサーを失敗させることができます。テストされていないコード:
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];
このルールをネストすることはできません。そうしないと、ローカル変数が上書きされます。