Ответ 1
Операторы с одинаковым приоритетом либо являются либо ассоциативными, либо все левыми ассоциативными, поэтому проблема не возникает.
Если у нас есть выражение:
a $ b @ c
$
является левоассоциативным оператором, @
является право-ассоциативным.
Они имеют одинаковый приоритет.
Как это выражение анализируется? Как (a $ b) @ c
или как a $ (b @ c)
?
Операторы с одинаковым приоритетом либо являются либо ассоциативными, либо все левыми ассоциативными, поэтому проблема не возникает.
Это отличный вопрос. Хотя Dipstick верен, что во многих языках определены приоритеты и ассоциативность операторов, чтобы избежать такой проблемы, существуют языки, в которых может возникнуть такая ситуация.
Haskell - такой язык. Он позволяет вам определять свои собственные инфиксные операторы и их приоритеты (целое число от 0 до 9) и ассоциативность (слева, справа, не). Легко создать предпосылки для описанного вами сценария:
infixl 5 $$
($$) :: Int -> Int -> Int
a $$ b = a + b
infixr 5 @@
(@@) :: Int -> Int -> Int
a @@ b = a * b
И затем сама ситуация:
uhoh = 1 $$ 2 @@ 3
В результате появляется следующее сообщение об ошибке:
Precedence parsing error
cannot mix `$$' [infixl 5] and `@@' [infixr 5] in the same infix expression
Конечно, решение Haskell - прерывание с ошибкой синтаксического анализа - не единственный способ справиться с этой проблемой, но, безусловно, разумный.
Дополнительные сведения о разборе операторов в Haskell см. в разделе 4.4.2 отчета Haskell.