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

标签 antlr grammar expression-trees interpreter

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

相关文章:

java - 线程异常 "main": –gui -tokens -tree

c# - Expression.Body.Expressions——如何使用它?

c# - 从 linq 表达式检索信息时是否使用反射?

c# - 使用表达式树通过代理现有实现来实现接口(interface)

language-agnostic - 证明类型声明语法的语法歧义

assembly - 汇编语言是如何工作的?

java - Antlr 是跟踪带有参数名称和值的 Java 方法调用并返回结果的正确工具吗?

java - EDIFACT 语法、解析器和库 (Java)

java - 使用Java在ANTLR4中绘制解析树

ruby - 以编程方式从字符串派生正则表达式