我有一个我必须与之接口的库,它基本上作为数据源。检索数据时,我可以将特殊的“过滤器表达式”传递给该库,稍后将其转换为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 A or not B) AND (not C or not D)
not (A or B) and not (C or D)
答案 0 :(得分:3)
我会在树上使用两次迭代,尽管它可能在一个中。
第一次迭代:通过遍历树并使用De Morgan定律(wikipedia link)去掉你的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
之后你应该完成。