bisonで演算子の優先順位が反映されなかったミス
bisonは構文解析器です。
bison等では、演算子の優先順位を "%left" "%right"で指定できます。
それが全く範囲されずに困った話。
一部を抜き出すと、こんなかんじ。
%left OP_STAR OP_SLASH %left OP_PLUS OP_MINUS %% expr | expr op2 expr ... op2 : OP_PLUS | OP_MINUS | OP_STAR | OP_SLASH
なお、トークンは、文字自体でなく、マクロにしています。また、字句解析はここでは触れません。
この書き方の問題点を順に追って説明します。
まず、"%left"等は、優先順位が低い順に書くので、OP_PLUS, OP_MINUSの方が優先順位が高くなるようです(確認していません)。
それと、op2という非終端文字を出すと、優先順位が全く反映されません。たぶん、op2が確定した時点で演算子の選択が行われ、"expr | expr op2 expr"まで戻ってきたときには、完全に確定しているのでしょう(確認してません)。
%left OP_PLUS OP_MINUS %left OP_STAR OP_SLASH expr | expr OP_PLUS : expr OP_MINUS : expr OP_STAR : expr OP_SLASH
と書けば、なんとかうまくいきそうです(確認してません)。