【问题标题】:How to find all sub nodes (children and childrens children) of an ASTNode如何查找 ASTNode 的所有子节点(子节点和子节点)
【发布时间】:2016-11-11 12:08:02
【问题描述】:

我试图通过获取 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

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

【问题讨论】:

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


    【解决方案1】:

    据我所见,您只会得到children 的第一个元素,我认为您需要将检查childrenelement 是否不为空的语句取出到单独的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; 
        }       
    }
    

    我还没有运行代码,但我认为问题在于您只能获得children 的第一个元素

    【讨论】:

    • 返回了相同的结果,但感谢您的帮助。 (((:
    【解决方案2】:

    已解决!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多