セマンティックアクションを使用して、予想されるリストの長さと解析されたリストアイテムの数を格納し、最後に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];
この規則は、入れ子にすることはできませんまたはローカル変数が上書きされます。
少なくともこれまでに試したことと実際に期待される動作を見せてください。 – makallio85
http://stackoverflow.com/questions/33624149/boost-spirit-x3-cannot-compile-repeat-directive-with-variable-factor – llonesmiz
@ 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属性を持つパーサをサポートする必要があります:) –