yacc・でかるちゃー

数ヶ月前に、C/C++のヘッダからenum定数を取り出して並べるスクリプトを書きました。パワフルなRubyのおかげでそれほど苦労せずに動作するものが作れたのですが、その頃おそれていた、「namespaceへの対応」が必須となってしまい、今日はそのための拡張を行いました。
namespace指定付きの定数の取り出しはそれほど問題ありませんでした。ブロックを検出して、それをスタックに積んでいくだけなので。問題は、取り出したnamespace指定付きのenum定数を利用するときの、「using namespace」。『ABC::DEF::GHI::hoge』は、「using namespace ABC」と指定されると、『DEF::GHI::hoge』としても使用できるようになってしまいます。更に「using namespace ABC::DEF::GHI」と指定されると、『hoge』としても使用できるようになってしまいます。つまりこれらのusing namespaceがあった場合、『ABC::DEF::GHI::hoge』も『DEF::GHI::hoge』も『hoge』も全て同じものを指します。これ、どうしよ…。
悩んだのですが、どうしようもないので全て試すことにしました。「hoge」を指定されたら、『hoge』も『ABC::DEF::GHI::hoge』も『DEF::GHI::hoge』もシンボルから探す。見つかったらそこでストップ。定義が衝突してしまった場合のことなんて考えません。そう思って作ってみたら、無事に動いたのでオッケーです。…ちょっと怖いので、折を見ていろいろ直さなきゃ。
そもそも自前で字句解析&構文解析をしているのがいけない気がしてきました。yaccが吐き出すCコードは汚いですが、ルールの定義ファイルは綺麗で素晴らしいです。速度だって僕の自前のものよりずっと速いはず。きちんとした構文解析にすれば、今は随所で行っているインチキ処理や制限もとっぱらえるはず。自前なんて諦めて、コンパイラコンパイラを使いたいです。さて、まずはyaccの使い方から調べなくちゃ。yaccという文字を読むと、デ・カルチャーという言葉が出てくるあたり、駄目になっているなぁと感じる今日この頃です。