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