在创建内联 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 树语法中内联解释可变数量的树节点的建议是什么?
最佳答案
使用 +=
运算符(operator)。处理任意数量的参数,包括零:
procedureCallStatement
: ^(PROCEDURECALL procedureName=NAME argument+=expression*)
{
...
}
;
见 tree construction documentation在 antlr 网站上。
以上将改变变量
argument
的类型来自 typeof(expression)
到 List
(好吧,至少在您生成 Java 代码时)。请注意,列表类型是无类型的,因此它只是一个普通列表。如果您使用多个具有相同变量名称的参数,它们也会创建一个列表,例如:
twoParameterCall
: ^(PROCEDURECALL procedureName=NAME argument=expression argument=expression)
{
...
}
;
关于antlr - 在 ANTLR Tree Grammar 中解释可变数量的树节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2202509/