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 の意味での式には、それ自体を表す機能がありません。

たぶん、私は Expression と Statement の分離の全体像を理解していませんでした。

4

1 に答える 1

1

AST ツリーは、プログラミング言語の構文規則を反映するように設計されています。

static構文的には、Initializer は、その前にオプションの修飾子を持つブロックで構成されます。したがって、 aと修飾子 ( から継承)Initializerで構成されるクラスを持つ最も自然な実装です。だから、なぜあなたがそれを疑問視するのか理解できません。BlockBodyDeclaration

初期化子の例:

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");
  }
}

式とステートメントは、2 つの異なる構文構造です。式またはステートメントのいずれかのみが許可される場所があります。ただし、式とステートメントの両方の役割を満たすことができることを意味する式ステートメントであるメソッド呼び出しのような構造があります。それらは、副作用のためにスタンドアロンで呼び出すことができますが、値が必要な場所でも呼び出すことができます。

しかし、Java では多重継承が許可されていないため、とのExpressionStatement両方から継承する AST クラスを作成することはできません。したがって、一方から継承して他方をラップするEclipse AST のようなソリューションが必要です。どちらを継承し、どちらをラップするかの決定は簡単です。ラップされた の結果をドロップする実装 (サブクラス) を作成できますが、インターフェイスを介して結果を提供しないに結果を提供する実装を作成することはできません。. このような実装に代わるものは、インターフェイスの使用です。ExpressionStatementExpressionStatementStatementExpressionExpressionStatement

于 2013-11-07T11:07:37.660 に答える