0

私は現在プロジェクトに取り組んでおり、特定の 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);
    }
}

whereMethod 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でどのように実装できますか?

4

1 に答える 1