2010-05-19 4 views
5

부울 논리 언어를 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

으로 바꿉니다. 그대로 'where' 절을 그대로 사용할 수 없습니까? – tzaman

+0

아니, 정말로 전혀 할 수 없다. CACOUNT라는 열이 없습니다. 그것은 수직 테이블입니다. –

+0

세로 테이블이란 무엇입니까? – Andrey

답변

2

글쎄, 부울 표현식은 무엇이 되니, 구문 분석이 아닌 단순한 대체로 번역해야합니다. 견본을 끝까지 견적하면됩니다. NAME = 'TIMOTHY'

+0

이것은 매우 쉽게 작동하지 않습니다. –

1

언어에 대한 문법을 ​​작성하고 재귀 적 파생어를 작성하십시오. 이는 부울 표현식과 같은 간단한 "언어"를 구문 분석하는 가장 쉬운 방법입니다.

AST (추상 구문 트리)에 구문 분석을 수행하면 필요한 모든 변환을 수행하고 SQL WHERE 절을 생성 할 수 있습니다.

+0

재귀 적 파싱 파서를 만드는 것이 가장 문제가되는 부분입니다. 특히 괄호로 –

+0

[문법] (http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form)을 먼저 수행하십시오. 일단 당신의 문법이 완료되면, 재귀 하강 파서는 간단하다. –

+0

그래도 문법을 C# 코드로 변환 할 수 있습니까? –

0

모든 수정 후. 당신은 여전히 ​​로켓 과학을 필요로하지 않습니다. (\ w +) = ([\ w \ d] +)와 같은 정규식을 작성한 다음 각 일치 항목을

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