views:

136

answers:

1

Whilst creating an inline ANTLR Tree Grammar interpreter I have come across an issue regarding the multiplicity of procedure call arguments.

Consider the following (faulty) tree grammar definition.

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

My problem lies with the retrieval of the given arguments. If there would be a known quantity of expressions I would just assign the values coming out of these expressions to their own variable, e.g.:

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

This however is not the case.

Given a case like this, what is the recommendation on interpreting a variable number of tree nodes inline within the ANTLR Tree Grammar?

+2  A: 

Use the += operator. To handle any number of arguments, including zero:

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

See the tree construction documentation on the antlr website.

The above will change the type of the variable argument from typeof(expression) to a List (well, at least when you're generating Java code). Note that the list types are untyped, so it's just a plain list.

If you use multiple parameters with the same variable name, they will also create a list, for example:

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