gpt4 book ai didi

antlr - 在 ANTLR Tree Grammar 中解释可变数量的树节点

转载 作者:行者123 更新时间:2023-12-01 01:35:48 25 4
gpt4 key购买 nike

在创建内联 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com