我制作了一个使用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/