Java DOM/AST - почему MethodInvocation является выражением?
В 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
Может ли быть когда-либо инициализатор, который действительно имеет элемент блока?
Более того, если у меня есть такой метод
public void thisMethod(){
System.out.println();
}
MethodInvocation заключен в ExpressionStatement. Но почему MethodInvocation не является оператором? Просто простой System.out.println() является допустимым "Заявлением". Выражение в смысле Java DOM/AST лишено способности отстаивать себя.
Возможно, я просто не понял идею разделения между выражением и утверждением.
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 не допускает множественное наследование, вы не можете создать класс AST ExpressionStatement
наследуя от обоих Expression
а также Statement
, Таким образом, вам нужно решение, как в Eclipse AST, где ExpressionStatement
наследует от одного и оборачивает другого. Решение о том, какой из них наследовать, а какой обернуть, легко: вы можете создать Statement
реализация (подкласс), который отбрасывает результат Expression
он завернут, но вы не можете создать Expression
реализация, которая обеспечивает результат для Statement
это не дает результата через его интерфейс. Альтернативой такой реализации было бы использование интерфейсов.