解释ANTLR树语法中可变数量的树节点

时间:2010-02-04 19:22:28

标签: antlr grammar expression-trees interpreter

在创建内联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树语法中内联解释可变数量的树节点的建议是什么?

1 个答案:

答案 0 :(得分:4)

使用+=运算符。处理任意数量的参数,包括零:

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

请参阅antlr网站上的tree construction documentation

以上内容会将变量argument的类型从typeof(expression)更改为List(至少在您生成Java代码时)。请注意,列表类型是无类型的,因此它只是一个简单的列表。

如果您使用具有相同变量名称的多个参数,它们还将创建一个列表,例如:

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