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に対して値を設定している模様
なるほどそれでか
昔perlでyaccのパチモンLR解析器作ったとき直前シンボルに対してprecを反映してたからオリジナルと仕様があわへんかったんや
どーりで↓が教科書通りにうごかんかったわけや、変にパッチしたおぼえあるわ
expr : expr '+' expr | expr '-' expr | '-' expr %prec UMINUS