解释ANTLR树语法中数量可变的树节点
在创建内联ANTLR树语法解释器时,我遇到了一个关于过程调用参数多样性的问题 考虑以下(错误的)树语法定义解释ANTLR树语法中数量可变的树节点,antlr,grammar,expression-trees,interpreter,Antlr,Grammar,Expression Trees,Interpreter,在创建内联ANTLR树语法解释器时,我遇到了一个关于过程调用参数多样性的问题 考虑以下(错误的)树语法定义 procedureCallStatement : ^(PROCEDURECALL procedureName=NAME arguments=expression*) { if(procedureName.equals("foo")) { callFooMethod(arguments[0], argumen
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树语法中内联的可变数量的树节点的建议是什么?使用
+=
操作符。要处理任意数量的参数(包括零),请执行以下操作:
procedureCallStatement
: ^(PROCEDURECALL procedureName=NAME argument+=expression*)
{
...
}
;
请参阅antlr网站上的
上述操作将把变量参数
的类型从typeof(expression)
更改为列表
(至少在生成Java代码时是这样)。请注意,列表类型是非类型化的,因此它只是一个普通列表
如果使用具有相同变量名的多个参数,它们还将创建一个列表,例如:
twoParameterCall
: ^(PROCEDURECALL procedureName=NAME argument=expression argument=expression)
{
...
}
;