2

我有一个库,我必须与之交互,它基本上充当数据源。检索数据时,我可以将特殊的“过滤器表达式”传递给该库,然后将其转换为 SQL WHERE 部分。这些表达非常有限。它们必须是合取范式。喜欢:

(A or B or C) and (D or E or F) and ...

这对于编程来说当然不是很舒服。所以我想制作一个小包装器,它可以解析任意表达式并将它们转换为这种正常形式。喜欢:

(A and (B or C) and D) or E

会被翻译成类似的东西:

(A or E) and (B or C or E) and (D or E)

我可以使用Irony库将表达式解析为树。现在我需要对其进行规范化,但我不知道如何......哦,还有,这是扭曲:

  • 最终表达式可能不包含NOT运算符。但是,我可以通过将运算符替换为逆运算符来反转各个项。所以,这没关系:

    (not A or not B) AND (not C or not D)

    但这不是:

    not (A or B) and not (C or D)

  • 我想让表达式尽可能简单,因为它将被翻译成几乎相同的 SQL WHERE 语句,因此复杂的语句很可能会降低执行速度。
4

1 回答 1

3

我会在树上使用两次迭代,尽管可能一次。

第一次迭代:通过遍历树并使用德摩根定律(维基百科链接)摆脱您的 NOT 节点,并在适用的情况下删除双重否定。

第二次迭代(NOT 现在只在叶节点之前)遍历你的树:

Case "AND NODE":
    fine, inspect the children
Case "OR NODE":
    if there is a child which is neither a Leaf nor a NOT node
        apply the distributive law.
        start from parent of current node again
    else
        fine, inspect children

在那之后你应该完成。

于 2009-05-18T09:33:09.200 回答