【问题标题】:Java DOM/AST - why is MethodInvocation an Expression?Java DOM/AST - 为什么 MethodInvocation 是一个表达式?
【发布时间】:2013-11-07 22:35:42
【问题描述】:

在 Java DOM/AST (http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-tree.html) 中,为什么 Initializer 包含块,为什么 MethodInvocation 是表达式而不是语句?

我的意思是,给定代码

int a = Integer.parseInt("1");

ASTView 插件只显示 INITIALIZER > MethodInvocation
有没有真正具有 Block 元素的 Initializer?

另外,如果我有这样的方法

public void thisMethod(){
    System.out.println();
}

MethodInvocation 被包装到一个 ExpressionStatement 中。但是为什么 MethodInvocation 不是一个声明呢?一个简单的 System.out.println() 就是一个有效的“声明”。 Java DOM/AST 意义上的表达式缺乏代表自身的能力。

也许我只是没有完全理解表达式和语句之间的分离。

【问题讨论】:

  • 这个“RTFM”对我没有帮助,抱歉。而且,它没有回答第一个问题
  • 嗯,你了解表达式和语句的概念吗?如果不是,那么询问特定实现的推理是没有意义的。关于你的第一个问题,“为什么初始化器包含块”——我不明白,如果不是块,初始化器还应该包含什么?
  • 您的链接有助于清除?不,它没有。表达式不能代表自己,语句可以。但是 MethodInvocation 可以代表它自己! “如果不是块”:单个表达式
  • 但是方法调用可以返回一个值,因此在允许表达式的地方是允许的。方法调用适合 both 表达式 and 语句。这就是表达式语句的重点,是的,链接解释了它。但你必须阅读的不仅仅是锚点上的几句话。

标签: java dom abstract-syntax-tree eclipse-jdt


【解决方案1】:

AST 树旨在反映编程语言的语法规则。

从语法上讲,初始化程序由一个块组成,其前面有一个可选的static 修饰符。因此,最自然的实现是拥有一个由Block 和修饰符(继承自BodyDeclaration)组成的Initializer 类。所以我不明白你为什么质疑它。

初始化器示例:

class Foo {
  static {
    System.out.println("static initializer");
    System.out.println("class Foo now initialized");
  }

  {
    System.out.println("instance initializer");
    System.out.println("an instance of Foo has been created");
  }
}

表达式和语句是两种不同的句法结构。有些地方只允许使用表达式或语句。但是有像方法调用这样的构造,它们是表达式语句,这意味着可以同时满足表达式和语句的角色。它们可以单独调用以产生副作用,也可以在需要值的地方调用。

但由于 Java 不允许多重继承,您无法创建继承自 ExpressionStatement 的 AST 类 ExpressionStatement。因此,您需要一个像 Eclipse AST 中的解决方案,其中 ExpressionStatement 从一个继承并包装另一个。决定继承哪一个以及封装哪一个很容易:您可以创建一个Statement 实现(子类),它会删除它已封装的Expression 的结果,但您不能创建一个提供结果的Expression 实现对于Statement,它的接口不提供任何结果。这种实现的替代方法是使用接口。

【讨论】:

  • 谢谢你的回答,我现在明白了为什么 MI 是一个表达式。但是 Block 看起来像这样 { ... } 。你见过像 int a = { ... } 这样的初始化吗?对于数组,有一个 ArrayInitializer。 Afaik 没有由多个语句组成的初始化程序(这是块的功能:对多个语句进行分组)
猜你喜欢
  • 2015-01-18
  • 2015-09-20
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多