All Packages Class Hierarchy This Package Previous Next Index
java.lang.Object | +----epp.Tree
例えば、 if 文は EPP の内部では
(if
Tree は immutable object です。 tag や args を変更することはできません。 (プログラマーは、メソッド呼び出し tree.args() が返す Tree の配列の中身を うっかり書き換えないように注意する必要があります。 万一書き換えてしまうと、非常に見つけにくいバグの原因になります。)
Tree のサブクラスに、 Identifier と LiteralTree があります。 すべての抽象構文木のノードは、 Tree, Identifier, LiteralTree の3つのいずれかで 表現されます。 plug-in は、構文を拡張して新たな種類のノードを導入できますが、 その場合でもノードを3つのクラスのいずれかで表現しなければなりません。
クラス Tree のインスタンス tree に対して tree.print() という メソッド呼び出しをすることで、抽象構文木をS式の形で 出力することができます。 例えば、
if (x == 0) System.out.println("Hello!");というプログラムを構文解析した結果の抽象構文木は、
(if (== (id x) (literalTree int "0")) (expressionStatement (invokeLong (name (id System) (id out)) (id println) (argumentList (literalTree string "Hello!")))) (emptyStatement))と print されます。
LiteralTree と Identifier に関しては、 tree.args() は 常に長さ0の配列を返します。 このような仕掛けになっているため、 tree に対する再帰的処理は 非常に簡単になります。例えば、 tree の中に if 文が現れる数を数える メソッドは、
int countIf(Tree tree){ int c = 0; if (tree.tag() == :if) c++; Tree[] args = tree.args(); for (int i = 0; i < args.length; i++){ c += countIf(args[i]); } return c; }ですむことになります。
クラス Tree は、 tag と args の他にも行番号情報などの付加情報を 持っています。 これらの情報を保存したまま、 args の値だけを変更した tree を 生成したい時には、 "modifyArgs" というメソッドを使います。
Tree[] newArgs = {...}; Tree newTree = tree.modifyArgs(newArgs);これは、次のプログラムとほとんど同じですが、 tree が持っている 行番号などの情報が newTree にもコピーされる点が異なります。
Tree[] newArgs = {...}; Tree newTree = new Tree(tree.tag(), newArgs);
大きい Tree を生成するコードを簡単に書くために、 BackQuote plug-in が提供されています。 詳しくは、../BackQuote.html を見て下さい。 tree.print() あるいは epp の -tree オプションによって出力された抽象構文木は、 カットアンドペーストして、 BackQuote マクロにそのまま使うことができます。
Tree の可変長配列を使うことがよくあるので、クラス TreeVec が用意されています。 キャストが不要なので java.lang.Vector より便利です。
public Tree(Symbol tag, Tree args[])Tree
public Tree(Symbol tag, TreeVec args)Tree
public Tree(Symbol t)Tree
public Tree(Symbol t, Tree a1)Tree
public Tree(Symbol t, Tree a1, Tree a2)Tree
public Tree(Symbol t, Tree a1, Tree a2, Tree a3)Tree
public Tree(Symbol t, Tree a1, Tree a2, Tree a3, Tree a4)Tree
public Tree(Symbol t, Tree a1, Tree a2, Tree a3, Tree a4, Tree a5)Tree
public Tree(Symbol t, Tree a1, Tree a2, Tree a3, Tree a4, Tree a5, Tree a6)Tree
public Tree(Symbol t, Tree a1, Tree a2, Tree a3, Tree a4, Tree a5, Tree a6, Tree a7)
public static void main(String argv[])
public Symbol tag()
public Tree[] args()
public int lineNumber()
public int beginningPoint()
public int endPoint()
public Type type()
public Object property(Symbol key)
public Symbol idName()
public LiteralToken literalToken()
public Tree modifyArgs(Tree args[])
public boolean isTyped()
public Tree modifyTypeAndArgs(Type type, Tree args[])
public Tree resetType()
public Tree modifyProperty(Symbol key, Object val)
public Tree modifyLineNumber(int x)modifyBeginningPoint
public Tree modifyBeginningPoint(int x)modifyEndPoint
public Tree modifyEndPoint(int x)nameEqual
public static boolean nameEqual(Tree name1, Tree name2)
public String nameToString()
public Tree print()
epp コマンドの起動時のオプションに応じて、 型情報、行番号情報も同時に出力されます。
これらの情報がついていない場合は、 出力結果をカットアンドペーストして、そのまま BackQuote macro の一部として 使うことができます。
public Tree print(PrintWriter out)print
public void print(PrintWriter out, String indent)printProp
public void printProp(PrintWriter out)toString
public String toString()
public static String quoteString(String in)
Examples: "foo" -> "¥"foo¥"" "¥n" -> "¥"¥¥n¥"" "¥"" => "¥"¥¥¥"¥""
public static Tree stringToNameTree(String str)
All Packages Class Hierarchy This Package Previous Next Index