我如何解析布尔逻辑?

时间:2010-05-19 17:31:33

标签: parsing boolean-logic sqlclr

我需要编写一个布尔逻辑解析器,它将布尔逻辑语言转换为SQL WHERE子句。

操作数的顺序始终是正确的顺序(右边的值)。

这是一个相对简单的例子。可能有嵌套括号和NOT运算符的使用等。

(CACOUNT=01 OR CACOUNT=02 OR CACOUNT=03)
 AND Q4=1 AND NAME=TIMOTHY

这是WHERE子句类似的内容。

WHERE (
     EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='01'
     )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='02'
  )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='03'
  )
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='Q4' AND b.Value='1'
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='NAME' AND b.Value='TIMOTHY'
)

3 个答案:

答案 0 :(得分:2)

嗯,在WHERE之后是布尔表达式,因此您需要使用简单替换进行翻译,而不是解析。对于您的样本,您只需要在末尾加上引号:NAME ='TIMOTHY'

答案 1 :(得分:1)

为语言编写语法并创建递归下降解析器。这是解析简单“语言”的最简单方法,例如布尔表达式。

一旦将其解析为AST(抽象语法树),就可以进行必要的转换并生成SQL WHERE子句。

答案 2 :(得分:0)

编辑完所有内容后。你还是不需要火箭科学。写一个正则表达式,如:(\ w +)=([\ w \ d] +),然后用

替换每个匹配
EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)