带谓词的布尔表达式树?

问题描述

我正在尝试设计一个表达式树构建器,该构建器可用于构建一个表达式树,该树可以使用提供的上下文(哈希图)进行惰性求值。所需的运算符集为 AND/OR/NOT<<=>>=、{{1 }}、=!=包括与否)。表达式树必须支持短路(不计算超出最终结果所需的数量)。评估结果为真或假。在我的情况下,哪些节点必须是中间节点,哪些是叶子节点?我想 in_range/AND/OR 是中间词和谓词 (NOT,<,<=,>,{{1 }},>=,=) 将是叶节点?或者每个谓词都将表示为一个子树?

解决方法

我最近为我的雇主做了这件事。不过,我还没有和他们谈过开源,所以我不能向你展示任何代码。不过我可以给你一些建议。

  • 如果你有大小比较,那么一些子表达式一定不能有布尔结果:如果你写 a <= b,那么 ab 是数字或字符串。您可能还需要数学,以便您可以编写 a <= b+1 等。我的解决方案是:
    • 只有原子是叶子(ab1 等)
    • 解析表达式或子表达式会产生一个类型化编译的表达式对象。要么已知产生布尔值、字符串或数字结果,要么可能产生任何结果。例如,已知 a < b 会产生布尔结果。
    • 用作谓词的表达式是无效的,除非已知它会产生布尔结果。
  • 由于您将采用任意哈希图作为输入,因此您需要考虑如何处理空值。我建议您按照 SQL 的方式进行操作(苦思冥想已经完成),并在您的语言中添加 IS NULLIS NOT NULL