Левоассоциативные операторы против Правоассоциативных операторов

Если у нас есть выражение:

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.

Другие вопросы по тегам