左关联运算符与右关联运算符

时间:2013-04-12 05:54:38

标签: parsing operators operator-precedence associativity

如果我们有一个表达式:

a $ b @ c

$是一个左关联运算符,@是右关联运算符。 它们具有相同的优先权。

如何解析此表达式?作为(a $ b) @ ca $ (b @ c)

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

具有相同优先级的运算符都是右关联或全部左关联,因此不会出现问题。