我目前正在开发一个项目,并且我到了需要从给定的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?
你可以给你想要的输出的例子吗? –