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
-
TypeChecker()
-
-
call(Tree)
- サブクラスにおいて、 tree を型チェックするメソッドを定義します。.
-
checkArgsLength(Tree, int)
- ノードの引数の数をチェックします。.
-
checkVariableDeclaratorId(Type, Tree, Tree[])
- EPP プリプロセッサの checkVariableDeclaratorId に delegation される
メソッドです。.
-
resolveAmbiguousName(Tree)
- 型名かフィールドアクセスかわからない「あいまいな名前」の意味を解釈して、
あいまいさのない Tree に変換して返します。.
-
typeCheck1(Tree)
- 型チェックを一度だけ行ないます。.
-
typeCheckArgs(Tree)
- tree の args を全て型チェックし、結果を tree の配列にして返します。
-
typeCheckTree(Tree)
- tree を再帰的に型チェックし、型情報付き tree に変換して返します。.
-
typeNameCheckTree(Tree)
- TypeNameChecker.typeNameCheckTree に delegation されるメソッドです。.
-
unaryNumericPromotion(Tree)
- unary numeric promotion を行ないます。.
TypeChecker
public TypeChecker()
call
public abstract Tree call(Tree tree)
- サブクラスにおいて、 tree を型チェックするメソッドを定義します。.
このメソッドは、次の動作のいずれかを行なわなければなりません。
- tree を型チェックし、型情報付きの tree に変換して返す。
展開後の tree は、すべてのノードが型情報付きでなければならない。
root の tree の tag の値は、変換の前後で変わってはいけない。
- 必要に応じて subtree を型チェックし、 subtree の型情報を
利用して新たな tree を生成し、それを返す。
展開後の tree は、型情報のついていないノードであってもよい。
root の tree の tag の値は、変換の前後で変わらなければいけない。
標準の Java 言語のノードは、普通1番目の動作をします。
一方、 plug-in で導入された標準でないノードの TypeChecker は、
普通2番目の動作をしなければなりません。
- Overrides:
- call in class Macro
typeCheckTree
public static Tree typeCheckTree(Tree tree)
- tree を再帰的に型チェックし、型情報付き tree に変換して返します。.
もし、ノードがすでに型情報付きであれば、型チェックをせずに tree を
そのまま返します。
typeCheck1
public static Tree typeCheck1(Tree tree)
- 型チェックを一度だけ行ないます。.
typeCheckArgs
public static Tree[] typeCheckArgs(Tree tree)
- tree の args を全て型チェックし、結果を tree の配列にして返します。
typeNameCheckTree
public static Tree typeNameCheckTree(Tree tree)
- TypeNameChecker.typeNameCheckTree に delegation されるメソッドです。.
- See Also:
- typeNameCheckTree
checkArgsLength
public static void checkArgsLength(Tree tree,
int argc)
- ノードの引数の数をチェックします。.
tree の args の長さが、 argc でなければ、メソッド error を呼び出します。
checkVariableDeclaratorId
public static Tree checkVariableDeclaratorId(Type type,
Tree tree,
Tree declaredVars[])
- EPP プリプロセッサの checkVariableDeclaratorId に delegation される
メソッドです。.
- See Also:
- checkVariableDeclaratorId
resolveAmbiguousName
public static Tree resolveAmbiguousName(Tree tree)
- 型名かフィールドアクセスかわからない「あいまいな名前」の意味を解釈して、
あいまいさのない Tree に変換して返します。.
あいまいさの解決ルールについては、 JLS1.0 Section 6.5.2 を
参照して下さい。
このメソッドは、 (name ...) の形の Tree を受け取り、
id, name, fieldStatic, fieldExp のいずれかの種類の Tree に
変換して返します。
解釈不能の場合は null を返します。
unaryNumericPromotion
public static Tree unaryNumericPromotion(Tree tree)
- unary numeric promotion を行ないます。.
JLS1.0 5.6.1 を参照して下さい。
All Packages Class Hierarchy This Package Previous Next Index