有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JavaParser解析Java代码并查找父节点的语句类型

我制作了一个小程序,它使用JavaParser[1]解析Java代码并识别代码中出现的语句类型。这已成功实施。接下来我要做的是(有点棘手)找到if-statement的父节点,并检查父节点的第一条语句是否为while-loop。在确认上述语句为true之后,我还想确定这个if-statement是否是父节点的最后一个子节点

以下是上述描述的一个示例:

void example() {
    int x = 1;
    int y = 1;
    while (y < 3) {
        while (x < 4) {
            x++;                
        }
        if (y < 5) {
            y++;  
        }
    }
    x = 0;
}

我在解析上述代码时遇到的主要问题是,如何获得if (y < 5 )的父节点是一个while-loopwhile (y < 3)),其次,可能更棘手的是,如何确定这个示例的if-statement是我们跳回到父节点loop之前的最后一个语句。^ {< CD10> }中也有^ {CD9}},但是如果{{CD10}}的条件不正确,则可能跳过,所以我不想把它看作父节点的最后一个子节点。我认为我应该做的是检查最后一个“邻居”?我所说的邻居是指本例中第二个whileif之间的关系,即它们处于同一级别

到目前为止,我的想法得到了落实:

//find if the if-statement has a parent node
if (currIf.getParentNode().isPresent()) {
    //find if the parent Node is a While loop
    Optional<Node> parent = currIf.getParentNode();
    parent.get().getBegin();
}

通过上面的代码,我可以检查if-statement是否有父节点,并且我可以找到第一个while的位置,但是我不知道如何确认它是一个while statement并实现第二个描述的部分

更新:

我设法找到了如何检查父级是否为while-loop的方法,目前正在尝试找到一个解决方案,以确定if-statement是其级别(或层次结构,如果您愿意)的最后一个statement

Optional<WhileStmt> ifParent = currIf.findAncestor(WhileStmt.class);
//find if the if-statement has a parent node
if (ifParent.isPresent()) {
//find if the parent Node is a While loop
        Optional<Node> sameNode = ifParent.get().findFirst(Node.class, n -> n == currIf);
        if (sameNode.isPresent()) {
            System.out.println(sameNode);
        }
}

共 (1) 个答案

  1. # 1 楼答案

    如果我理解正确,你的更新可能会给你错误的结果。是的,如果WhileStmt是父级,那么您的解决方案会起作用,但它也可以让您的WhileStmt位于树的更高位置

    你为什么不能做下面这样的事情

     boolean parentIsWhileLoop = ifStmtNode.getParent() instanceof WhileStmt;
    

    要确定ifStmt是否是最后一个节点,可以执行以下操作:

     Node ifStmtParent = ifStmt.getParent();
     List<Node> ifStmtSibilings = ifStmtParent.getChildNodes();
     Node lastNode = ifStmtSiblings.get(ifStmtSiblings.size() - 1);
     boolean ifStmtIsLast = lastNode == ifStmt;