2016-10-26 4 views
0

私は精神x3を使用してバイナリデータを解析しようとしていますが、長さに依存するデータ構造を解析する方法を見つけることができないという問題を抱えています。[uint32 -counter] [counter-length data]を指定します。精神を使用して長さに依存するデータ構造を解析する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、私はその質問を見ました。 _ <>アプローチで、私のためにコンパイルされませんでした。おそらく、古いboost(debianの1.61)です。 unsigned int i; auto r = x3 :: parse(start、in.end()、x3 :: (std :: ref(i))[x3 :: byte_]); with.hpp:60:33:エラー:タイプの非const参照の無効な初期化は、「ブースト::精神:: X3 ::コンテキスト(this->ヴァル、コンテキスト) "実際に期待される動作は何でしょうか":x3 :: repeatディレクティブは、counter引数にintegral属性を持つパーサをサポートする必要があります:) –

答えて

0

セマンティックアクションを使用して、予想されるリストの長さと解析されたリストアイテムの数を格納し、最後に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]; 

この規則は、入れ子にすることはできませんまたはローカル変数が上書きされます。

関連する問題