Rob*_*ean 11 parsing operators operator-precedence associativity
如果我们有一个表达式:
a $ b @ c
Run Code Online (Sandbox Code Playgroud)
$
是一个左关联运算符,@
是右关联运算符.它们具有相同的优先权.
这个表达式是如何解析的?作为(a $ b) @ c
或作为a $ (b @ c)
?
Mat*_*ick 10
这是一个很好的问题.虽然Dipstick是正确的,但在许多语言中,运营商优先级和关联性被定义为避免这样的问题,有些语言可能会出现这种情况.
Haskell就是这样一种语言.它允许您定义自己的中缀运算符及其优先级(0到9之间的整数)和关联性(左,右,非).为您描述的场景创建前提条件很容易:
infixl 5 $$
($$) :: Int -> Int -> Int
a $$ b = a + b
infixr 5 @@
(@@) :: Int -> Int -> Int
a @@ b = a * b
Run Code Online (Sandbox Code Playgroud)
情况本身:
uhoh = 1 $$ 2 @@ 3
Run Code Online (Sandbox Code Playgroud)
这会导致此错误消息:
Precedence parsing error
cannot mix `$$' [infixl 5] and `@@' [infixr 5] in the same infix expression
Run Code Online (Sandbox Code Playgroud)
当然,Haskell的解决方案 - 用解析错误中止 - 并不是解决这个问题的唯一方法,但它肯定是合理的.
有关Haskell中运算符解析的更多信息,请参阅Haskell报告的 4.4.2节.
具有相同优先级的运算符都是右关联或全部左关联,因此不会出现问题.