我制作了一个小程序,它使用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;