Antlr v3:在解析树中打印给定节点的子树

时间:2013-07-22 18:20:08

标签: java antlr

我目前正在开发一个项目,而且我需要从给定的Java源代码中提取所有方法。我需要在 antlr v3 中实现它,但我来到了一个死胡同,因为api文档没有说明如何做到这一点。我也搜索了官方书籍,但仍然没有成功。有什么想法吗?

编辑: 我发现在 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 中实现此功能?

1 个答案:

答案 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列表