ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

変態言語whitespace

変態的と名高い 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++なのかと疑いたくなる。
正直、キモいっす。