1

Я новичок на языке программирования Java. Я хочу извлечь AST из исходного кода Java и распечатать AST для файла или стандартного вывода.Извлечение АСТ из JAVA и печать АСТ в файл

Я следовал этому руководству, чтобы узнать, как работать с АСТ. http://www.programcreek.com/2011/01/a-complete-standalone-example-of-astparser/

Так что в соответствии с этим код, который я имею до сих пор, выглядит следующим образом.

import java.util.HashSet; 
import java.util.Set; 

import org.eclipse.jdt.core.dom.AST; 
import org.eclipse.jdt.core.dom.ASTParser; 
import org.eclipse.jdt.core.dom.ASTVisitor; 
import org.eclipse.jdt.core.dom.CompilationUnit; 
import org.eclipse.jdt.core.dom.SimpleName; 
import org.eclipse.jdt.core.dom.VariableDeclarationFragment; 

public class Test { 
    public static void main(String args[]){ 
     ASTParser parser = ASTParser.newParser(AST.JLS3); 
     parser.setSource("public class A { int i = 9; \n int j; \n ArrayList<Integer> al = new ArrayList<Integer>();j=1000; }".toCharArray()); 
     //parser.setSource("/*abc*/".toCharArray()); 
     parser.setKind(ASTParser.K_COMPILATION_UNIT); 
     //ASTNode node = parser.createAST(null); 


     final CompilationUnit cu = (CompilationUnit) parser.createAST(null); 

    } 
} 

Я попытался следующий фрагмент кода, чтобы распечатать его на стандартный вывод, но он не дал мне результат я ожидал,

System.out.println(cu.getAST().toString()); 

Если кто-то может помочь мне напечатать AST из к файлу это было бы большой помощью.

Заранее спасибо.

+0

И какой результат вы ожидаете? – Andremoniy

+0

Я хотел распечатать весь АСТ, но результат был примерно таким: «[email protected]» – hbn1991

+0

Вам нужно вручную перейти через структуру объекта 'cu.getAST() и распечатать что ты хочешь. Никто (я надеюсь) не сделает это, а не сам. – Andremoniy

ответ

3

Адрес an example of transforming the AST to JSON. Вы можете изменить файл JSONStyleASTPrinter.java для создания XML вместо JSON и т.д.

на основе, например, из How To Train the JDT Dragon combined.pdf:

private void print(ASTNode node) { 
    List properties = node.structuralPropertiesForType(); 
    for (Iterator iterator = properties.iterator(); iterator.hasNext();) { 
     Object descriptor = iterator.next(); 
     if (descriptor instanceof SimplePropertyDescriptor) { 
      SimplePropertyDescriptor simple = (SimplePropertyDescriptor) descriptor; 
      Object value = node.getStructuralProperty(simple); 
      System.out.println(simple.getId() + " (" + value.toString() + ")"); 
     } else if (descriptor instanceof ChildPropertyDescriptor) { 
      ChildPropertyDescriptor child = (ChildPropertyDescriptor) descriptor; 
      ASTNode childNode = (ASTNode) node.getStructuralProperty(child); 
      if (childNode != null) { 
       System.out.println("Child (" + child.getId() + ") {"); 
       print(childNode); 
       System.out.println("}"); 
      } 
     } else { 
      ChildListPropertyDescriptor list = (ChildListPropertyDescriptor) descriptor; 
      System.out.println("List (" + list.getId() + "){"); 
      print((List) node.getStructuralProperty(list)); 
      System.out.println("}"); 
     } 
    } 
} 

private void print(List nodes) { 
    for (Iterator iterator = nodes.iterator(); iterator.hasNext();) { 
     print((ASTNode) iterator.next()); 
    } 
}