All Packages Class Hierarchy This Package Previous Next Index
java.lang.Object
|
+----epp.Macro
|
+----epp.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 による変換を繰り返します。
public TypeChecker()
public abstract Tree call(Tree tree)
public static Tree typeCheckTree(Tree tree)
public static Tree typeCheck1(Tree tree)
public static Tree[] typeCheckArgs(Tree tree)
public static Tree typeNameCheckTree(Tree tree)
public static void checkArgsLength(Tree tree,
int argc)
public static Tree checkVariableDeclaratorId(Type type,
Tree tree,
Tree declaredVars[])
public static Tree resolveAmbiguousName(Tree tree)
public static Tree unaryNumericPromotion(Tree tree)
All Packages Class Hierarchy This Package Previous Next Index