我正在開發一個程式,該程式使用來自 ANTLRs github 的 Java9 詞法分析器和語法來決議 Java 檔案。決議檔案時,我想將每個方法名稱以及在該方法中呼叫的所有方法的名稱保存在HashMap<String, Set<String>>.
我使用偵聽器模式,其中使用方法exitMethodDeclaration獲取方法名稱,使用exitMethodInvocation獲取方法呼叫。問題是這兩個方法是在決議樹的不同節點上呼叫的,因此它們采用不同的背景關系作為引數。因此,據我所知,我無法呼叫該方法來獲取exitMethodDeclaration 中的呼叫。我嘗試構建自己的遞回,這樣我就可以通過將 methodDeclarationContext 作為引數傳遞給exitMethodInvocation來解決型別問題。不過這會非常復雜,我想使用 ANTLRs 功能。
對于下面的代碼,每個方法的 hashSet 包含整個檔案的所有方法呼叫,而不僅僅是特定方法的呼叫。
private HashMap<String, HashSet<String>> methodCalls = new HashMap<>();
private HashSet<String> methodCallNames = new HashSet<>();
public void exitMethodDeclaration(Java9Parser.MethodDeclarationContext ctx) {
String methodName = ctx.methodHeader().methodDeclarator().identifier().getText();
methodCalls.put(methodName, methodCallNames);
}
public void exitMethodInvocation(Java9Parser.MethodInvocationContext ctx) {
try {
String m = ctx.methodName().identifier().getText();
methodCallNames.add(m);
} catch (Exception e) {
}
}
關于如何在同一方法中收集不同背景關系型別的節點、訪問偵聽器/訪問者方法中的子樹或其他想法的任何想法都非常受歡迎!
uj5u.com熱心網友回復:
您可以創建一個 ArrayList 堆疊。
每次,您都enterMethodDeclaration將一個新的 Empty ArrayList 推送到您的堆疊上。
每次enterMethodInvocation(或者exit...如果您愿意),您都可以將 methodName 添加到 stack.peek() 上的 ArrayList。
每當您使用exitMethodDeclartationstack.pop() 呼叫 ArrayList 時,它都會列出您在該方法呼叫中直接遇到的所有方法名稱。而且,方法名稱就在 Context 引數中exitMethodDeclaration
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350658.html
