2013-01-21 8 views
0

ANTLR에 대한 도움이 필요합니다. 구문 분석을위한여러 요소가있는 ANTLR 규칙

datasource 
@init{boolean joinexpr = false;} 
: 
    (s1=datasourceelement (joinclause1=joinclause joinelement1=datasourceelement onclause1=onclause (multijoinexpression)* {joinexpr=true;})?) 
    -> {joinexpr}? ^(JOINEXPRESSION 
         ^(LEFTEXPR $s1?) 
         $joinclause1? 
         ^(RIGHTEXPR $joinelement1?) $onclause1? multijoinexpression* 
        )      
    -> $s1     
; 
multijoinexpression 
: 
    joinclause datasourceelement onclause 
    -> 
    ^(MULTIJOINEXPRESSION 
         joinclause 
         ^(RIGHTEXPR datasourceelement) onclause 
        ) 
; 

밖으로 표현 가입 : 나는 다음과 같은 규칙이 그것은() (필드 = 필드 (테이블/쿼리)에 가입

(테이블/쿼리)를 먹는다) *

그러나이 같은 분석 할 수있는 "()"각 가입 주위에, 그래서 내가 처리해야합니다

을 5,는

(((표 1 가입 표 2 ON 필드 1 = FIELD2) 가입 표 3 ON FIELD2 = FIELD3) 가입 ...) 잘 작동 괄호없이

,하지만 난 왼쪽을 추가하는 방법을 알아낼 수 없습니다 다중 결합 표현 덕분에 오른쪽 괄호가 적용됩니다. *

답변

0

이 문제가 해결되었습니다. 나는 또한 그것이 정말로 추악한 것을 안다. 그러나 그것은 효과적이다.

(
    //1-2 
       (LPARAM simplejoin RPARAM) multijoinexpression? 
|//2-3 
     (LPARAM (LPARAM simplejoin RPARAM) multijoinexpression RPARAM) multijoinexpression? 
|//3-4 
(LPARAM (LPARAM (LPARAM simplejoin RPARAM) multijoinexpression RPARAM) multijoinexpression RPARAM) 
multijoinexpression? 
|//4-5 
(LPARAM 
(LPARAM (LPARAM (LPARAM simplejoin RPARAM) multijoinexpression RPARAM) multijoinexpression RPARAM) 
multijoinexpression RPARAM) multijoinexpression? 
) ->^(JOINEXPRESSION simplejoin multijoinexpression*)