コンパイラを作ろう(7)

演算子順位構文解析法をテストファーストで作ろう!と意気込んで、作りはじめた。とりあえず、抽象化を意識して、lexer のインターフェースを作って、それにテスト用具象クラスを突っ込んでテストを作り始めようと思ったのだが、インターフェースをどう作ればいいだろうと凝り始めると、うまくまとまらなくなってしまった。なんというか、字句解析をしないといけないのに、構文解析的なことを入れようとしてしまっていたのだ。構文解析のテストのために、構文解析を作っていたのではアホとしかいいようがない。まだまだ、ちゃんと理解していない証拠だなぁ。

lexer のインターフェースとテスト用の具象クラスが見積もれたところで、もっと lexer としての機能を抽象化していきたいなと思って、それならば flex と bison を見てみようと思いたち、Windows にインストール。

前橋和弥氏のプログラミング言語を作る/yaccとlexを参考に組んでみる。yacc & lex( bison & flex )はコードテンプレート+コードジェネレータという構成のようで、生成元コードの構文は、プログラミング言語の構文と比べるとすこし奇妙だ。でも、少しの記述で、簡単に parser と lexer ができちゃうんだから、すごく便利。

そのあといろいろと bison & flex の使い方を探していくと、どうも再入可能なコードを生成する(グローバル変数を使わない)オプションが存在するとの記述を発見。マルチタスクなコードには必須なので、とりあえず再入可能指定してコード生成したところで、エラーがいっぱい。どうも、C++ のコードを生成したところで、いろいろヘッダ関連でエラーがでているもよう。一応不足していると思われるヘッダやら、エラーが出ている個所の修正やらをやってみたが、どうにもうまくいかない...。う〜ん、やっぱ、Windows 用ではだめなのか...?でも、手馴れた VC++ を手放したくないし。もう少し頑張ってみるか。