Programming languages 为什么结合性是运算符的基本属性而不是优先级的基本属性

Programming languages 为什么结合性是运算符的基本属性而不是优先级的基本属性,programming-languages,operators,operator-precedence,associativity,Programming Languages,Operators,Operator Precedence,Associativity,在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左或右关联性。似乎结合性是任何运算符的一个基本属性,而不管它需要多少个操作数。在我看来,我们可以将任何关联性分配给任何操作符,而不管我们如何将关联性分配给其他操作符 但为什么会这样呢?也许举个例子更好。假设我想设计一种假设的编程语言。以这种任意方式(所有运算符具有相同的优先级)为这些运算符指定关联性是否有效: !+-*/我的5个运算符都具有相同的优先级 如果是,表达式将如何表示2+2!3+5*6/3-5!3.3-3*2被我假设的解

在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左或右关联性。似乎结合性是任何运算符的一个基本属性,而不管它需要多少个操作数。在我看来,我们可以将任何关联性分配给任何操作符,而不管我们如何将关联性分配给其他操作符

但为什么会这样呢?也许举个例子更好。假设我想设计一种假设的编程语言。以这种任意方式(所有运算符具有相同的优先级)为这些运算符指定关联性是否有效:

!+-*/我的5个运算符都具有相同的优先级

如果是,表达式将如何表示2+2!3+5*6/3-5!3.3-3*2被我假设的解析器括起来了?为什么

编辑:


第一个示例(2+2!3+5*6/3-5!3!3-3*2)不正确。也许忘了一元运算,让我这么说吧,我们能像上面那样给具有相同优先级的运算符分配不同的结合性吗?如果是,将如何评估示例,例如2+3-4*5/3+2?因为大多数编程语言似乎将相同的关联性赋予具有相同优先级的运算符。但是我们总是把操作符的结合性当作单个操作符的属性来讨论,而不是优先级的属性。

你必须以某种方式定义结合性,大多数语言选择“自然地”分配结合性(和优先级)——以匹配普通数学的规则


然而,也有明显的例外——APL具有严格的从右到左的关联性,所有运算符都具有相同的优先级

让我们记住联想性的含义。可以选择任何操作员,比如说
@
。我们都知道,它的关联性是消除形式
a@b@c
表达式歧义的规则:如果
@
是左关联的,它被解析为
(a@b)@c
;如果它是右关联的,
a@(b@c)
。它也可以是非关联的,在这种情况下,
a@b@c
是一个语法错误

如果我们有两个不同的操作符,比如说
@
#
?如果一个比另一个优先级更高,那么就没有什么可说的了,也就没有关联性可以做的工作;优先级负责消除歧义。然而,如果它们具有同等的优先级,我们需要结合性来帮助我们。有三种简单的情况:

  • 如果两个运算符都是左关联的,
    a@b#c
    表示
    (a@b)#c
  • 如果两个运算符都是右关联的,
    a@b#c
    表示
    a@(b#c)
  • 如果两个运算符都不关联,则
    a@b@c
    是语法错误
在其余的情况下,运算符不同意关联性。哪个操作符的选择优先?您可能会设计出这样的关联性优先规则,但我认为最自然的规则是声明任何这样的case语法错误。毕竟,如果两个运算符具有相同的优先级,为什么其中一个运算符的结合性优先级高于另一个运算符

根据我刚才给出的自然规则,您的示例表达式是一个语法错误


现在,我们当然可以为相同优先级的运算符分配不同的关联性。但是,这意味着存在优先级相同的运算符组合(例如您的示例!),这是语法错误。大多数语言设计者似乎更愿意避免这种情况,并将相同的关联性分配给所有优先级相同的运算符;这样,所有组合都是合法的。我想这只是美学。

你读过吗?另外,您的示例没有意义,因为
是一元的,因此
2!3
无效。是的,我的第一个示例不正确。我重新措辞了我的问题。查看我的编辑在我看来,您的示例将变成
2+3-(4*5/(3+2))
。您的意思是我们可以将任意关联性分配给具有相同优先级的运算符?我会说是的,但到目前为止,我只找到了每个优先级的关联性。但这很可能是为了简化解析器的实现。是的,但我想知道为什么我们需要这样一个称为关联性的概念?仅优先级就可以确定操作数和运算符如何绑定在一起吗?以及为什么大多数编程语言将相同的关联性赋予那些具有相同优先级的op。这是否意味着关联性是单个优先级而不是运算符的属性?显然,对于二进制运算符
§
而言,
a§b§c
可能意味着
(a§b)§c
a§(b§c)
。如果你想允许
a§b§c
,你需要一些东西来保证一致性。很容易理解a§b§c,因为只有1个关联性-即§。但是,比如说a呢#b@c和#@具有不同的关联性?说#是左的,@是右的?在1个优先级别内对op具有不同的关联性有意义吗?
unary operator: 
! right associative 
binary operators:
+ left associative
- right associative
* left associative 
/ right associative