Как мне разобрать булеву логику? - PullRequest
5 голосов
/ 19 мая 2010

Мне нужно написать синтаксический анализатор логической логики, который переведет язык логической логики в предложение 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 ]

2 голосов
/ 19 мая 2010

хорошо, то, что идет после WHERE - это логическое выражение, поэтому вам нужен перевод с простыми заменами, а не с разбором для вашего образца вам просто нужно поставить цитаты в конец: NAME = 'TIMOTHY'

1 голос
/ 19 мая 2010

Напишите грамматику для языка и создайте парсер рекурсивного спуска. Это самый простой способ анализа простых «языков», таких как логическое выражение.

После того, как вы проанализировали его в своем AST (абстрактном синтаксическом дереве), вы можете делать любые необходимые преобразования и генерировать предложение SQL WHERE.

0 голосов
/ 20 мая 2010

после редактирования все изменилось. Вы все еще не нуждаетесь в ракетостроении. написать регулярное выражение, что-то вроде: (\ w +) = ([\ w \ d] +), а затем заменить каждое совпадение на

EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)
...