gpt4 book ai didi

java - 用JavaParser解析Java代码,找到父节点的语句类型

转载 作者:行者123 更新时间:2023-12-01 18:13:44 29 4
gpt4 key购买 nike

我制作了一个使用JavaParser的小程序[1]解析 Java 代码并识别代码中出现的语句类型。这已成功实现。接下来我想做的(有点棘手)是找到 if-statement 的父节点。 ,并检查父节点的第一条语句是否为 while-loop 。确认上面的说法属实后,我也想查一下这个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-loop ( while (y < 3) ),其次,这可能更棘手,是如何识别 if-statement此示例的最后一条语句是我们跳回父级 loop 之前的最后一条语句。 。还有y++;里面if但如果 if 的条件可能会被跳过不正确,所以我不想将其视为父节点的最后一个子节点。我相信我应该做的是检查最后一个“邻居”?我所说的邻居是指第二个while之间的关系和 if在这个例子中,即它们处于同一级别。

到目前为止我的想法已实现:

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

最佳答案

如果我理解正确的话,您的更新可能会给出错误的结果。是的,如果 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;

关于java - 用JavaParser解析Java代码,找到父节点的语句类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60414538/

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