fsyaccは、すべてのバイナリ操作に対してshift/reduceエラーを発行しています。
私はこの再帰的なプロダクションを持っています:
scalar_expr:
| scalar_expr binary_op scalar_expr { Binary($2, $1, $3) }
に変更する
scalar_expr:
| constant binary_op constant { Binary($2, Constant($1), Constant($3)) }
エラーを排除します(しかし、私が望むものではありません)。優先順位と結合性は次のように定義されます。
%left BITAND BITOR BITXOR
%left ADD SUB
%left MUL DIV MOD
これは、エラーを生成する状態を示すリストファイルからの抜粋です(他の1つの状態にも同じエラーがあります)。
state 42:
items:
scalar_expr -> scalar_expr . binary_op scalar_expr
scalar_expr -> scalar_expr binary_op scalar_expr .
actions:
action 'EOF' (noprec): reduce scalar_expr --> scalar_expr binary_op scalar_expr
action 'MUL' (explicit left 9999): shift 8
action 'DIV' (explicit left 9999): shift 9
action 'MOD' (explicit left 9999): shift 10
action 'ADD' (explicit left 9998): shift 6
action 'SUB' (explicit left 9998): shift 7
action 'BITAND' (explicit left 9997): shift 11
action 'BITOR' (explicit left 9997): shift 12
action 'BITXOR' (explicit left 9997): shift 13
すべての場合でパーサーのシフトを確認できますが、これは正しいと思います。少なくとも、動作が正しくないケースは見つかりませんでした。
これらのエラーを排除するために文法を言い換えるにはどうすればよいですか?