如何查找ASTNode的所有子节点(子节点和子节点)

时间:2016-11-11 12:08:03

标签: java eclipse recursion eclipse-rcp abstract-syntax-tree

我试图通过获取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();并将他的孩子和孩子的孩子归还:

print screen

我被困在这一天,我需要递归的帮助

2 个答案:

答案 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);}