Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释ANTLR树语法中数量可变的树节点_Antlr_Grammar_Expression Trees_Interpreter - Fatal编程技术网

解释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

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

使用
+=
操作符。要处理任意数量的参数(包括零),请执行以下操作:

procedureCallStatement
   :    ^(PROCEDURECALL procedureName=NAME argument+=expression*)
        {
            ...
        }
   ;
请参阅antlr网站上的

上述操作将把变量
参数
的类型从
typeof(expression)
更改为
列表
(至少在生成Java代码时是这样)。请注意,列表类型是非类型化的,因此它只是一个普通列表

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

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