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

Parsing 左关联运算符与右关联运算符,parsing,operators,operator-precedence,associativity,Parsing,Operators,Operator Precedence,Associativity,如果我们有一个表达式: a $ b @ c $是左关联运算符,@是右关联运算符。 它们具有相同的优先级 这个表达式是如何解析的?As(a$b)@c或Asa$(b@c)?具有相同优先级的运算符都是右关联或左关联的,因此不会出现问题。这是一个很好的问题。虽然在许多语言中,定义了操作员先例和关联性以避免此类问题是正确的,但也有可能出现此类情况的语言 哈斯克尔就是这样一种语言。它允许您定义自己的中缀运算符及其前导(0到9之间的整数)和关联性(左、右、非)。很容易为您描述的场景创建前提条件: infix

如果我们有一个表达式:

a $ b @ c
$
是左关联运算符,
@
是右关联运算符。 它们具有相同的优先级


这个表达式是如何解析的?As
(a$b)@c
或As
a$(b@c)

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

这是一个很好的问题。虽然在许多语言中,定义了操作员先例和关联性以避免此类问题是正确的,但也有可能出现此类情况的语言

哈斯克尔就是这样一种语言。它允许您定义自己的中缀运算符及其前导(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.P2的.4./2部分。实际的C或C++示例可能更清楚。你自己的?好吧,那就别那么做!这是一个模棱两可的语法,没有单一的解决方法。它是由编译器决定如何分析语法树。阅读会帮你很多。对,我应该喝醉了才问这个问题。因为每种语言都有不同的先例,所以不应该有这方面的标准。它们由编译器设计者决定。“一个聪明的设计师会像Stick所说的那样。”罗伯特比恩,不,幸运的是,它们是由语言设计师决定的,并且针对每种语言都是标准化的。如果这要留给编译器实现者来完成,那么您永远无法编写可移植代码。