0

我需要一些关于 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
                    )
;

用于解析连接表达式:它吃光了

(table/query) (join (table/query) on (field=field))*

但我需要处理每个连接周围的“()”,所以它可以解析如下内容:

((((table1 JOIN table2 ON field1=field2) JOIN table3 ON field2=field3) JOIN...)

没有括号它可以正常工作,但我不知道如何将左右括号添加到规则中,因为multijoinexpression *

4

1 回答 1

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* )       
于 2013-02-01T11:19:28.160 回答