我试图通过获取ExpressionStatements并返回其子节点及其子节点来获取AST节点的所有子节点,但算法卡在第一个ExpStat中,我无法找到原因。
首先我创建了一个访问者函数来查找我班级的所有ExpressionStatements,然后我调用该函数来找到你的孩子
private void analyseClass(ICompilationUnit classe) throws JavaModelException {
// ICompilationUnit unit == class
// now create the AST for the ICompilationUnits
CompilationUnit parse = parse(classe);
// Calls the method for visit node in AST e return your information
ExpressionStatementVisitor visitor = new ExpressionStatementVisitor();
parse.accept(visitor);
// Write in the screen: ExpressionStatement and your type next
for (ExpressionStatement method : visitor.getExpression()) {
//String t = null;
// 32 -> METHOD_INVOCATION type
if (method.getExpression().getNodeType() == 32) {
getChildren(method);
results.append("\n\n");
}
// 48 -> SUPER_METHOD_INVOCATION type
else if (method.getExpression().getNodeType() == 48) {
// results.append("\n SuperMethodInvocation: " + t);
//getChildren(method);
//results.append("\n\n");
} else {
//getChildren(method);
//results.append("\n\n");
}
}
}
以递归方式查找子项的函数:
public static void getChildren(ASTNode node) {
if (node != null) {
List<ASTNode> children = new ArrayList<ASTNode>();
List list = node.structuralPropertiesForType();
for (int i = 0; i < list.size(); i++) {
Object child = node.getStructuralProperty((StructuralPropertyDescriptor) list.get(i));
if (child instanceof ASTNode) {
children.add((ASTNode) child);
}
if (children.get(0) != null) {
String c = children.toString();
results.append("Children Node: " + c + "\n");
getChildren(children.get(0));
}
}
} else {
return;
}
}
让我们在课堂上说:
a.getTheDataA().getTheDataB().getTheDataC().getTheData();
b.getTheDataA().getTheDataB().getTheDataC().getTheData();
c.getTheE(a,b).getTheF(getTheDataB).getTheH();
getChildren函数只读取a.getTheDataA()。getTheDataB()。getTheDataC()。getTheData();并将他的孩子和孩子的孩子归还:
我被困在这一天,我需要递归的帮助
答案 0 :(得分:0)
从我看到的,你只得到children
的第一个元素,我认为你需要取出语句检查以查看children
元素是否为空而不是{{1}循环,并检查其中的每个元素。
类似的东西:
for
我没有运行代码,但我认为问题是你只获得public static void getChildren(ASTNode node) {
if (node != null) {
List<ASTNode> children = new ArrayList<ASTNode>();
List list = node.structuralPropertiesForType();
for (int i = 0; i < list.size(); i++) {
Object child = node.getStructuralProperty((StructuralPropertyDescriptor) list.get(i));
if (child instanceof ASTNode) {
children.add((ASTNode) child);
}
}
for(ASTNode node : children){
if (node != null) {
String c = children.toString();
results.append("Children Node: " + c + "\n");
getChildren(node);
}
}
}else {
return;
}
}
的第一个元素
答案 1 :(得分:0)
解决!
public static int getChildren(ASTNode node,int n) {
int cont = n;
String compara = "[]";
List<ASTNode> children = new ArrayList<ASTNode>();
@SuppressWarnings("rawtypes")
List list = node.structuralPropertiesForType();
for (int i = 0; i < list.size(); i++) {
Object child = node.getStructuralProperty((StructuralPropertyDescriptor)list.get(i));
if (child instanceof ASTNode) {
children.add((ASTNode) child);
}
}
String teste = children.toString();
// Se a string do filho for igual a [] -> CHEGOU AO FIM
//e retorna resultado do contador para analyseClass
if (teste.equals(compara)) {
results.append("NMCS = "+cont+"\n");
return cont;
}
// Aumenta o contador se o nó filho for MethodInvocation ou
//SuperMethodInvocation
if (node.getNodeType() == 32) {
cont++;
} else if (node.getNodeType() == 48) {
cont++;
}
// Recursão para encontrar próximo nó (filho do filho)
return getChildren(children.get(0),cont);}