sed で brainf*ck コンパイラ

http://d.hatena.ne.jp/mmatsuoka/20060712#1152632406

とかを見て、 x86 アセンブラを出すコンパイラsed で書いてみました。

http://shinh.skr.jp/koneta/bf.sed

実行例は、

i@um ~> ./bf.sed hello.bf | gcc -x assembler -
i@um ~> ./a.out
Hello World!
i@um ~> ./bf.sed echo.bf | gcc -x assembler -
i@um ~> ./a.out
abcd123
abcd123
ABCD123
abcd123

などと。ちなみに [ は 52 回くらいまでしか使えません。まぁ増やすのは簡単だけど。

sed マゾプログラミングはちゃんとコマンド覚えるとそんなにしんどくないかも。 GNU 拡張らしい i コマンドが便利すぎる。でもこれ無いとできないかというとできる気がするし、後はどれだけ気合いがあるかみたいな。もちろん woさんの偉業 を参考にしました。

いくつかコツはですね…

  • 一文字ずつの処理が一番よくわからなかった。適当なところに :x とかラベルをはっておいて、一文字処理したら s/^.// とかで一文字削って bx すればよろし。これでだいたい普通のループになる。
  • データの保持だけど、今回は jmp の飛び先を相互に記憶しておかにゃならんかった。ホールドスペースをうまく使うことになる。
    • まず重要な情報が今のパターンスペースにあったらとりあえず H する。
    • 深く考えず g で持ってきて、正規表現で適当に欲しい情報だけ切り出して使う。このステップは何度でも繰り返していい。
    • g で持ってきて、次の正規表現を使って次に読みたい部分を復活させる。
    • x ホールドスペースとパターンスペースを入れかえ。
    • 正規表現で適当に次のホールドスペースとして使えるデータに整形する。
    • x でまた入れかえて(これで次に読みたい部分がパターンスペースに来る) b でジャンプ。
  • p と P で printf デバッグできる。 i hoge とか入れるとどこの printf デバッグ情報かわかりやすいと思う。
  • アセンブラを間違えない!アセンブラ音痴はだから困るよ!
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h