BNFで

BNFでいわゆる「ぶらさがりelse」(だっけ?)をshift/reduce衝突なしに書くにはどうしたらいい?
普通はELSEを左結合にして↓みたいにすればいいのはわかるんだけど

%token IF THEN
%left ELSE
%%
if : IF expr THEN stmt
   | IF expr THEN stmt ELSE stmt


ちょっと今回はELSEに相当するものが他の文脈でも使うためできない(すると怖い)
今考えているのはこんなiterの変形型、机上ですでにいくつか問題は出てるもののちょっと試してみたい

stmt : expr ';'
     | iter
expr : func | VAR | NUM | ...

func : VAR '(' list ')'
iter : func '{' stmt '}'
     | iter VAR '(' list ')'
     | iter VAR '(' list ')' '{' stmt '}'

これを最初%precでやればいいやんと思ってたらどうやってもできない。。。うんにゅ


byaccのソースを見てみたら%precはstruct bucketのprecに対して値を設定している模様
なるほどそれでか
perlyaccのパチモンLR解析器作ったとき直前シンボルに対してprecを反映してたからオリジナルと仕様があわへんかったんや
どーりで↓が教科書通りにうごかんかったわけや、変にパッチしたおぼえあるわ

expr : expr '+' expr
     | expr '-' expr
     | '-' expr %prec UMINUS