在任何编程语言教科书中,我们总是被告知该语言中的每个运算符如何具有左关联性或右关联性。似乎关联性是任何运算符的基本属性,无论它采用多少操作数。在我看来,无论我们如何将关联性分配给其他运算符,我们都可以将任何关联性分配给任何运算符。
但为什么会这样呢?也许举个例子更好。假设我想设计一种假设的编程语言。以这种任意方式为这些运算符分配关联性是否有效(都具有相同的优先级):
unary operator:
! right associative
binary operators:
+ left associative
- right associative
* left associative
/ right associative
!+ - * / 是我的 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?因为大多数编程语言似乎为具有相同优先级的运算符分配了相同的关联性。但是我们总是谈论操作员关联性,就好像它是单个操作员的属性——而不是优先级的属性。