[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);
            }
        }
    }
}