Java DOM / AST - 为什么MethodInvocation是一个表达式?

时间:2013-11-06 15:47:11

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

在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包含一个Block,为什么MethodInvocation是一个Expression而不是一个Statement?

我的意思是,给定代码

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

ASTView插件只显示INITIALIZER>的MethodInvocation
可以有一个真正有块元素的初始化器吗?

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

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

MethodInvocation包装在ExpressionStatement中。但是为什么MethodInvocation不是一个Statement?只是一个简单的System.out.println()是一个有效的“语句”。 Java DOM / AST意义上的表达式缺乏代表自己的能力。

也许我只是没有完全了解Expression和Statement之间的分离。

1 个答案:

答案 0 :(得分:1)

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

从语法上讲,初始化程序包含一个带有可选static修饰符的块。因此,它是Initializer类的最自然的实现,包含Block和修饰符(继承自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不允许多重继承,因此无法创建继承自ExpressionStatementExpression的AST类Statement。因此,您需要一个像Eclipse AST中的解决方案,其中ExpressionStatement从一个继承并包装另一个。决定继承哪一个以及哪一个要包装很容易:您可以创建一个Statement实现(子类),它会删除它已包装的Expression的结果,但您无法创建Expression实现,它为Statement提供结果,通过其接口不提供结果。这种实现的替代方案是使用接口。