如何解决带谓词的布尔表达式树?
我正在尝试设计一个表达式树构建器,该构建器可用于构建一个表达式树,该树可以使用提供的上下文(哈希图)进行惰性求值。所需的运算符集为 AND
/OR
/NOT
、<
、<=
、>
、>=
、{{1 }}、=
、!=
(包括与否)。表达式树必须支持短路(不计算超出最终结果所需的数量)。评估结果为真或假。在我的情况下,哪些节点必须是中间节点,哪些是叶子节点?我想
in_range
/AND
/OR
是中间词和谓词 (NOT
,<
,<=
,>
,{{1 }},>=
,=
) 将是叶节点?或者每个谓词都将表示为一个子树?
解决方法
我最近为我的雇主做了这件事。不过,我还没有和他们谈过开源,所以我不能向你展示任何代码。不过我可以给你一些建议。
- 如果你有大小比较,那么一些子表达式一定不能有布尔结果:如果你写
a <= b
,那么a
和b
是数字或字符串。您可能还需要数学,以便您可以编写a <= b+1
等。我的解决方案是:- 只有原子是叶子(
a
、b
、1
等) - 解析表达式或子表达式会产生一个类型化编译的表达式对象。要么已知产生布尔值、字符串或数字结果,要么可能产生任何结果。例如,已知
a < b
会产生布尔结果。 - 用作谓词的表达式是无效的,除非已知它会产生布尔结果。
- 只有原子是叶子(
- 由于您将采用任意哈希图作为输入,因此您需要考虑如何处理空值。我建议您按照 SQL 的方式进行操作(苦思冥想已经完成),并在您的语言中添加
IS NULL
和IS NOT NULL
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。