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