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

这是一个用于解析出连接表达式: 它吃起来

(表/查询)(上(场=字段加入(表/查询)) )*

,但我需要处理 “()”,围绕每个连接,所以它可以分析是这样的:

(((表1 JOIN表2 ON字段1 =字段2)表3 JOIN ON字段2 =字段3)加入...)

没有正常工作的支架,但我无法弄清楚如何添加左和右括号的规则,因为multijoinexpression *

回答

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*)