0

在 Java DOM/AST ( http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-tree.html ) 为什么初始化程序包含块,为什么 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 意义上的表达式缺乏代表自身的能力。

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

4

1 回答 1

1

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

从语法上讲,Initializer 由一个前面带有可选static修饰符的块组成。所以这是最自然的实现,它有一个Initializer由 aBlock和修饰符组成的类(继承自BodyDeclaration)。所以我不明白你为什么质疑它。

初始化器示例:

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继承自Expression和的 AST 类Statement。所以你需要一个像 Eclipse AST 中的解决方案,ExpressionStatement从一个继承并包装另一个。决定继承哪一个以及包装哪一个很容易:您可以创建一个Statement实现(子类),该实现(子类)会删除Expression它已包装的结果,但您不能创建一个为通过其接口不Expression提供结果的 a提供结果的实现Statement. 这种实现的替代方案是使用接口。

于 2013-11-07T11:07:37.660 回答