遍历json抽象语法树来构建布尔表达式
Traversing a json abstract syntax tree to build boolean expression
在对google和堆栈溢出做了几个小时的研究之后,我得出结论,下面的JSON结构正确地描述了一个布尔表达式。我不是很热衷于算法,但在英语(和/或javascript)中,如何递归遍历树来重建表达式,因此,在本例中,表达式将为:
13 or 14 or (18 and 20 and 19)
var booleanExpression = {
op : 'or',
left : {
op : 'or',
left: {
op : 'or',
left : {
op : 'literal',
value: '14'
},
right: {
op : 'and',
left : {
op : 'and',
left : {
op : 'literal',
value: '20'
},
right: {
op : 'literal',
value: '19'
}
},
right: {
op : 'literal',
value: '18'
}
}
}
},
right: {
op : 'literal',
value: '13'
}
};
递归是求表达式树的好朋友。您所需要做的就是处理单个op类型,并遵从其子类型的递归求值。通常,解析/评估事物的困难部分是将其转化为基于树的结构。之后,递归遍历树就很容易了:
function eval_expr(expr) {
if( !expr ) { return false; }
var op = expr.op;
if( op == 'literal' ) {
return expr.value;
} else if( op == 'or' ) {
return "(" + eval_expr(expr.left) + ") or (" + eval_expr(expr.right) + ")";
} else if( op == 'and' ) {
return "(" + eval_expr(expr.left) + ") and (" + eval_expr(expr.right) + ")";
}
console.error("Unhandled op:" + expr.op);
}
> eval_expr(booleanExpression);
"(((14) or (((20) and (19)) and (18))) or (false)) or (13)"
注意,该函数将非零的'literal'类型值视为真值,将零值视为假值。
相关文章:
- 布尔表达式-与AND、OR逻辑运算符混淆以及它们的工作方式
- 什么's VBA和Javascript布尔表达式之间的区别
- 评估JavaScript中给出布尔表达式的字符串
- 从树遍历中构建布尔表达式的算法
- = vs === 布尔表达式的运算符
- ngAnimateSwap-使用布尔表达式不会按预期设置动画
- 为什么这个布尔表达式不返回 true
- 布尔代数 - 使用 AND/OR 导出条件表达式是棘手的部分
- 如何在复杂的布尔表达式上避免三元
- 用pegjs解析布尔表达式链
- 反转布尔表达式
- 在不带eval的Javascript中计算字符串中的布尔表达式
- 为什么这个JavaScript代码在布尔表达式不再为true之后进入for循环
- 遍历json抽象语法树来构建布尔表达式
- JavaScript布尔表达式中的多个比较运算符
- javascript在布尔表达式中使用优化吗?
- 是Chrome Javascript评估布尔表达式正确
- 用于布尔表达式计算的Javascript eval
- 从JavaScript变量中计算布尔表达式
- AngularJS中布尔表达式的求值