Creating a XML representation of the AST allows to analyze the AST with other tools.
Command line usage
$ run.sh ast-dump --help
Usage: ast-dump [options]
Options:
--encoding, -e
Encoding of the source file.
Default: UTF-8
--file
The file to dump
--format, -f
The output format.
Default: xml
--help, -h
Display usage.
--language, -l
Specify the language to use.
Default: java
--read-stdin, -i
Read source from standard input
Default: false
-P
Properties for the renderer.
Syntax: -Pkey=value
Default: {}
Available languages: apex ecmascript java jsp modelica plsql pom scala text vf vm wsdl xml xsl
Available formats: xml XML format with the same structure as the one used in XPath
+ Properties
+ singleQuoteAttributes Use single quotes to delimit attribute values (default true)
+ lineSeparator Line separator to use. The default is platform-specific. (default \n)
+ renderProlog True to output a prolog (default true)
+ renderCommonAttributes True to render attributes like BeginLine, EndLine, etc. (default false)
Example
$ cat Foo.java
public class Foo {
int a;
}
$ run.sh ast-dump --format xml --language java --file Foo.java > Foo.xml
-------------------------------------------------------------------------------
This command line utility is experimental. It might change at any time without
prior notice.
-------------------------------------------------------------------------------
$ cat Foo.xml
<?xml version='1.0' encoding='UTF-8' ?>
<CompilationUnit Image='' PackageName='' declarationsAreInDefaultPackage='true'>
<TypeDeclaration Image=''>
<ClassOrInterfaceDeclaration Abstract='false' BinaryName='Foo' Default='false' Final='false' Image='Foo' Interface='false' Local='false' Modifiers='1' Native='false' Nested='false' PackagePrivate='false' Private='false' Protected='false' Public='true' SimpleName='Foo' Static='false' Strictfp='false' Synchronized='false' Transient='false' TypeKind='CLASS' Volatile='false'>
<ClassOrInterfaceBody AnonymousInnerClass='false' EnumChild='false' Image=''>
<ClassOrInterfaceBodyDeclaration AnonymousInnerClass='false' EnumChild='false' Image='' Kind='FIELD'>
<FieldDeclaration Abstract='false' AnnotationMember='false' Array='false' ArrayDepth='0' Default='false' Final='false' Image='' InterfaceMember='false' Modifiers='0' Native='false' PackagePrivate='true' Private='false' Protected='false' Public='false' Static='false' Strictfp='false' Synchronized='false' SyntacticallyFinal='false' SyntacticallyPublic='false' SyntacticallyStatic='false' Transient='false' VariableName='a' Volatile='false'>
<Type Array='false' ArrayDepth='0' ArrayType='false' Image='' TypeImage='int'>
<PrimitiveType Array='false' ArrayDepth='0' Boolean='false' Image='int' />
</Type>
<VariableDeclarator Image='' Initializer='false' Name='a'>
<VariableDeclaratorId Array='false' ArrayDepth='0' ArrayType='false' ExceptionBlockParameter='false' ExplicitReceiverParameter='false' Field='true' Final='false' FormalParameter='false' Image='a' LambdaParameter='false' LocalVariable='false' ResourceDeclaration='false' TypeInferred='false' VariableName='a' />
</VariableDeclarator>
</FieldDeclaration>
</ClassOrInterfaceBodyDeclaration>
</ClassOrInterfaceBody>
</ClassOrInterfaceDeclaration>
</TypeDeclaration>
</CompilationUnit>
$ xmlstarlet select -t -c "//VariableDeclaratorId[@VariableName='a']" Foo.xml
<VariableDeclaratorId Array="false" ArrayDepth="0" ArrayType="false" ExceptionBlockParameter="false" ExplicitReceiverParameter="false" Field="true" Final="false" FormalParameter="false" Image="a" LambdaParameter="false" LocalVariable="false" ResourceDeclaration="false" TypeInferred="false" VariableName="a"/>
This example uses xmlstarlet to query the xml document for any variables/fields with the name “a”.
Programmatic usage
Just parse your source code to get the AST and pass it on to the XmlTreeRenderer
:
import java.io.IOException;
import java.io.StringReader;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.LanguageVersionHandler;
import net.sourceforge.pmd.lang.Parser;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.util.treeexport.XmlTreeRenderer;
public class TreeExport {
public static void main(String[] args) throws IOException {
LanguageVersionHandler java = LanguageRegistry.getLanguage("Java").getDefaultVersion().getLanguageVersionHandler();
Parser parser = java.getParser(java.getDefaultParserOptions());
Node root = parser.parse("foo", new StringReader("class Foo {}"));
new XmlTreeRenderer().renderSubtree(root, System.out);
}
}