代码之家  ›  专栏  ›  技术社区  ›  David Walschots

在Antlr树语法中解释树节点的可变数目

  •  4
  • David Walschots  · 技术社区  · 15 年前

    在创建内联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树语法中内联的树节点的可变数目,有什么建议?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Kaleb Pederson    15 年前

    使用 += 操作员。要处理任意数量的参数,包括零:

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

    tree construction documentation 在Antlr网站上。

    上面将更改变量的类型 argument typeof(expression) 到A List (嗯,至少在生成Java代码时)。请注意,列表类型是非类型化的,所以它只是一个普通的列表。

    如果使用具有相同变量名的多个参数,它们还将创建一个列表,例如:

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