Два конфликта сдвига-уменьшения являются результатом того факта, что вам не требуется никакого явного разделителя между операторами.Из-за этого a = b - 3
можно интерпретировать как одно утверждение или как два (a = b
; - 3
).Второе толкование может показаться вам не очень естественным, но оно легко выводится из грамматики.
Кроме того, использование унарного минуса приводит к неправильному синтаксическому анализу -2/3
как -(2/3)
вместо (-2)/3
.(Вы можете или не можете найти это серьезным, так как это имеет мало семантических последствий для этих конкретных операторов.) Эта конкретная проблема и правильное решение обсуждаются в руководстве по бизонам и во многих других интернет-ресурсах.
Оба эти объяснения станут немного более наглядными, если вы используете опцию командной строки -v
, чтобы составлять описание синтаксического анализатора.См. Понимание вашего синтаксического анализатора (снова в руководстве по бизонам).