【问题标题】:Disambiguation of expressions with neighboring operators of different associativity and same precedence具有不同关联性和相同优先级的相邻运算符的表达式消歧
【发布时间】:2013-02-27 16:41:26
【问题描述】:

假设我有一个如下表达式(其中 是具有相同优先级但关联性不同的二元运算符):

x ⨁ y ⨂ z

y 是否属于,基于什么标准?

【问题讨论】:

  • 你应该在 Haskell 中试试这个。
  • @MattFenwick - 我知道在 Haskell 中具有相同优先级和不同关联性的唯一运算符是 >>= 运算符 (infixl 1) 和 =<< 运算符 (infixr 1) .我一有机会就会对其进行测试,但在 Haskell 中的所有概率类型推理规则都将胜过关联性,从而导致表达式被明确地评估,而无需使用分流场算法中指定的 Edsgar Dijkstra 规则。

标签: parsing evaluation operator-precedence associativity disambiguation


【解决方案1】:

根据 Edsgar Dijkstra 的 Shunting-yard algorithm,如果表达式中相邻的两个运算符具有相同的优先级,则表达式会根据第二个运算符的关联性来消除歧义。

  1. 如果第二个运算符是左关联运算符,则操作数属于第一个运算符。
  2. 如果第二个运算符是右结合运算符,则操作数属于第二个运算符。

案例 1: 是左关联的。该表达式的计算结果为:

(x ⨁ y) ⨂ z

案例 2: 是右结合。该表达式的计算结果为:

x ⨁ (y ⨂ z)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2020-12-03
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多