All Packages  Class Hierarchy  This Package  Previous  Next  Index

Class epp.TypeChecker

java.lang.Object
   |
   +----epp.Macro
           |
           +----epp.TypeChecker

public abstract class TypeChecker
extends Macro
クラス TypeChecker は、すべての TypeChecker オブジェクトのクラスの スーパークラスです。.

型チェックパスにおいて、抽象構文木の各ノードは、 対応する TypeChecker オブジェクトのメソッド call によって 型チェックされ、型情報付き抽象構文木に変換されます。 型情報付きの Tree は、メソッド type によって型情報を取り出すことができます。

型チェックパスでは、単なる型チェックだけでなく、「型情報を利用したマクロ展開」 も行なうことができます。 plug-in programmer は、標準の Java にないノードを導入し、 それに対応する TypeChecker オブジェクトを定義することができます。 この場合、 TypeChecker オブジェクトは、必要に応じて subtree を型チェックし、 その型情報を利用してマクロ展開し、結果を返します。

plug-in programmer が定義した TypeChecker オブジェクトは、 Epp の defineTypeChecker メソッドを 使って、 TypeChecker.macroTable に登録しなければなりません。

TypeChecker オブジェクトは、 decorator pattern によって 差分的に拡張することができます。 それには、 Epp の extendTypeChecker メソッドを使います。 decorator からは、インスタンス変数 orig を通して、 オリジナルの TypeChecker オブジェクトを呼び出すことができます。 extendTypeChecker によって拡張されていない時は、変数 orig の値は null です。

Tree の再帰的な型チェックは、メソッド typeCheckTree によって行なわれます。 メソッド typeCheckTree の動作は、厳密には次のように定義されます。

      Symbol lastTag = null;
      while(true) {
	if (tree.isTyped()) break;
	Symbol tag = tree.tag();
	if (tag == lastTag) break;
	lastTag = tag;
	TypeChecker func = (TypeChecker)typeCheckerTable.get(tag);
	if (func != null) {
	  tree = func.call(tree);
	} else {
	  throw error("TypeCheker for "+ tag+ " is not defined.");
	}
      }
      return tree;
すなわち、 tree の tag に対応する TypeChecker オブジェクトの メソッド call を呼び出し、返値の tag と、呼び出す前の tag が 等しければ、ループを抜けて返値を返します。そうでなければ、 tag が変わらなくなるまで TypeChecker による変換を繰り返します。

See Also:
TypeCheck, initTypeCheckerTable, defineTypeChecker, extendTypeChecker, Macro, TypeNameChecker

Constructor Index

 o TypeChecker()

Method Index

 o call(Tree)
サブクラスにおいて、 tree を型チェックするメソッドを定義します。.
 o checkArgsLength(Tree, int)
ノードの引数の数をチェックします。.
 o checkVariableDeclaratorId(Type, Tree, Tree[])
EPP プリプロセッサの checkVariableDeclaratorId に delegation される メソッドです。.
 o resolveAmbiguousName(Tree)
型名かフィールドアクセスかわからない「あいまいな名前」の意味を解釈して、 あいまいさのない Tree に変換して返します。.
 o typeCheck1(Tree)
型チェックを一度だけ行ないます。.
 o typeCheckArgs(Tree)
tree の args を全て型チェックし、結果を tree の配列にして返します。
 o typeCheckTree(Tree)
tree を再帰的に型チェックし、型情報付き tree に変換して返します。.
 o typeNameCheckTree(Tree)
TypeNameChecker.typeNameCheckTree に delegation されるメソッドです。.
 o unaryNumericPromotion(Tree)
unary numeric promotion を行ないます。.

Constructors

 o TypeChecker
 public TypeChecker()

Methods

 o call
 public abstract Tree call(Tree tree)
サブクラスにおいて、 tree を型チェックするメソッドを定義します。. このメソッドは、次の動作のいずれかを行なわなければなりません。 標準の Java 言語のノードは、普通1番目の動作をします。 一方、 plug-in で導入された標準でないノードの TypeChecker は、 普通2番目の動作をしなければなりません。

Overrides:
call in class Macro
 o typeCheckTree
 public static Tree typeCheckTree(Tree tree)
tree を再帰的に型チェックし、型情報付き tree に変換して返します。. もし、ノードがすでに型情報付きであれば、型チェックをせずに tree を そのまま返します。

 o typeCheck1
 public static Tree typeCheck1(Tree tree)
型チェックを一度だけ行ないます。.

 o typeCheckArgs
 public static Tree[] typeCheckArgs(Tree tree)
tree の args を全て型チェックし、結果を tree の配列にして返します。

 o typeNameCheckTree
 public static Tree typeNameCheckTree(Tree tree)
TypeNameChecker.typeNameCheckTree に delegation されるメソッドです。.

See Also:
typeNameCheckTree
 o checkArgsLength
 public static void checkArgsLength(Tree tree,
                                    int argc)
ノードの引数の数をチェックします。. tree の args の長さが、 argc でなければ、メソッド error を呼び出します。

 o checkVariableDeclaratorId
 public static Tree checkVariableDeclaratorId(Type type,
                                              Tree tree,
                                              Tree declaredVars[])
EPP プリプロセッサの checkVariableDeclaratorId に delegation される メソッドです。.

See Also:
checkVariableDeclaratorId
 o resolveAmbiguousName
 public static Tree resolveAmbiguousName(Tree tree)
型名かフィールドアクセスかわからない「あいまいな名前」の意味を解釈して、 あいまいさのない Tree に変換して返します。. あいまいさの解決ルールについては、 JLS1.0 Section 6.5.2 を 参照して下さい。 このメソッドは、 (name ...) の形の Tree を受け取り、 id, name, fieldStatic, fieldExp のいずれかの種類の Tree に 変換して返します。 解釈不能の場合は null を返します。

 o unaryNumericPromotion
 public static Tree unaryNumericPromotion(Tree tree)
unary numeric promotion を行ないます。. JLS1.0 5.6.1 を参照して下さい。


All Packages  Class Hierarchy  This Package  Previous  Next  Index