LEMON

Cで書かれているLEMONをC++で少しずつ書き直す作業をちょこちょこ進めている。
http://www.geocities.jp/beruponu/app/cclemon_20070228v01.zip

C++で書き直したからといって実質的に良くなっている点は今のところ何も無くて、実行速度も遅くなってるかもしれないし、使用メモリ量も増えてるかもしれないし、実行ファイルのサイズは膨らんでるし、環境依存性も増えてるし。それに本筋のロジックやデータ構造をきちんと理解していないので、いつのまにかバグを入れてしまっているかもしれない。

少しC++で書く事によって良くなっている点もあって、それはコードの可読性や再利用性等だろうか?自分が用意したのではない高品質なmoduleに実装を肩代わりさせた事によって元の実装を削れるのでコード量を減らせているだけの事で、書き手の本来の技量とは全く無関係。

書き直してテストしてみると、とある原因不明のバグに遭遇したので、昨日今日と2日間ばかし時間を使ってしまった。そのバグは以下のようにして起こった。
ファイル config.cc で、static stdext::hash_set s_set; という変数を作成していた。configcompareはconfig.ccで宣言しているclass。
ファイル state.cc では、static stdext::hash_map s_map; というのを作成していた。configcompareはstate.ccで宣言している別のclassのつもりだった。
しかし、s_map.find methodの呼び出しで、state.cc中のconfigcompareを利用して探索処理が行われていると思ったら、実際にはconfig.ccのconfigcompareを利用していた。こういう事が起こらないように無名namespace等で囲ったりして、きちんとシンボルのscopeを限定させるように書く習慣を付けるべきなんだろう。

最近知ったのだけれど、LEMON Syntax Parser Generatorはlighttpdでも使われていた。これをサンプルに使い方を少しは勉強出来そうだ。はぁ面倒くさい…。
http://www.lighttpd.net/