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 это не дает результата через его интерфейс. Альтернативой такой реализации было бы использование интерфейсов.

Другие вопросы по тегам