2013-01-21 6 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 
        ) 
; 

Что для разбора из присоединиться выражения: Он съедает

(таблица/запрос) (присоединиться (таблица/запрос) (поле = поле)) *

, но мне нужно обрабатывать "()" вокруг каждого соединения, поэтому он может разобрать что-то вроде этого:

(((table1 JOIN table2 ON field1 = field2) РЕГИСТРИРУЙТЕСЬ Таблица3 ON field2 = field3) РЕГИСТРИРУЙТЕСЬ ...)

без скобок он работает нормально, но я не могу понять, как добавить левый и правый кронштейн к правилу, из-за multijoineexpression *

ответ

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*)  
Смежные вопросы