VBで構文解析をやってみる

字句解析を行う←DFAを作る←状態遷移表を書く ということですみます。
構文解析を行う←(どうすりゃいいんだ) でストップ。
yaccなりbisonはあるけど、吐き出すのはCのコード。Visual Basic に組み込むのは無理臭いと思いました。
で、結局はbisonの吐き出すコードを手で移植。文法ファイルを変えるたびにコードが変わるので、全部VBのコードに書き換えるのが面倒と思っていましたが、パーサ自体は変わらないので使い回せます。変える必要があるのは、各種テーブル(としか言えないのはLALR法を全く理解していないため)と、リデュース時の副作用の部分。どこを変えればいいかだけでも分かれば、ずっと作業が楽になるというもの。
で、移植したのはいいのですが、演算子の優先順位指定が利かない。
bisonを解説されているウェブサイトを見て回りましたが、どうにも分らない。みんなさらっと触れられているだけで、何らトラブルが出るように書かれていない。
おかしいなあ、と思って、ごく簡単な文法を新たに作っていじくりまわしてみたところ、どうも次のような問題があったようです。

%left OP_PLUS OP_MINUS
%left OP_MUL OP_DIV
...
expr : expr op expr
...
op : OP_PLUS | OP_MINUS | ...

これって、opの行で優先順位を見る、ということであって、exprの行では優先順位は見ない、さらには、opでチェックするトークンは一つだけなので、優先順位がどうなろうと全く関係ありません。

...
expr : expr OP_PLUS expr
     | expr OP_MINUS expr
...

と、exprで優先順位を見るように変更したところ、うまくいきました。

参考

  1. http://lmj.nagaokaut.ac.jp/gnu_manual/bison-1.28/bison-ja_toc.html (「Bison入門」)
  2. http://ja.wikipedia.org/wiki/LALR%E6%B3%95 (WikiPedia 「LALR法」)