gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:39:28 25 4
gpt4 key购买 nike

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

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

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?因为大多数编程语言似乎都为具有相同优先级的运算符分配了相同的结合性。但是我们总是将运算符(operator)关联性视为单个运算符(operator)的属性 - 而不是优先级的属性。

最佳答案

让我们记住关联性的含义。以任何运营商为例,比如 @ .众所周知,它的结合性是消除形式 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是语法错误。

  • 在其余情况下,运算符不同意结合性。哪个运营商的选择优先?您可能会设计出这样的结合优先规则,但我认为最自然的规则是声明任何这种情况下的语法错误。毕竟,如果两个运算符具有相同的优先级,为什么一个运算符的结合性优先于另一个?

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

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

    关于programming-languages - 为什么结合性是运算符的基本属性而不是优先级的基本属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700550/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com