2010-02-04 96 views
4

在創建內聯ANTLR樹語法解釋程序時,我遇到了有關過程調用參數多重性的問題。在ANTLR樹語法中解釋可變數目的樹節點

考慮以下(錯誤)樹語法定義。

procedureCallStatement 
    : ^(PROCEDURECALL procedureName=NAME arguments=expression*) 
     { 
      if(procedureName.equals("foo")) { 
       callFooMethod(arguments[0], arguments[1]); 
      }elseif(procedureName.equals("bar")) { 
       callBarMethod(arguments[0], arguments[1], arguments[2]); 
      } 
     } 
    ; 

我的問題在於檢索給定的參數。如果將表達式的已知量,我只想分配值出來這些表達自己的變量,例如:

procedureCallStatement 
    : ^(PROCEDURECALL procedureName=NAME argument1=expression argument2=expression) 
     { 
      ... 
     } 
    ; 

然而,這並非如此。

鑑於此類情況,ANTLR樹語法內聯解釋可變數量樹節點的建議是什麼?

回答

4

使用+=運算符。爲了處理任意數量的參數,包括零:

procedureCallStatement 
    : ^(PROCEDURECALL procedureName=NAME argument+=expression*) 
     { 
      ... 
     } 
    ; 

參見ANTLR網站上的tree construction documentation

以上將會將變量argument的類型從typeof(expression)更改爲List(當然,至少在生成Java代碼時)。請注意,列表類型是無類型的,所以它只是一個普通列表。

如果使用多個參數用相同的變量名,他們還將創建一個列表,例如:

twoParameterCall 
    : ^(PROCEDURECALL procedureName=NAME argument=expression argument=expression) 
     { 
      ... 
     } 
    ;