2013-07-22 97 views
0

我目前正在開發一個項目,並且我到了需要從給定的Java源代碼中提取所有方法的地步。我需要在antlr v3中實現它,但由於api文檔沒有闡明如何做到這一點,所以我陷入了死衚衕。我也搜遍了官方書,但仍然沒有成功。有任何想法嗎?Antlr v3:在解析樹中打印給定節點的子樹

編輯: 我發現,在ANTLR V4,因爲這是可以做到:

import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 
import java.io.*; 


public class Main { 
    public static void main(String[] args) throws IOException { 
     ANTLRInputStream input = new ANTLRInputStream(System.in); 
     JavaLexer lexer = new JavaLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     JavaParser parser = new JavaParser(tokens); 

     ParseTree tree = parser.compilationUnit(); 
     ParseTreeWalker walker = new ParseTreeWalker(); 
     MethodPrinter printer = new MethodPrinter(); 
     walker.walk(printer, tree); 
     for (String method : printer.methods) 
      System.out.println(method); 
    } 
} 

其中Method printer作爲實施:

import org.antlr.v4.runtime.tree.TerminalNode; 
import java.util.ArrayList; 

public class MethodPrinter extends JavaBaseListener { 
    boolean inMethod; 
    String currentMethod; 
    ArrayList<String> methods; 

    public MethodPrinter() { 
     inMethod = false; 
     methods = new ArrayList<String>(); 
    } 

    public void enterMethodDeclaration(JavaParser.MethodDeclarationContext ctx) { 
     inMethod = true; 
     currentMethod = ""; 
    } 

    public void exitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) { 
     inMethod = false; 
     methods.add(currentMethod); 
    } 

    public void visitTerminal(TerminalNode node) { 
     if (inMethod) 
      currentMethod += node.getText() + " "; 
    } 
} 

這可怎麼在實施antlr v3

+0

你可以給你想要的輸出的例子嗎? –

回答

0

Java源代碼必須封裝在一個類中。
您可以使用反射來獲取給定類中的所有方法。

... 
Class cl = Class.forName("com.example.test.MyClass"); 
// or cl = someObject.getClass(); 
List<Method> methods = cl.getDeclaredMethods(cl); 
methods.addAll(cl.getMethods()); 
... 

那麼你可以使用它正常的Java列表

+0

謝謝,但情況如此。我忘了提及,現在我只需要方法,但後來我可能需要代碼的任何組成部分(例如表達式,賦值,字段聲明等)。如果我設法做到這一點,我的生活會更容易。 – svs

+0

我不知道代碼本身,因爲它可能被編譯和優化,但關於字段,你確實有'getFields()'和'getDeclaredFields()' – ilomambo