fsyacc испускает ошибки сдвига / уменьшения для всех двоичных операций.
У меня есть это рекурсивное производство:
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
Вот выдержка из файла листинга, показывающая состояние, которое вызывает ошибки (одно другое состояние имеет такие же ошибки).
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
Вы можете видеть сдвиги парсера во всех случаях, что, я думаю, правильно. Я не нашел случая, когда поведение, по крайней мере, некорректное.
Как я могу переформулировать грамматику, чтобы устранить эти ошибки?