Kaitai Struct での最初のステップとして、練習として BSON パーサーを実行しようとしています。BSON 要素を解析する .ksy コードは次のようになります。
element:
seq:
- id: el_type
type: u1
enum: bson_type
- id: el_name
type: strz
encoding: UTF-8
if: el_type != bson_type::end_of_document
- id: el_string
type: bson_string
if: el_type == bson_type::string
- id: el_document
type: bson_document
if: el_type == bson_type::document
- id: el_boolean
type: u1
if: el_type == bson_type::boolean
- id: el_int32
type: s4
if: el_type == bson_type::int32
- id: el_int64
type: s4
if: el_type == bson_type::int64
enums:
bson_type:
0: end_of_document
1: double
2: string
3: document
8: boolean
0x10: int32
0x12: int64
お気づきかもしれませんが、繰り返しがたくさんあります。if
追加の要素タイプを実行するたびに、ブロックを複製する必要があります。さらに悪いことに、基本的にそのようなフィールドごとに 3 回複製する必要があります。
- id: el_string # <= string!
type: bson_string # <= string!
if: el_type == bson_type::string # <= string!
私のターゲット言語は Java です。Kaitai の前は Preon しか試していませんでしたが、次のような条項がありました。
@Choices(prefixSize = 8, alternatives = {
@Choice(condition = "prefix==0x01", type = FloatNamedElement.class),
@Choice(condition = "prefix==0x02", type = UTF8NamedElement.class)
}
private NamedElement elements;
そこで、「プレフィックス」の値に基づいて、これら 2 つの要素を自動的に取得します。カイタイでできるんですか?