views:

354

answers:

5

I'm looking for a java library that allows me to parse a java source file and that gives me an AST representation of the code.

Actually I'm only interested in the class and method definitions with their annotations. I don't need the AST of the method code.

I'm using this information for code generation. This is why I can't compile the source file first to get the information from the resulting class file. The code wouldn't compile without errors until I generate some additional classes.

+7  A: 

Java 6 supports this as a native part of the compiler and has standard APIs for it (javax.lang.model). You can read up on it here. It is designed specifically for your use-case (i.e. code generation from annotations and source).

Ramon
Yes, this looks good. Can you give me a hint which class is responsible for reading the source file?
tangens
You create a compiler "plugin" that you specify to javac on the command line. I think the interface you implement is `javax.annotation.processing.Processor`
Ramon
javax.lang.model is based on what is required for processing annotations, rather than being an abstract syntax tree for the whole language. So it has packages, class, methods, fields, parameters and variables, but not expressions or statements.
Pete Kirkham
What a shame. I really need to call the parser from within my generation framework.
tangens
What this allows you to do is to *build your code generation framework into javac itself*. @Pete: I am of course aware of this, question specifies that method bodies are *not* required.
Ramon
My code generation consists of different models (not only java files) that I parse individually and put them together in a big repository that is used by a freemarker template engine to generate lots of code. But yes, I'll think about it if I can put all of this into javac.
tangens
+2  A: 

I think NetBeans Javaparser might be something you'll be interested in.

luvieere
OK, now I've built a jar of this. How can I use it to create an AST from a java source file?
tangens
+2  A: 

You can try JavaCC with a grammar file for java language.

True Soft
+5  A: 

ANTLR (http://www.antlr.org/) has a parser for the Java language and it also suports ASTs.

try

options {
    output=AST;
}

in the *.g file (I haven't tried it personally);

peter.murray.rust
OK, I compiled the Java.g but I still don't know how to use it to get an AST. Do you have an example?
tangens
All I can offer at this stage (I'm still learning) is:`options { output=AST;}`in the *.g file
peter.murray.rust
A: 

I found the project javaparser, which parses a single java file and returns a well formed AST.

tangens