3

我在谷歌和堆栈溢出上花了几个小时,但我还没有就如何建模嵌套布尔数据得出结论。

假设我有以下表达式:

123 and 321 and (18 or 19 and (20 or 21))

我如何在 JSON 树结构中对其进行建模,以便我可以通过简单地遍历树来重建您在上面看到的表达式?我不需要实际评估逻辑,而只需将其构建为以树形描述逻辑的方式。

提前致谢。

作为记录,这是我试图完成的系统类型,以及我猜测树应该如何根据下面的答案来构建。

ANY OF THESE:
    13
    14
    ALL OF THESE:
        18
        19
        20

          or
        /   \
       or   13
      /  \
    14    and
         /   \
       and   18
       / \
     20   19
4

2 回答 2

3

考虑一下编程语言会以哪种顺序评估语句的各个部分。根据 and 和 or 的优先级以及它们的左或右关联性,它必须选择一些“最深”的部分,并且必须首先对其进行评估,然后将其作为其完全评估的操作数之一提供给其“父级”(最接近的关联性较小的运算符),然后在对其进行评估时,它具有父级,依此类推。

因此,您将有一棵树,在完全评估后到达根,叶节点是表达式中可以首先评估的部分(不要依赖任何评估来得出结果)。

作为一个简单的例子,1 and (2 OR 3)将被建模为

  and
 /   \
1    or
    /  \
   2    3

如果具有相同优先级的运算符从左到右进行评估,并且 AND 的优先级高于 OR(例如 C++ 中的 true:http: //en.cppreference.com/w/cpp/language/operator_precedence),则

123 and 321 and (18 or 19 and (20 or 21))

变成

        and
       /   \
    and     \
   /   \     \
123     321   \
               \
                or
               /  \
             18    and
                  /   \
                or     19
               /  \
             20    21

并且要评估这棵树的结果,您将首先评估最深,用当前运算符评估其左右的结果替换每个节点,直到根中只剩下一个数字。

要以编程方式从布尔表达式转到布尔表达式树,您需要编写一个解析器*,例如在 Python 中,您可以使用 PLY http://www.dabeaz.com/ply/编写它,并且每种语言都有不同的第三方最流行的解析器构建库。

于 2013-05-23T00:41:10.917 回答
3

我的 json 格式的条件集:

"FilterCondition": {
  "LogicalOperator": "AND",
  "Conditions": [
    {
      "Field": "age",
      "Operator": ">",
      "Value": "8"
    },
    {
      "LogicalOperator": "OR",
      "Conditions": [
        {
          "Field": "gender",
          "Operator": "=",
          "Value": "female"
        },
        {
          "Field": "occupation",
          "Operator": "IN",
          "Value": ["business","service"]
        }
      ]
    }
  ]
}

参考:https ://zebzhao.github.io/Angular-QueryBuilder/demo/

于 2020-07-14T11:44:52.520 回答