2010-02-04 81 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) 
     { 
      ... 
     } 
    ;