11

如果我们有一个表达式:

a $ b @ c

$是左结合运算符,@是右结合运算符。它们具有相同的优先级。

这个表达式是如何解析的?作为(a $ b) @ c还是作为a $ (b @ c)

4

2 回答 2

12

这是一个很好的问题。尽管 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 中运算符解析的更多信息,请参阅Haskell 报告的第 4.4.2 节。

于 2013-07-12T02:48:51.510 回答
6

具有相同优先级的运算符要么都是右结合的,要么都是左结合的,因此不会出现问题。

于 2013-04-12T05:57:38.243 回答