在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之间的分离。
答案 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不允许多重继承,因此无法创建继承自ExpressionStatement
和Expression
的AST类Statement
。因此,您需要一个像Eclipse AST中的解决方案,其中ExpressionStatement
从一个继承并包装另一个。决定继承哪一个以及哪一个要包装很容易:您可以创建一个Statement
实现(子类),它会删除它已包装的Expression
的结果,但您无法创建Expression
实现,它为Statement
提供结果,通过其接口不提供结果。这种实现的替代方案是使用接口。