Левоассоциативные операторы против Правоассоциативных операторов
Если у нас есть выражение:
a $ b @ c
$
является левоассоциативным оператором, @
является правоассоциативным. У них одинаковый приоритет.
Как это выражение анализируется? Как (a $ b) @ c
или как a $ (b @ c)
?
2 ответа
Все операторы с одинаковым приоритетом являются либо правосторонними, либо левосторонними, поэтому проблема не возникает.
Это отличный вопрос. Несмотря на то, что 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.