[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12711] Re: 議事録「 Java 言語仕様第3版」を読む会(第 4 回)



高橋(徹)です。

   "Yasuhiro Endoh <quiver2k@xxxxxxxxx>"さんは書きました:
> 7.6
> 
> TypeDeclarationは、「;」だけで成立するのか。

Java SE 6 (Mustang)から追加されたJSR-199 Java Compiler APIと、
The Tree APIを使ってコンパイラの構文解析結果を調べてみました。
(ソースファイルは添付)

;は、コンパイル単位(CompilationUnitTree)のgetTypeDecls()で取得
される型宣言のリストの1つに含まれています。
ということで、型宣言として;だけを認識しているようですね。

備考)添付のソースファイルのコンパイルと実行方法
コンパイル・実行には、JDKのtools.jarを必要とします。

○コンパイル
C:\work> javac -cp C:\jdk1.6.0\lib\tools.jar ParseTypes.java

○実行
C:\work> java -cp C:\jdk1.6.0\lib\tools.jar;. ParseTypes Foo.java
Tree for Foo.java
         TypeDeclaration for class com.sun.tools.javac.tree.JCTree$JCClassDecl :
public class Foo {
}
         TypeDeclaration for class com.sun.tools.javac.tree.JCTree$JCSkip : ;


--
TAKAHASHI,Toru
torutk@xxxxxxxxxxxx

import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.Tree;
import com.sun.source.util.JavacTask;
import java.io.IOException;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class ParseTypes {
    public static final void main(final String[] args) throws IOException {
        JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
        if (javac == null) {
            System.err.println("Java Compiler is not available.");
            return;
        }
        
        StandardJavaFileManager fileManager = javac.getStandardFileManager(
            null, null, null
        );

        if (args.length < 1) {
            System.err.println("Usage: java ParseTypes <source file>");
            return;
        }

        CompilationTask task = javac.getTask(
            null, fileManager, null, null, null,
            fileManager.getJavaFileObjects(args[0])
        );

        JavacTask javacTask = (JavacTask)task;
        for (CompilationUnitTree unitTree : javacTask.parse()) {
            System.out.println("Tree for " + unitTree.getSourceFile());
            for (Tree root : unitTree.getTypeDecls()) {
                System.out.println("\t TypeDeclaration for " + root.getClass() + " : " + root);
            }
        }
    }
}