gpt4 book ai didi

java - 有没有一种方法可以获取方法中的所有语句,而无需手动遍历 AST

转载 作者:行者123 更新时间:2023-12-02 09:24:15 25 4
gpt4 key购买 nike

只是想知道是否有一种方法可以获取方法中的所有语句,而无需手动遍历方法的 AST。

到目前为止,我已经尝试通过手动遍历树来获取所有语句,这通常是一个坏主意,而且也很棘手。

public void visit(MethodDeclaration n, Object arg) {
int total = 0;
NodeList<Statement> statements = n.getBody().get().getStatements();
for(Node node: statements) {
//System.out.println(node.getClass());
if(node instanceof ExpressionStmt) {
if(node.toString().contains("=")) {
total++;
}
}
}
super.visit(n, arg);
System.out.println(total);
}

上面的代码可以工作,但它只获取树的同一深度级别的语句,而不是 AST 的所有深度级别的所有语句如果有人可以提供帮助,我们将不胜感激。

最佳答案

如果您想浏览 AST 所有深度级别的所有语句,您需要使用另一个访问者。

根据您的示例:

/**
* Visitor which counts expression statements
*/
GenericVisitorAdapter<ExpressionStmt, Integer> expressionsCountVisitor = new GenericVisitorAdapter<ExpressionStmt, Integer>() {

/**
* This is based on your example
*/
@Override
public ExpressionStmt visit(ExpressionStmt expressionStmt, Integer count) {
if(expressionStmt.toString().contains("=")) {
count++;
}
return super.visit(expressionStmt, count);
}

/**
* But better to check for AssignExpr instead of ".contains("=")"
*/
@Override
public ExpressionStmt visit(AssignExpr assignExpr, Integer count) {
// counts each "=" assign expression
count++;
return super.visit(assignExpr, count);
}

};

// And then use this visitor for each MethodDecalration

public void visit(MethodDeclaration methodDeclaration, Object arg) {
Integer total = 0;
// traverses down the hierarchy of this method declaration
methodDeclaration.accept(expressionsCountVisitor, total);
super.visit(methodDeclaration, arg);
System.out.println(total);
}

关于java - 有没有一种方法可以获取方法中的所有语句,而无需手动遍历 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58450833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com