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で優先順位を見るように変更したところ、うまくいきました。
参考