ここのことはなかったことにするかもしれない

仕事がらみの記事を主として扱いますが、あくまで個人ブログです。2013年以前の記事は https://yellow-73.hatenablog.com/ にあります。

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

と書けば、なんとかうまくいきそうです(確認してません)。