Подтвердить что ты не робот

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

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

a $ b @ c

$ является левоассоциативным оператором, @ является право-ассоциативным. Они имеют одинаковый приоритет.

Как это выражение анализируется? Как (a $ b) @ c или как a $ (b @ c)?

4b9b3361

Ответ 1

Операторы с одинаковым приоритетом либо являются либо ассоциативными, либо все левыми ассоциативными, поэтому проблема не возникает.

Ответ 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.