我花了几个小时在谷歌和堆栈溢出,但我还没有得出关于如何建模嵌套布尔数据的结论。
假设我有以下表达式:
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
答案 0 :(得分:2)
考虑编程语言将评估语句部分的顺序。根据和和或的优先级以及它们的左右关联性,它必须选择一些“最深”的部分,并且必须首先进行评估,然后将其作为其完全评估的操作数之一给予其“父”(最接近的较少关联运算符),然后在评估它时具有父级,依此类推。
因此,在完全评估之后,您将拥有一个树到达根目录,并且叶节点是可以首先评估的表达式的一部分(不依赖于任何评估来得出结果)。
举个简单的例子,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/编写它,并且每种语言都有不同的第三方解析器构造库是最受欢迎的。
答案 1 :(得分:1)
我的ConditionSet为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"]
}
]
}
]
}