2013-07-22 66 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