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

これは、結合式を解析するためのものです。それは食べ尽くします

(テーブル/クエリ) ((フィールド=フィールド) で (テーブル/クエリ) を結合)*

しかし、各結合の周りの「()」を処理する必要があるため、次のように解析できます。

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

角かっこがなくても問題なく動作しますが、左右の角かっこをルールに追加する方法がわかりません

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 に答える