言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

バイナリファイル形式パーサージェネレータが欲しい

最近工作の事ばかり書いてるのは、出来た模型を来月頭のとあるカンファレンスでネタとして持って行く予定なのと、あと仕事では毎日ドキュメントを書くばかりで、特に何も面白い事が起こらなかったからです。そのドキュメントも終わり、今週あたりからまたプログラミングをする余裕が出てきました。

ずっと AVM2 用の Scheme のような物を作っているんだけど、平行して色々やりたい事があるので忘れないように書きます。一つはデータファイルの読み書きに使うパーサージェネレータについてです。

今はとりあえず何でも XML で保存するのが流行っているのかも知れないけど、それでも世の中には沢山のファイル形式があります。画像や音声の保存には独自のファイル形式がありますし、プログラム実行ファイルも一定の形式に従って保存されます。これらのファイルの読み書きを行うプログラムにはあるパターンがあるのですが、そのパターンを抜き出しもっと形式的に書けるようにならないかというのが問題です。

テキストファイル、特にプログラミング言語だと、結構ちゃんとこういう形式化はされていて、今やプログラミング言語のパーサーだけ別の宣言的な言語で書くというのは常識だと思います。これをバイナリも含む一般的なデータに応用出来ないかという事です。プログラミング言語用のパーサとは違う特性について考えてみます。

  • バイナリデータを扱う
  • 曖昧文法は扱えなくて良いと思う。
  • 一つの定義文で、読み込みと書き込みの二つのプログラムを作ってほしい。

特に最後の奴が普通のパーサジェネレータの動作と違う部分で、私がこのような物が欲しい一番の動機でもあります。AVM2 用のアセンブラを書くのに、同じような関数を二度書くのがもう嫌なのです。想像するに、この双方向性を実現するためにはある程度表現出来る文法は弱い方が良いのではないかと思います。このツールの動作は次のようになるでしょう。

  • ロード: ファイル -> [バイナリ形式ツール] -> データ構造
  • 処理: データ構造 -> [普通のプログラム] -> いろんな処理
  • 処理: いろんな処理 -> [普通のプログラム] -> データ構造
  • セーブ: データ構造 -> [バイナリ形式ツール] -> ファイル

世の中にはプログラミング言語よりもデータ形式の方が多い(と思う)ので、このようなツールがあっても良いと思うのですが、私は寡聞にして知りません。今まで調べた事をちょっと書きます。