2012-11-10 2 views
1

SQL SELECT 쿼리의 일부를 포함하는 DSL을 구현하려고합니다.SQL JOIN 절 : 플래그 집합을 하나의 Enum으로 대체하십시오.

은 두 테이블 사이의 JOIN 구문은 다음과 같이 (예를 들어, PostgreSQL에 대한) 지정됩니다

// one of theese: 
[ INNER ] JOIN 
LEFT [ OUTER ] JOIN 
RIGHT [ OUTER ] JOIN 
FULL [ OUTER ] JOIN 
CROSS JOIN 

참고 선택적 키워드.

다음 Xtext 문법 (일종의) 작동 :

Join: 
    'INNER'? inner?='JOIN' 
| left?='LEFT' 'OUTER'? 'JOIN' 
| right?='RIGHT' 'OUTER'? 'JOIN' 
| full?='FULL' 'OUTER'? 'JOIN' 
| cross?='CROSS' 'JOIN' 
; 

모델 추론 물론 나중에 잘 처리 할 수없는 플래그의 무리를 생성합니다.

는 내가 원하는 정말은 열거 이렇게 있습니다 :

  • 발전기 등의 알 :

    enum JoinType: INNER_JOIN | LEFT_JOIN | RIGHT_JOIN | FULL_JOIN | CROSS_JOIN; 
    

    내가 열거 때문에 싶어요. 간단한 switch 문을 사용할 수 있습니다.

  • 선택적 키워드 및 포함 된 공백의 처리는 문법적 작업입니다.

해당 열거 형을 나머지 문법에 연결할 수있는 합리적인 방법이 있습니까?

답변

0

개별적으로 정의 할 수 있지만 주변에 있지만 열거 형만큼 우아하지 않을 수 있습니다.

Join: 
(joins += JoinType)+ // or however you wish 
; 
JoinTypes: 
INNER_JOIN | LEFT_JOIN | RIGHT_JOIN | FULL_JOIN | CROSS_JOIN 
; 

그런 다음 각각을 원하는대로 정의하십시오.

INNER_JOIN: 
// whatever you want, optional keywords etc. 
; 
LEFT_JOIN: 
... 
+0

당신의 문법을 사용하여 나는'EString' 형식의 조인으로 EClass'Join'을 얻습니다. 그렇다면 필자는 수작업으로 선택적 키워드와 심지어 화이트 스페이스를 포함한 문자열을 수동으로 평가해야 할 것입니다. 이것은 Xtext/ANTLR/... :-)로 밀고 자하는 성가신 부분입니다. –

+0

열거 형과 같지 않습니다. 예를 들어 Xtend를 코드 생성에 사용하면 구문 분석시 전체적으로 얻을 수 있습니다. 코딩 할 때 직접 열거 형만큼 편리하지 않을 수도 있지만 열거 형을 얻을 수 있기 때문에 백그라운드에서 열거 형을 파싱하는 것과 같습니다. 또한 앞면에있는 String과 같지 않습니다. Intellisense는 가입 규칙 중 하나를 따르고 규칙에 따라 코드가 완성 될 것으로 기대합니다. 그래도 정확한 열거 형이 아닐 것입니다. –

+0

생성/처리에 _only_ Xtend를 사용하면 원래의 문법을 사용할 수 있고 플래그와 열거 형 사이의 매핑을 편리한 확장으로 캡슐화 할 수 있습니다. 귀하의 제안은 유사하지만 문자열 처리를위한 원래 불리언의 처리와 관련이 있습니다. 이 시점에서 부울은 이미 문자열보다 높은 값의 표현이므로이 점을 고려하지 않았습니다. –