変態的と名高い whitespace のインタプリタを書くのが流行っているらしい。
id:kanbayashi:20080404:p1 とか id:hayamiz:20080325:1206403241 とか id:yuyarin:20080325:1206382820 あたりでやってるので、
私もやってみることにした。
せっかくの変態言語(褒め言葉)なのでここはやはり、同じく変態(褒め言葉)と名高い
boost::spirit を使って実装することにした。
ソースコードはこちら。
http://www.coins.tsukuba.ac.jp/~i0611263/wspace.cpp
spirit を使ってちゃんと抽象構文木を作って、一旦中間言語にコンパイルしてから実行します。
中間言語にコンパイルするときにラベル名をハッシュ化して、実行時に解決します。
本家サイトのサンプル http://compsoc.dur.ac.uk/whitespace/examples.php あたりは全部動いたからたぶん大丈夫。
whitespace 0.3 以降の COPY と SLIDE に関してはサンプルがなかったのでパースはするけどインタプリタが対応していません。
一部抜粋すると
program = *( stack_imp | arithmetic_imp | heap_imp | flow_imp | io_imp ); stack_imp = push | dup | copy | swap | pop | slide; // stack imp push = root_node_d[ token_node_d[ sp >> sp ] ] >> number; dup = root_node_d[ token_node_d[ sp >> lf >> sp ] ]; // element label = leaf_node_d[ +( sp | tab ) >> lf ]; number = leaf_node_d[ ( sp | tab ) >> +( sp | tab ) >> lf ];
ここまで来るとほんとにC++なのかと疑いたくなる。
正直、キモいっす。